diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index 2590532ab..26945a766 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -16,6 +16,7 @@ from django.db.models import ( Q, Value, When, + Subquery, ) from django.utils import timezone @@ -48,6 +49,7 @@ from plane.db.models import ( Label, Project, ProjectMember, + CycleIssue, ) from .base import BaseAPIView @@ -203,12 +205,10 @@ class IssueAPIEndpoint(BaseAPIView): 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 c744897a1..89ce50219 100644 --- a/apiserver/plane/app/views/cycle/issue.py +++ b/apiserver/plane/app/views/cycle/issue.py @@ -3,7 +3,7 @@ import json # 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 @@ class CycleIssueViewSet(BaseViewSet): ) .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 3bfa0fe56..238cb67a5 100644 --- a/apiserver/plane/app/views/dashboard/base.py +++ b/apiserver/plane/app/views/dashboard/base.py @@ -42,6 +42,7 @@ from plane.db.models import ( 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 62da2b251..3654df38e 100644 --- a/apiserver/plane/app/views/inbox/base.py +++ b/apiserver/plane/app/views/inbox/base.py @@ -3,7 +3,7 @@ import json # 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 @@ from plane.db.models import ( FileAsset, Project, ProjectMember, + CycleIssue, ) from plane.app.serializers import ( IssueCreateSerializer, @@ -113,12 +114,10 @@ class InboxIssueViewSet(BaseViewSet): ) ) .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 @@ class InboxIssueViewSet(BaseViewSet): 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 @@ class InboxIssueViewSet(BaseViewSet): 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 @@ class InboxIssueViewSet(BaseViewSet): 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 @@ class InboxIssueViewSet(BaseViewSet): 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 @@ class InboxIssueViewSet(BaseViewSet): 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 @@ class InboxIssueViewSet(BaseViewSet): 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 @@ class InboxIssueViewSet(BaseViewSet): 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 46815296d..2c6781e59 100644 --- a/apiserver/plane/app/views/issue/archive.py +++ b/apiserver/plane/app/views/issue/archive.py @@ -3,7 +3,7 @@ import json # 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 @@ from plane.db.models import ( IssueLink, IssueSubscriber, IssueReaction, + CycleIssue ) from plane.utils.grouper import ( issue_group_values, @@ -65,12 +66,10 @@ class IssueArchiveViewSet(BaseViewSet): .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 7bc3dd10e..02a7de958 100644 --- a/apiserver/plane/app/views/issue/base.py +++ b/apiserver/plane/app/views/issue/base.py @@ -14,8 +14,7 @@ from django.db.models import ( Q, UUIDField, Value, - When, - Case, + Subquery, ) from django.db.models.functions import Coalesce from django.utils import timezone @@ -44,6 +43,7 @@ from plane.db.models import ( IssueSubscriber, Project, ProjectMember, + CycleIssue, ) from plane.utils.grouper import ( issue_group_values, @@ -86,12 +86,10 @@ class IssueListEndpoint(BaseAPIView): .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 @@ class IssueViewSet(BaseViewSet): .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 @@ class IssuePaginatedViewSet(BaseViewSet): ) .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 20243a11c..1a0400f58 100644 --- a/apiserver/plane/app/views/issue/relation.py +++ b/apiserver/plane/app/views/issue/relation.py @@ -11,8 +11,7 @@ from django.db.models import ( UUIDField, Value, CharField, - Case, - When, + Subquery, ) from django.core.serializers.json import DjangoJSONEncoder from django.db.models.functions import Coalesce @@ -36,6 +35,7 @@ from plane.db.models import ( Issue, FileAsset, IssueLink, + CycleIssue, ) from plane.bgtasks.issue_activities_task import issue_activity @@ -94,12 +94,10 @@ class IssueRelationViewSet(BaseViewSet): .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 @@ class IssueRelationViewSet(BaseViewSet): 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 02f3b6147..cf3e108de 100644 --- a/apiserver/plane/app/views/issue/sub_issue.py +++ b/apiserver/plane/app/views/issue/sub_issue.py @@ -3,16 +3,7 @@ import json # 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 @@ from plane.db.models import ( 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 @@ class SubIssuesEndpoint(BaseAPIView): .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 ae59efbca..8b4b685e8 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 @@ from plane.db.models import ( IssueLink, ModuleIssue, Project, + CycleIssue, ) from plane.utils.grouper import ( issue_group_values, @@ -68,12 +62,10 @@ class ModuleIssueViewSet(BaseViewSet): .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 a14e761a5..e999dc329 100644 --- a/apiserver/plane/app/views/view/base.py +++ b/apiserver/plane/app/views/view/base.py @@ -9,8 +9,7 @@ from django.db.models import ( Q, UUIDField, Value, - Case, - When, + Subquery, ) from django.db.models.functions import Coalesce from django.utils.decorators import method_decorator @@ -38,6 +37,7 @@ from plane.db.models import ( WorkspaceMember, ProjectMember, Project, + CycleIssue, ) from plane.utils.grouper import ( issue_group_values, @@ -208,12 +208,10 @@ class WorkspaceViewIssuesViewSet(BaseViewSet): .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 @@ class WorkspaceViewIssuesViewSet(BaseViewSet): 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 265ef111c..b2cb529fc 100644 --- a/apiserver/plane/app/views/workspace/draft.py +++ b/apiserver/plane/app/views/workspace/draft.py @@ -8,12 +8,11 @@ from django.core.serializers.json import DjangoJSONEncoder 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 @@ from plane.db.models import ( DraftIssue, CycleIssue, ModuleIssue, - DraftIssueModule, DraftIssueCycle, Workspace, FileAsset, @@ -56,14 +54,11 @@ class WorkspaceDraftIssueViewSet(BaseViewSet): .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 @@ class WorkspaceDraftIssueViewSet(BaseViewSet): 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 @@ class WorkspaceDraftIssueViewSet(BaseViewSet): 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 a69f18e19..6e54e8e45 100644 --- a/apiserver/plane/app/views/workspace/user.py +++ b/apiserver/plane/app/views/workspace/user.py @@ -14,6 +14,7 @@ from django.db.models import ( Q, Value, When, + Subquery, ) from django.db.models.fields import DateField from django.db.models.functions import Cast, ExtractWeek @@ -121,12 +122,10 @@ class WorkspaceUserProfileIssuesEndpoint(BaseAPIView): .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 45280e2da..433e74a12 100644 --- a/apiserver/plane/db/models/page.py +++ b/apiserver/plane/db/models/page.py @@ -9,7 +9,6 @@ from django.db import models # 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 ee6ac64bf..586ab257d 100644 --- a/apiserver/plane/db/models/view.py +++ b/apiserver/plane/db/models/view.py @@ -3,8 +3,6 @@ from django.conf import settings 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 606664b01..04a3dc479 100644 --- a/apiserver/plane/space/views/issue.py +++ b/apiserver/plane/space/views/issue.py @@ -20,6 +20,7 @@ from django.db.models import ( OuterRef, Func, CharField, + Subquery, ) from django.db.models.functions import Concat @@ -62,6 +63,7 @@ from plane.db.models import ( 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 @@ class ProjectIssuesPublicEndpoint(BaseAPIView): ) ) .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 @@ class IssueRetrievePublicEndpoint(BaseAPIView): .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 @@ class IssueRetrievePublicEndpoint(BaseAPIView): 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())), ),