From f16c66032ccd7aad3e670e8114840f390bc2d981 Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Wed, 30 Nov 2022 22:26:03 +0200 Subject: [PATCH 1/2] Fix exception when run export for an empty task. The PR contains simple fix. Just return BAD REQUEST if somebody tries to export a task without data. It doesn't make sense. But more complex fix will require to change to huge amount of code. In any case it doesn't make any sense to support such weird scenario. --- cvat/apps/engine/views.py | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index 0a286746366..0d2f3673687 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -1061,6 +1061,7 @@ def append_data_chunk(self, request, pk, file_id): ), description='Download of file started'), '201': OpenApiResponse(description='Annotations file is ready to download'), '202': OpenApiResponse(description='Dump of annotations has been started'), + '400': OpenApiResponse(description='Exporting without data is not allowed'), '405': OpenApiResponse(description='Format is not available'), }) @extend_schema(methods=['PUT'], summary='Method allows to upload task annotations', @@ -1120,14 +1121,18 @@ def append_data_chunk(self, request, pk, file_id): def annotations(self, request, pk): self._object = self.get_object() # force to call check_object_permissions if request.method == 'GET': - return self.export_annotations( - request=request, - pk=pk, - db_obj=self._object, - export_func=_export_annotations, - callback=dm.views.export_task_annotations, - get_data=dm.task.get_task_data, - ) + if self._object.data: + return self.export_annotations( + request=request, + pk=pk, + db_obj=self._object, + export_func=_export_annotations, + callback=dm.views.export_task_annotations, + get_data=dm.task.get_task_data, + ) + else: + return Response(data="Exporting a task without data is not allowed", + status=status.HTTP_400_BAD_REQUEST) elif request.method == 'POST' or request.method == 'OPTIONS': return self.import_annotations( request=request, @@ -1290,6 +1295,7 @@ def metadata(self, request, pk): '200': OpenApiResponse(OpenApiTypes.BINARY, description='Download of file started'), '201': OpenApiResponse(description='Output file is ready for downloading'), '202': OpenApiResponse(description='Exporting has been started'), + '400': OpenApiResponse(description='Exporting without data is not allowed'), '405': OpenApiResponse(description='Format is not available'), }) @action(detail=True, methods=['GET'], serializer_class=None, @@ -1297,13 +1303,16 @@ def metadata(self, request, pk): def dataset_export(self, request, pk): self._object = self.get_object() # force to call check_object_permissions - return self.export_annotations( - request=request, - pk=pk, - db_obj=self._object, - export_func=_export_annotations, - callback=dm.views.export_task_as_dataset - ) + if self._object.data: + return self.export_annotations( + request=request, + pk=pk, + db_obj=self._object, + export_func=_export_annotations, + callback=dm.views.export_task_as_dataset) + else: + return Response(data="Exporting a task without data is not allowed", + status=status.HTTP_400_BAD_REQUEST) @extend_schema(tags=['jobs']) @extend_schema_view( From bee7c96c1d08686eaac51e1ef12f0b42daf845df Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Wed, 30 Nov 2022 22:33:33 +0200 Subject: [PATCH 2/2] Updated CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54de3684ba6..712bd5c6c71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -82,6 +82,7 @@ non-ascii paths while adding files from "Connected file share" (issue #4428) - Visibility and ignored information fail to be loaded (MOT dataset format) () - Added force logout on CVAT app start if token is missing () - Missed token with using social account authentication () +- An exception when run export for an empty task () ### Security - TDB