diff --git a/CHANGELOG.md b/CHANGELOG.md index f06d8de41ae..bd1706b9bda 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 () - 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 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(