diff --git a/apiserver/.env.example b/apiserver/.env.example index 38944f79c..7af2f0056 100644 --- a/apiserver/.env.example +++ b/apiserver/.env.example @@ -50,3 +50,6 @@ GUNICORN_WORKERS=2 ADMIN_BASE_URL= SPACE_BASE_URL= APP_BASE_URL= + +# Hard delete files after days +HARD_DELETE_AFTER_DAYS= \ No newline at end of file diff --git a/apiserver/plane/app/views/issue/archive.py b/apiserver/plane/app/views/issue/archive.py index 584edd8f9..264e9cc37 100644 --- a/apiserver/plane/app/views/issue/archive.py +++ b/apiserver/plane/app/views/issue/archive.py @@ -66,6 +66,7 @@ class IssueArchiveViewSet(BaseViewSet): .annotate(count=Func(F("id"), function="Count")) .values("count") ) + .filter(deleted_at__isnull=True) .filter(archived_at__isnull=False) .filter(project_id=self.kwargs.get("project_id")) .filter(workspace__slug=self.kwargs.get("slug")) diff --git a/apiserver/plane/app/views/issue/draft.py b/apiserver/plane/app/views/issue/draft.py index 5af4433af..3c38e93f6 100644 --- a/apiserver/plane/app/views/issue/draft.py +++ b/apiserver/plane/app/views/issue/draft.py @@ -68,6 +68,7 @@ class IssueDraftViewSet(BaseViewSet): Issue.objects.filter(project_id=self.kwargs.get("project_id")) .filter(workspace__slug=self.kwargs.get("slug")) .filter(is_draft=True) + .filter(deleted_at__isnull=True) .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") .annotate(cycle_id=F("issue_cycle__cycle_id")) diff --git a/apiserver/plane/bgtasks/deletion_task.py b/apiserver/plane/bgtasks/deletion_task.py index 6b155934e..d8272591a 100644 --- a/apiserver/plane/bgtasks/deletion_task.py +++ b/apiserver/plane/bgtasks/deletion_task.py @@ -1,6 +1,7 @@ # Django imports from django.utils import timezone from django.apps import apps +from django.conf import settings from django.core.exceptions import ObjectDoesNotExist # Third party imports @@ -15,9 +16,9 @@ def soft_delete_related_objects( instance = model_class.all_objects.get(pk=instance_pk) related_fields = instance._meta.get_fields() for field in related_fields: - if field.one_to_many or field.one_to_one or field.many_to_many: + if field.one_to_many or field.one_to_one: try: - if field.one_to_many or field.many_to_many: + if field.one_to_many: related_objects = getattr(instance, field.name).all() elif field.one_to_one: related_object = getattr(instance, field.name) @@ -58,88 +59,89 @@ def hard_delete(): ModuleIssue, CycleIssue, Estimate, - EstimatePoint + EstimatePoint, ) + days = settings.HARD_DELETE_AFTER_DAYS # check delete workspace _ = Workspace.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() # check delete project _ = Project.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() # check delete cycle _ = Cycle.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() # check delete module _ = Module.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() # check delete issue _ = Issue.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() # check delete page _ = Page.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() # check delete view _ = IssueView.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() # check delete label _ = Label.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() # check delete state _ = State.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() _ = IssueActivity.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() _ = IssueComment.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() _ = IssueLink.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() _ = IssueReaction.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() _ = UserFavorite.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() _ = ModuleIssue.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() _ = CycleIssue.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() _ = Estimate.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() _ = EstimatePoint.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() - timezone.timedelta(days=days) ).delete() # at last, check for every thing which ever is left and delete it @@ -152,7 +154,8 @@ def hard_delete(): if hasattr(model, "deleted_at"): # Get all instances where 'deleted_at' is greater than 30 days ago _ = model.all_objects.filter( - deleted_at__lt=timezone.now() - timezone.timedelta(days=30) + deleted_at__lt=timezone.now() + - timezone.timedelta(days=days) ).delete() return diff --git a/apiserver/plane/settings/common.py b/apiserver/plane/settings/common.py index 2d75f16e2..16d5f8c54 100644 --- a/apiserver/plane/settings/common.py +++ b/apiserver/plane/settings/common.py @@ -355,3 +355,5 @@ CSRF_FAILURE_VIEW = "plane.authentication.views.common.csrf_failure" ADMIN_BASE_URL = os.environ.get("ADMIN_BASE_URL", None) SPACE_BASE_URL = os.environ.get("SPACE_BASE_URL", None) APP_BASE_URL = os.environ.get("APP_BASE_URL") + +HARD_DELETE_AFTER_DAYS = int(os.environ.get("HARD_DELETE_AFTER_DAYS", 60))