From 59b338994d6d3b67e5477679341ab3aad347c9fb Mon Sep 17 00:00:00 2001 From: Dmitry Agapov Date: Wed, 16 Sep 2020 17:13:37 +0300 Subject: [PATCH] delete task data after delete task (#2179) * delete task data after delete task * fix pylint * fix pyflakes * fix flake8 * add test test_api_v1_tasks_delete_task_data_after_delete_task * update change log * pyflake fix --- CHANGELOG.md | 2 +- cvat/apps/engine/apps.py | 11 +++++------ cvat/apps/engine/signals.py | 24 ++++++++++++++++++++++-- cvat/apps/engine/tests/_test_rest_api.py | 11 +++++++++++ 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec03b776..d5d15921 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,7 +32,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed task creation from PDF () - Fixed CVAT format import for frame stepped tasks () - Fixed unnecessary pyhash dependency () - +- Fixed Data is not getting cleared, even after deleting the Task from Django Admin App() ### Security - diff --git a/cvat/apps/engine/apps.py b/cvat/apps/engine/apps.py index 684345bc..4a9e848f 100644 --- a/cvat/apps/engine/apps.py +++ b/cvat/apps/engine/apps.py @@ -1,16 +1,15 @@ - # Copyright (C) 2018 Intel Corporation # # SPDX-License-Identifier: MIT from django.apps import AppConfig + class EngineConfig(AppConfig): name = 'cvat.apps.engine' def ready(self): - from django.db.models.signals import post_save - from .signals import update_task_status - - post_save.connect(update_task_status, sender='engine.Job', - dispatch_uid="update_task_status") + # Required to define signals in application + import cvat.apps.engine.signals + # Required in order to silent "unused-import" in pyflake + assert cvat.apps.engine.signals diff --git a/cvat/apps/engine/signals.py b/cvat/apps/engine/signals.py index f39a96d8..7850596e 100644 --- a/cvat/apps/engine/signals.py +++ b/cvat/apps/engine/signals.py @@ -1,14 +1,25 @@ # Copyright (C) 2019 Intel Corporation # # SPDX-License-Identifier: MIT +import shutil -from .models import Job, StatusChoice +from django.db.models.signals import post_delete, post_save +from django.dispatch import receiver +from .models import ( + Data, + Job, + StatusChoice, + Task, +) + + +@receiver(post_save, sender=Job, dispatch_uid="update_task_status") def update_task_status(instance, **kwargs): db_task = instance.segment.task db_jobs = list(Job.objects.filter(segment__task_id=db_task.id)) status = StatusChoice.COMPLETED - if list(filter(lambda x: x.status == StatusChoice.ANNOTATION, db_jobs)): + if list(filter(lambda x: x.status == StatusChoice.ANNOTATION, db_jobs)): status = StatusChoice.ANNOTATION elif list(filter(lambda x: x.status == StatusChoice.VALIDATION, db_jobs)): status = StatusChoice.VALIDATION @@ -17,3 +28,12 @@ def update_task_status(instance, **kwargs): db_task.status = status db_task.save() + +@receiver(post_delete, sender=Task, dispatch_uid="delete_task_files_on_delete_task") +def delete_task_files_on_delete_task(instance, **kwargs): + shutil.rmtree(instance.get_task_dirname(), ignore_errors=True) + + +@receiver(post_delete, sender=Data, dispatch_uid="delete_data_files_on_delete_data") +def delete_data_files_on_delete_data(instance, **kwargs): + shutil.rmtree(instance.get_data_dirname(), ignore_errors=True) diff --git a/cvat/apps/engine/tests/_test_rest_api.py b/cvat/apps/engine/tests/_test_rest_api.py index 374a4cd2..ad9475d5 100644 --- a/cvat/apps/engine/tests/_test_rest_api.py +++ b/cvat/apps/engine/tests/_test_rest_api.py @@ -1200,7 +1200,18 @@ class TaskDeleteAPITestCase(APITestCase): def test_api_v1_tasks_id_no_auth(self): self._check_api_v1_tasks_id(None) + def test_api_v1_tasks_delete_task_data_after_delete_task(self): + for task in self.tasks: + task_dir = task.get_task_dirname() + self.assertTrue(os.path.exists(task_dir)) + self._check_api_v1_tasks_id(self.admin) + for task in self.tasks: + task_dir = task.get_task_dirname() + self.assertFalse(os.path.exists(task_dir)) + + class TaskUpdateAPITestCase(APITestCase): + def setUp(self): self.client = APIClient()