diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index 2590532abf1..26945a7668b 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -16,6 +16,7 @@ Q, Value, When, + Subquery, ) from django.utils import timezone @@ -48,6 +49,7 @@ Label, Project, ProjectMember, + CycleIssue, ) from .base import BaseAPIView @@ -203,12 +205,10 @@ def get(self, request, slug, project_id, pk=None): issue_queryset = ( self.get_queryset() .annotate( - cycle_id=Case( - When( - Q(issue_cycle__deleted_at__isnull=True), - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( diff --git a/apiserver/plane/app/views/cycle/issue.py b/apiserver/plane/app/views/cycle/issue.py index c744897a163..89ce50219f4 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, Case, When +from django.db.models import F, Func, OuterRef, Q, Subquery from django.utils import timezone from django.utils.decorators import method_decorator from django.views.decorators.gzip import gzip_page @@ -103,12 +103,10 @@ def list(self, request, slug, project_id, cycle_id): ) .filter(**filters) .annotate( - cycle_id=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( diff --git a/apiserver/plane/app/views/dashboard/base.py b/apiserver/plane/app/views/dashboard/base.py index 3bfa0fe56e8..238cb67a59d 100644 --- a/apiserver/plane/app/views/dashboard/base.py +++ b/apiserver/plane/app/views/dashboard/base.py @@ -42,6 +42,7 @@ Project, Widget, WorkspaceMember, + CycleIssue, ) from plane.utils.issue_filters import issue_filters @@ -191,7 +192,13 @@ def dashboard_assigned_issues(self, request, slug): ).select_related("issue"), ) ) - .annotate(cycle_id=F("issue_cycle__cycle_id")) + .annotate( + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] + ) + ) .annotate( link_count=IssueLink.objects.filter(issue=OuterRef("id")) .order_by() @@ -365,7 +372,13 @@ def dashboard_created_issues(self, request, slug): .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=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] + ) + ) .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 62da2b25152..3654df38ea2 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, Case, When +from django.db.models import Q, Count, OuterRef, Func, F, Prefetch, Subquery from django.core.serializers.json import DjangoJSONEncoder from django.contrib.postgres.aggregates import ArrayAgg from django.contrib.postgres.fields import ArrayField @@ -26,6 +26,7 @@ FileAsset, Project, ProjectMember, + CycleIssue, ) from plane.app.serializers import ( IssueCreateSerializer, @@ -113,12 +114,10 @@ def get_queryset(self): ) ) .annotate( - cycle_id=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( @@ -203,8 +202,10 @@ def list(self, request, slug, project_id): ArrayAgg( "issue__labels__id", distinct=True, - filter=Q(~Q(issue__labels__id__isnull=True) - & Q(issue__label_issue__deleted_at__isnull=True)), + filter=Q( + ~Q(issue__labels__id__isnull=True) + & Q(issue__label_issue__deleted_at__isnull=True) + ), ), Value([], output_field=ArrayField(UUIDField())), ) @@ -385,8 +386,10 @@ def partial_update(self, request, slug, project_id, pk): ArrayAgg( "labels__id", distinct=True, - filter=Q(~Q(labels__id__isnull=True) - & Q(label_issue__deleted_at__isnull=True)), + filter=Q( + ~Q(labels__id__isnull=True) + & Q(label_issue__deleted_at__isnull=True) + ), ), Value([], output_field=ArrayField(UUIDField())), ), @@ -394,8 +397,10 @@ def partial_update(self, request, slug, project_id, pk): ArrayAgg( "assignees__id", distinct=True, - filter=Q(~Q(assignees__id__isnull=True) - & Q(issue_assignee__deleted_at__isnull=True)), + filter=Q( + ~Q(assignees__id__isnull=True) + & Q(issue_assignee__deleted_at__isnull=True) + ), ), Value([], output_field=ArrayField(UUIDField())), ), @@ -518,10 +523,12 @@ def partial_update(self, request, slug, project_id, pk): ArrayAgg( "issue__labels__id", distinct=True, - filter=Q(~Q(issue__labels__id__isnull=True) - & Q( - issue__label_issue__deleted_at__isnull=True - )), + filter=Q( + ~Q(issue__labels__id__isnull=True) + & Q( + issue__label_issue__deleted_at__isnull=True + ) + ), ), Value([], output_field=ArrayField(UUIDField())), ), @@ -529,8 +536,12 @@ def partial_update(self, request, slug, project_id, pk): ArrayAgg( "issue__assignees__id", distinct=True, - filter=Q(~Q(issue__assignees__id__isnull=True) - & Q(issue__issue_assignee__deleted_at__isnull=True)), + filter=Q( + ~Q(issue__assignees__id__isnull=True) + & Q( + issue__issue_assignee__deleted_at__isnull=True + ) + ), ), Value([], output_field=ArrayField(UUIDField())), ), @@ -575,8 +586,10 @@ def retrieve(self, request, slug, project_id, pk): ArrayAgg( "issue__labels__id", distinct=True, - filter=Q(~Q(issue__labels__id__isnull=True) - & Q(issue__label_issue__deleted_at__isnull=True)), + filter=Q( + ~Q(issue__labels__id__isnull=True) + & Q(issue__label_issue__deleted_at__isnull=True) + ), ), Value([], output_field=ArrayField(UUIDField())), ), @@ -584,8 +597,10 @@ def retrieve(self, request, slug, project_id, pk): ArrayAgg( "issue__assignees__id", distinct=True, - filter=Q(~Q(issue__assignees__id__isnull=True) - & Q(issue__issue_assignee__deleted_at__isnull=True)), + filter=Q( + ~Q(issue__assignees__id__isnull=True) + & Q(issue__issue_assignee__deleted_at__isnull=True) + ), ), Value([], output_field=ArrayField(UUIDField())), ), diff --git a/apiserver/plane/app/views/issue/archive.py b/apiserver/plane/app/views/issue/archive.py index 46815296dbf..2c6781e59e7 100644 --- a/apiserver/plane/app/views/issue/archive.py +++ b/apiserver/plane/app/views/issue/archive.py @@ -3,7 +3,7 @@ # Django imports from django.core.serializers.json import DjangoJSONEncoder -from django.db.models import F, Func, OuterRef, Q, Prefetch, Exists, Case, When +from django.db.models import F, Func, OuterRef, Q, Prefetch, Exists, Subquery from django.utils import timezone from django.utils.decorators import method_decorator from django.views.decorators.gzip import gzip_page @@ -27,6 +27,7 @@ IssueLink, IssueSubscriber, IssueReaction, + CycleIssue ) from plane.utils.grouper import ( issue_group_values, @@ -65,12 +66,10 @@ def get_queryset(self): .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") .annotate( - cycle_id=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( diff --git a/apiserver/plane/app/views/issue/base.py b/apiserver/plane/app/views/issue/base.py index 7bc3dd10e14..02a7de9588c 100644 --- a/apiserver/plane/app/views/issue/base.py +++ b/apiserver/plane/app/views/issue/base.py @@ -14,8 +14,7 @@ Q, UUIDField, Value, - When, - Case, + Subquery, ) from django.db.models.functions import Coalesce from django.utils import timezone @@ -44,6 +43,7 @@ IssueSubscriber, Project, ProjectMember, + CycleIssue, ) from plane.utils.grouper import ( issue_group_values, @@ -86,12 +86,10 @@ def get(self, request, slug, project_id): .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") .annotate( - cycle_id=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( @@ -218,12 +216,10 @@ def get_queryset(self): .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") .annotate( - cycle_id=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( @@ -786,12 +782,10 @@ def get_queryset(self): ) .prefetch_related("assignees", "labels", "issue_module__module") .annotate( - cycle_id=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( diff --git a/apiserver/plane/app/views/issue/relation.py b/apiserver/plane/app/views/issue/relation.py index 20243a11ce2..1a0400f5821 100644 --- a/apiserver/plane/app/views/issue/relation.py +++ b/apiserver/plane/app/views/issue/relation.py @@ -11,8 +11,7 @@ UUIDField, Value, CharField, - Case, - When, + Subquery, ) from django.core.serializers.json import DjangoJSONEncoder from django.db.models.functions import Coalesce @@ -36,6 +35,7 @@ Issue, FileAsset, IssueLink, + CycleIssue, ) from plane.bgtasks.issue_activities_task import issue_activity @@ -94,12 +94,10 @@ def list(self, request, slug, project_id, issue_id): .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") .annotate( - cycle_id=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( @@ -141,9 +139,11 @@ def list(self, request, slug, project_id, issue_id): ArrayAgg( "assignees__id", distinct=True, - filter=Q(~Q(assignees__id__isnull=True) - & Q(assignees__member_project__is_active=True) - & Q(issue_assignee__deleted_at__isnull=True)), + filter=Q( + ~Q(assignees__id__isnull=True) + & Q(assignees__member_project__is_active=True) + & Q(issue_assignee__deleted_at__isnull=True) + ), ), Value([], output_field=ArrayField(UUIDField())), ), diff --git a/apiserver/plane/app/views/issue/sub_issue.py b/apiserver/plane/app/views/issue/sub_issue.py index 02f3b6147b4..cf3e108de84 100644 --- a/apiserver/plane/app/views/issue/sub_issue.py +++ b/apiserver/plane/app/views/issue/sub_issue.py @@ -3,16 +3,7 @@ # Django imports from django.utils import timezone -from django.db.models import ( - OuterRef, - Func, - F, - Q, - Value, - UUIDField, - Case, - When, -) +from django.db.models import OuterRef, Func, F, Q, Value, UUIDField, Subquery from django.utils.decorators import method_decorator from django.views.decorators.gzip import gzip_page from django.contrib.postgres.aggregates import ArrayAgg @@ -31,6 +22,7 @@ Issue, IssueLink, FileAsset, + CycleIssue, ) from plane.bgtasks.issue_activities_task import issue_activity from plane.utils.user_timezone_converter import user_timezone_converter @@ -51,12 +43,10 @@ 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=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( diff --git a/apiserver/plane/app/views/module/issue.py b/apiserver/plane/app/views/module/issue.py index ae59efbca43..8b4b685e8b8 100644 --- a/apiserver/plane/app/views/module/issue.py +++ b/apiserver/plane/app/views/module/issue.py @@ -1,14 +1,7 @@ # Python imports import json -from django.db.models import ( - F, - Func, - OuterRef, - Q, - Case, - When, -) +from django.db.models import F, Func, OuterRef, Q, Subquery # Django Imports from django.utils import timezone @@ -30,6 +23,7 @@ IssueLink, ModuleIssue, Project, + CycleIssue, ) from plane.utils.grouper import ( issue_group_values, @@ -68,12 +62,10 @@ def get_queryset(self): .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") .annotate( - cycle_id=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( diff --git a/apiserver/plane/app/views/view/base.py b/apiserver/plane/app/views/view/base.py index a14e761a552..e999dc32926 100644 --- a/apiserver/plane/app/views/view/base.py +++ b/apiserver/plane/app/views/view/base.py @@ -9,8 +9,7 @@ Q, UUIDField, Value, - Case, - When, + Subquery, ) from django.db.models.functions import Coalesce from django.utils.decorators import method_decorator @@ -38,6 +37,7 @@ WorkspaceMember, ProjectMember, Project, + CycleIssue, ) from plane.utils.grouper import ( issue_group_values, @@ -208,12 +208,10 @@ def get_queryset(self): .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") .annotate( - cycle_id=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( @@ -291,12 +289,10 @@ def list(self, request, slug): self.get_queryset() .filter(**filters) .annotate( - cycle_id=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) ) diff --git a/apiserver/plane/app/views/workspace/draft.py b/apiserver/plane/app/views/workspace/draft.py index 265ef111ce2..b2cb529fca6 100644 --- a/apiserver/plane/app/views/workspace/draft.py +++ b/apiserver/plane/app/views/workspace/draft.py @@ -8,12 +8,11 @@ from django.contrib.postgres.aggregates import ArrayAgg from django.contrib.postgres.fields import ArrayField from django.db.models import ( - F, Q, UUIDField, Value, - Case, - When, + Subquery, + OuterRef, ) from django.db.models.functions import Coalesce from django.utils.decorators import method_decorator @@ -36,7 +35,6 @@ DraftIssue, CycleIssue, ModuleIssue, - DraftIssueModule, DraftIssueCycle, Workspace, FileAsset, @@ -56,14 +54,11 @@ def get_queryset(self): .prefetch_related( "assignees", "labels", "draft_issue_module__module" ) - .annotate(cycle_id=F("draft_issue_cycle__cycle_id")) .annotate( - cycle_id=Case( - When( - draft_issue_cycle__deleted_at__isnull=True, - then=F("draft_issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + DraftIssueCycle.objects.filter( + draft_issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( @@ -82,9 +77,11 @@ def get_queryset(self): ArrayAgg( "assignees__id", distinct=True, - filter=Q(~Q(assignees__id__isnull=True) - & Q(assignees__member_project__is_active=True) - & Q(draft_issue_assignee__deleted_at__isnull=True)), + filter=Q( + ~Q(assignees__id__isnull=True) + & Q(assignees__member_project__is_active=True) + & Q(draft_issue_assignee__deleted_at__isnull=True) + ), ), Value([], output_field=ArrayField(UUIDField())), ), @@ -92,11 +89,13 @@ def get_queryset(self): ArrayAgg( "draft_issue_module__module_id", distinct=True, - filter=Q(~Q(draft_issue_module__module_id__isnull=True) - & Q( - draft_issue_module__module__archived_at__isnull=True - ) - & Q(draft_issue_module__deleted_at__isnull=True)), + filter=Q( + ~Q(draft_issue_module__module_id__isnull=True) + & Q( + draft_issue_module__module__archived_at__isnull=True + ) + & Q(draft_issue_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 a69f18e19f0..6e54e8e455b 100644 --- a/apiserver/plane/app/views/workspace/user.py +++ b/apiserver/plane/app/views/workspace/user.py @@ -14,6 +14,7 @@ Q, Value, When, + Subquery, ) from django.db.models.fields import DateField from django.db.models.functions import Cast, ExtractWeek @@ -121,12 +122,10 @@ def get(self, request, slug, user_id): .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") .annotate( - cycle_id=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( diff --git a/apiserver/plane/db/models/page.py b/apiserver/plane/db/models/page.py index 45280e2da14..433e74a12dc 100644 --- a/apiserver/plane/db/models/page.py +++ b/apiserver/plane/db/models/page.py @@ -9,7 +9,6 @@ # Module imports from plane.utils.html_processor import strip_tags -from .project import ProjectBaseModel from .base import BaseModel diff --git a/apiserver/plane/db/models/view.py b/apiserver/plane/db/models/view.py index ee6ac64bfa1..586ab257dec 100644 --- a/apiserver/plane/db/models/view.py +++ b/apiserver/plane/db/models/view.py @@ -3,8 +3,6 @@ from django.db import models # Module import -from .base import BaseModel -from .project import ProjectBaseModel from .workspace import WorkspaceBaseModel from plane.utils.issue_filters import issue_filters diff --git a/apiserver/plane/space/views/issue.py b/apiserver/plane/space/views/issue.py index 606664b01e1..04a3dc4792e 100644 --- a/apiserver/plane/space/views/issue.py +++ b/apiserver/plane/space/views/issue.py @@ -20,6 +20,7 @@ OuterRef, Func, CharField, + Subquery, ) from django.db.models.functions import Concat @@ -62,6 +63,7 @@ IssueVote, ProjectPublicMember, FileAsset, + CycleIssue, ) from plane.bgtasks.issue_activities_task import issue_activity from plane.utils.issue_filters import issue_filters @@ -107,12 +109,10 @@ def get(self, request, anchor): ) ) .annotate( - cycle_id=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( @@ -704,12 +704,10 @@ def get(self, request, anchor, issue_id): .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") .annotate( - cycle_id=Case( - When( - issue_cycle__deleted_at__isnull=True, - then=F("issue_cycle__cycle_id"), - ), - default=None, + cycle_id=Subquery( + CycleIssue.objects.filter( + issue=OuterRef("id"), deleted_at__isnull=True + ).values("cycle_id")[:1] ) ) .annotate( @@ -728,9 +726,11 @@ def get(self, request, anchor, issue_id): ArrayAgg( "assignees__id", distinct=True, - filter=Q(~Q(assignees__id__isnull=True) - & Q(assignees__member_project__is_active=True) - & Q(issue_assignee__deleted_at__isnull=True)), + filter=Q( + ~Q(assignees__id__isnull=True) + & Q(assignees__member_project__is_active=True) + & Q(issue_assignee__deleted_at__isnull=True) + ), ), Value([], output_field=ArrayField(UUIDField())), ),