diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index 77f0fad623d..27c7042b49b 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -202,7 +202,15 @@ def get(self, request, slug, project_id, pk=None): issue_queryset = ( self.get_queryset() - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + Q(issue_cycle__cycle__deleted_at__isnull=True), + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() diff --git a/apiserver/plane/app/views/cycle/issue.py b/apiserver/plane/app/views/cycle/issue.py index cdd6b11ad6a..a9a33059900 100644 --- a/apiserver/plane/app/views/cycle/issue.py +++ b/apiserver/plane/app/views/cycle/issue.py @@ -3,7 +3,7 @@ # Django imports from django.core import serializers -from django.db.models import F, Func, OuterRef, Q +from django.db.models import F, Func, OuterRef, Q, Case, When from django.utils import timezone from django.utils.decorators import method_decorator from django.views.decorators.gzip import gzip_page @@ -102,7 +102,15 @@ def list(self, request, slug, project_id, cycle_id): "issue_cycle__cycle", ) .filter(**filters) - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() diff --git a/apiserver/plane/app/views/inbox/base.py b/apiserver/plane/app/views/inbox/base.py index ac4da953709..59a9cf955ee 100644 --- a/apiserver/plane/app/views/inbox/base.py +++ b/apiserver/plane/app/views/inbox/base.py @@ -3,7 +3,7 @@ # Django import from django.utils import timezone -from django.db.models import Q, Count, OuterRef, Func, F, Prefetch +from django.db.models import Q, Count, OuterRef, Func, F, Prefetch, Case, When from django.core.serializers.json import DjangoJSONEncoder from django.contrib.postgres.aggregates import ArrayAgg from django.contrib.postgres.fields import ArrayField @@ -112,7 +112,15 @@ def get_queryset(self): ), ) ) - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() diff --git a/apiserver/plane/app/views/issue/archive.py b/apiserver/plane/app/views/issue/archive.py index 83fc5d0c2c8..283f1ad99a8 100644 --- a/apiserver/plane/app/views/issue/archive.py +++ b/apiserver/plane/app/views/issue/archive.py @@ -3,14 +3,7 @@ # Django imports from django.core.serializers.json import DjangoJSONEncoder -from django.db.models import ( - F, - Func, - OuterRef, - Q, - Prefetch, - Exists, -) +from django.db.models import F, Func, OuterRef, Q, Prefetch, Exists, Case, When from django.utils import timezone from django.utils.decorators import method_decorator from django.views.decorators.gzip import gzip_page @@ -71,7 +64,15 @@ def get_queryset(self): .filter(workspace__slug=self.kwargs.get("slug")) .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() diff --git a/apiserver/plane/app/views/issue/base.py b/apiserver/plane/app/views/issue/base.py index a1cca7f431a..0488a5471d8 100644 --- a/apiserver/plane/app/views/issue/base.py +++ b/apiserver/plane/app/views/issue/base.py @@ -14,6 +14,8 @@ Q, UUIDField, Value, + When, + Case, ) from django.db.models.functions import Coalesce from django.utils import timezone @@ -83,7 +85,15 @@ def get(self, request, slug, project_id): .filter(workspace__slug=self.kwargs.get("slug")) .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() @@ -207,7 +217,15 @@ def get_queryset(self): .filter(workspace__slug=self.kwargs.get("slug")) .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() @@ -757,7 +775,15 @@ def get_queryset(self): "workspace", "project", "state", "parent" ) .prefetch_related("assignees", "labels", "issue_module__module") - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() diff --git a/apiserver/plane/app/views/issue/relation.py b/apiserver/plane/app/views/issue/relation.py index 4bf622f28ac..83385d83d72 100644 --- a/apiserver/plane/app/views/issue/relation.py +++ b/apiserver/plane/app/views/issue/relation.py @@ -3,7 +3,17 @@ # Django imports from django.utils import timezone -from django.db.models import Q, OuterRef, F, Func, UUIDField, Value, CharField +from django.db.models import ( + Q, + OuterRef, + F, + Func, + UUIDField, + Value, + CharField, + Case, + When, +) from django.core.serializers.json import DjangoJSONEncoder from django.db.models.functions import Coalesce from django.contrib.postgres.aggregates import ArrayAgg @@ -83,7 +93,15 @@ def list(self, request, slug, project_id, issue_id): Issue.issue_objects.filter(workspace__slug=slug) .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() diff --git a/apiserver/plane/app/views/issue/sub_issue.py b/apiserver/plane/app/views/issue/sub_issue.py index cf9c0f709cb..700d6db5b39 100644 --- a/apiserver/plane/app/views/issue/sub_issue.py +++ b/apiserver/plane/app/views/issue/sub_issue.py @@ -10,6 +10,8 @@ Q, Value, UUIDField, + Case, + When, ) from django.utils.decorators import method_decorator from django.views.decorators.gzip import gzip_page @@ -48,7 +50,15 @@ def get(self, request, slug, project_id, issue_id): ) .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() diff --git a/apiserver/plane/app/views/module/issue.py b/apiserver/plane/app/views/module/issue.py index 8edced252d7..f58e477567a 100644 --- a/apiserver/plane/app/views/module/issue.py +++ b/apiserver/plane/app/views/module/issue.py @@ -6,6 +6,8 @@ Func, OuterRef, Q, + Case, + When, ) # Django Imports @@ -65,7 +67,15 @@ def get_queryset(self): ) .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() diff --git a/apiserver/plane/app/views/view/base.py b/apiserver/plane/app/views/view/base.py index 56f03cda658..59cfcecd57a 100644 --- a/apiserver/plane/app/views/view/base.py +++ b/apiserver/plane/app/views/view/base.py @@ -9,6 +9,8 @@ Q, UUIDField, Value, + Case, + When, ) from django.db.models.functions import Coalesce from django.utils.decorators import method_decorator @@ -205,7 +207,15 @@ def get_queryset(self): ) .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() @@ -275,7 +285,15 @@ def list(self, request, slug): issue_queryset = ( self.get_queryset() .filter(**filters) - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) ) # check for the project member role, if the role is 5 then check for the guest_view_all_features if it is true then show all the issues else show only the issues created by the user diff --git a/apiserver/plane/app/views/workspace/draft.py b/apiserver/plane/app/views/workspace/draft.py index ee899be6823..d116c421474 100644 --- a/apiserver/plane/app/views/workspace/draft.py +++ b/apiserver/plane/app/views/workspace/draft.py @@ -12,6 +12,8 @@ Q, UUIDField, Value, + Case, + When, ) from django.db.models.functions import Coalesce from django.utils.decorators import method_decorator @@ -55,6 +57,15 @@ def get_queryset(self): "assignees", "labels", "draft_issue_module__module" ) .annotate(cycle_id=F("draft_issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( label_ids=Coalesce( ArrayAgg( @@ -81,8 +92,12 @@ def get_queryset(self): "draft_issue_module__module_id", distinct=True, filter=~Q(draft_issue_module__module_id__isnull=True) - & Q(draft_issue_module__module__archived_at__isnull=True) - & Q(draft_issue_module__module__deleted_at__isnull=True), + & Q( + draft_issue_module__module__archived_at__isnull=True + ) + & Q( + draft_issue_module__module__deleted_at__isnull=True + ), ), Value([], output_field=ArrayField(UUIDField())), ), diff --git a/apiserver/plane/app/views/workspace/user.py b/apiserver/plane/app/views/workspace/user.py index 57cde8d8bc2..fae917af295 100644 --- a/apiserver/plane/app/views/workspace/user.py +++ b/apiserver/plane/app/views/workspace/user.py @@ -120,7 +120,15 @@ def get(self, request, slug, user_id): .filter(**filters) .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() diff --git a/apiserver/plane/space/views/issue.py b/apiserver/plane/space/views/issue.py index d79940e1c96..bd9d499d60b 100644 --- a/apiserver/plane/space/views/issue.py +++ b/apiserver/plane/space/views/issue.py @@ -106,7 +106,15 @@ def get(self, request, anchor): queryset=IssueVote.objects.select_related("actor"), ) ) - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() @@ -695,7 +703,15 @@ def get(self, request, anchor, issue_id): ) .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Case( + When( + issue_cycle__cycle__deleted_at__isnull=True, + then=F("issue_cycle__cycle_id"), + ), + default=None, + ) + ) .annotate( label_ids=Coalesce( ArrayAgg(