From 3e1ccc8602766ec42659360b938781728239ad0e Mon Sep 17 00:00:00 2001 From: Nikita Manovich Date: Thu, 1 Dec 2022 22:49:37 +0200 Subject: [PATCH] Fix exception when run export for an empty task (#5396) Fix https://github.com/opencv/cvat/issues/5245 The PR contains a simple fix. Just return BAD REQUEST if somebody tries to export a task without data. It doesn't make sense. But a more complex fix will require changing a massive amount of code. It doesn't make any sense to support such a weird scenario. --- CHANGELOG.md | 1 + cvat/apps/engine/views.py | 39 ++++++++++++++++++++++++--------------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 032d9700..c73067f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -84,6 +84,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 () - Fixed FBRS serverless function runtime error on images with alpha channel () - Attaching manifest with custom name () - Uploading non-zip annotaion files () diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index 0a286746..0d2f3673 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -1061,6 +1061,7 @@ class TaskViewSet(viewsets.GenericViewSet, mixins.ListModelMixin, ), 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 @@ class TaskViewSet(viewsets.GenericViewSet, mixins.ListModelMixin, 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 @@ class TaskViewSet(viewsets.GenericViewSet, mixins.ListModelMixin, '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 @@ class TaskViewSet(viewsets.GenericViewSet, mixins.ListModelMixin, 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(