From 069387c2423dacb0a2ebddb3d54fe4f24ab18011 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Thu, 14 Sep 2023 14:45:03 +0530 Subject: [PATCH 1/2] fix: cycle and module stats when issues are archived --- apiserver/plane/api/views/cycle.py | 75 ++++++++++++++++++++------ apiserver/plane/api/views/module.py | 51 ++++++++++++++---- apiserver/plane/api/views/workspace.py | 6 ++- 3 files changed, 104 insertions(+), 28 deletions(-) diff --git a/apiserver/plane/api/views/cycle.py b/apiserver/plane/api/views/cycle.py index 253da2c5b98..9ca18ab5f6e 100644 --- a/apiserver/plane/api/views/cycle.py +++ b/apiserver/plane/api/views/cycle.py @@ -105,44 +105,65 @@ def get_queryset(self): .annotate( completed_issues=Count( "issue_cycle__issue__state__group", - filter=Q(issue_cycle__issue__state__group="completed"), + filter=Q( + issue_cycle__issue__state__group="completed", + issue_cycle__issue__archived_at__isnull=True, + ), ) ) .annotate( cancelled_issues=Count( "issue_cycle__issue__state__group", - filter=Q(issue_cycle__issue__state__group="cancelled"), + filter=Q( + issue_cycle__issue__state__group="cancelled", + issue_cycle__issue__archived_at__isnull=True, + ), ) ) .annotate( started_issues=Count( "issue_cycle__issue__state__group", - filter=Q(issue_cycle__issue__state__group="started"), + filter=Q( + issue_cycle__issue__state__group="started", + issue_cycle__issue__archived_at__isnull=True, + ), ) ) .annotate( unstarted_issues=Count( "issue_cycle__issue__state__group", - filter=Q(issue_cycle__issue__state__group="unstarted"), + filter=Q( + issue_cycle__issue__state__group="unstarted", + issue_cycle__issue__archived_at__isnull=True, + ), ) ) .annotate( backlog_issues=Count( "issue_cycle__issue__state__group", - filter=Q(issue_cycle__issue__state__group="backlog"), + filter=Q( + issue_cycle__issue__state__group="backlog", + issue_cycle__issue__archived_at__isnull=True, + ), ) ) .annotate(total_estimates=Sum("issue_cycle__issue__estimate_point")) .annotate( completed_estimates=Sum( "issue_cycle__issue__estimate_point", - filter=Q(issue_cycle__issue__state__group="completed"), + filter=Q( + issue_cycle__issue__state__group="completed", + issue_cycle__issue__archived_at__isnull=True, + ), ) ) .annotate( started_estimates=Sum( "issue_cycle__issue__estimate_point", - filter=Q(issue_cycle__issue__state__group="started"), + filter=Q( + issue_cycle__issue__state__group="started", + issue_cycle__issue__archived_at__isnull=True, + ), ) ) .prefetch_related( @@ -199,13 +220,19 @@ def list(self, request, slug, project_id): .annotate( completed_issues=Count( "assignee_id", - filter=Q(completed_at__isnull=False), + filter=Q( + completed_at__isnull=False, + archived_at__isnull=True, + ), ) ) .annotate( pending_issues=Count( "assignee_id", - filter=Q(completed_at__isnull=True), + filter=Q( + completed_at__isnull=True, + archived_at__isnull=True, + ), ) ) .order_by("display_name") @@ -225,13 +252,19 @@ def list(self, request, slug, project_id): .annotate( completed_issues=Count( "label_id", - filter=Q(completed_at__isnull=False), + filter=Q( + completed_at__isnull=False, + archived_at__isnull=True, + ), ) ) .annotate( pending_issues=Count( "label_id", - filter=Q(completed_at__isnull=True), + filter=Q( + completed_at__isnull=True, + archived_at__isnull=True, + ), ) ) .order_by("label_name") @@ -388,13 +421,19 @@ def retrieve(self, request, slug, project_id, pk): .annotate( completed_issues=Count( "assignee_id", - filter=Q(completed_at__isnull=False), + filter=Q( + completed_at__isnull=False, + archived_at__isnull=True, + ), ) ) .annotate( pending_issues=Count( "assignee_id", - filter=Q(completed_at__isnull=True), + filter=Q( + completed_at__isnull=True, + archived_at__isnull=True, + ), ) ) .order_by("first_name", "last_name") @@ -415,13 +454,19 @@ def retrieve(self, request, slug, project_id, pk): .annotate( completed_issues=Count( "label_id", - filter=Q(completed_at__isnull=False), + filter=Q( + completed_at__isnull=False, + archived_at__isnull=True, + ), ) ) .annotate( pending_issues=Count( "label_id", - filter=Q(completed_at__isnull=True), + filter=Q( + completed_at__isnull=True, + archived_at__isnull=True, + ), ) ) .order_by("label_name") diff --git a/apiserver/plane/api/views/module.py b/apiserver/plane/api/views/module.py index 1cd741f8456..a8d3c731582 100644 --- a/apiserver/plane/api/views/module.py +++ b/apiserver/plane/api/views/module.py @@ -39,6 +39,7 @@ from plane.utils.issue_filters import issue_filters from plane.utils.analytics_plot import burndown_plot + class ModuleViewSet(BaseViewSet): model = Module permission_classes = [ @@ -81,31 +82,46 @@ def get_queryset(self): .annotate( completed_issues=Count( "issue_module__issue__state__group", - filter=Q(issue_module__issue__state__group="completed"), + filter=Q( + issue_module__issue__state__group="completed", + issue_module__issue__archived_at__isnull=True, + ), ) ) .annotate( cancelled_issues=Count( "issue_module__issue__state__group", - filter=Q(issue_module__issue__state__group="cancelled"), + filter=Q( + issue_module__issue__state__group="cancelled", + issue_module__issue__archived_at__isnull=True, + ), ) ) .annotate( started_issues=Count( "issue_module__issue__state__group", - filter=Q(issue_module__issue__state__group="started"), + filter=Q( + issue_module__issue__state__group="started", + issue_module__issue__archived_at__isnull=True, + ), ) ) .annotate( unstarted_issues=Count( "issue_module__issue__state__group", - filter=Q(issue_module__issue__state__group="unstarted"), + filter=Q( + issue_module__issue__state__group="unstarted", + issue_module__issue__archived_at__isnull=True, + ), ) ) .annotate( backlog_issues=Count( "issue_module__issue__state__group", - filter=Q(issue_module__issue__state__group="backlog"), + filter=Q( + issue_module__issue__state__group="backlog", + issue_module__issue__archived_at__isnull=True, + ), ) ) .order_by(order_by, "name") @@ -177,18 +193,26 @@ def retrieve(self, request, slug, project_id, pk): .annotate(assignee_id=F("assignees__id")) .annotate(display_name=F("assignees__display_name")) .annotate(avatar=F("assignees__avatar")) - .values("first_name", "last_name", "assignee_id", "avatar", "display_name") + .values( + "first_name", "last_name", "assignee_id", "avatar", "display_name" + ) .annotate(total_issues=Count("assignee_id")) .annotate( completed_issues=Count( "assignee_id", - filter=Q(completed_at__isnull=False), + filter=Q( + completed_at__isnull=False, + archived_at__isnull=True, + ), ) ) .annotate( pending_issues=Count( "assignee_id", - filter=Q(completed_at__isnull=True), + filter=Q( + completed_at__isnull=True, + archived_at__isnull=True, + ), ) ) .order_by("first_name", "last_name") @@ -208,13 +232,19 @@ def retrieve(self, request, slug, project_id, pk): .annotate( completed_issues=Count( "label_id", - filter=Q(completed_at__isnull=False), + filter=Q( + completed_at__isnull=False, + archived_at__isnull=True, + ), ) ) .annotate( pending_issues=Count( "label_id", - filter=Q(completed_at__isnull=True), + filter=Q( + completed_at__isnull=True, + archived_at__isnull=True, + ), ) ) .order_by("label_name") @@ -483,7 +513,6 @@ def get_queryset(self): class ModuleFavoriteViewSet(BaseViewSet): - serializer_class = ModuleFavoriteSerializer model = ModuleFavorite diff --git a/apiserver/plane/api/views/workspace.py b/apiserver/plane/api/views/workspace.py index 2d1ee81328b..702546d74d9 100644 --- a/apiserver/plane/api/views/workspace.py +++ b/apiserver/plane/api/views/workspace.py @@ -1239,13 +1239,13 @@ def get(self, request, slug, user_id): .annotate( created_issues=Count( "project_issue", - filter=Q(project_issue__created_by_id=user_id), + filter=Q(project_issue__created_by_id=user_id, project_issue__archived_at__isnull=True), ) ) .annotate( assigned_issues=Count( "project_issue", - filter=Q(project_issue__assignees__in=[user_id]), + filter=Q(project_issue__assignees__in=[user_id], project_issue__archived_at__isnull=True), ) ) .annotate( @@ -1254,6 +1254,7 @@ def get(self, request, slug, user_id): filter=Q( project_issue__completed_at__isnull=False, project_issue__assignees__in=[user_id], + project_issue__archived_at__isnull=True ), ) ) @@ -1267,6 +1268,7 @@ def get(self, request, slug, user_id): "started", ], project_issue__assignees__in=[user_id], + project_issue__archived_at__isnull=True, ), ) ) From 45b5f6d1980aee443ddee38e688339082d1b016b Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Tue, 19 Sep 2023 16:54:21 +0530 Subject: [PATCH 2/2] fix: added draft filter --- apiserver/plane/api/views/cycle.py | 53 +++++++++++++++++++++++--- apiserver/plane/api/views/module.py | 39 +++++++++++++++++-- apiserver/plane/api/views/workspace.py | 16 ++++++-- 3 files changed, 97 insertions(+), 11 deletions(-) diff --git a/apiserver/plane/api/views/cycle.py b/apiserver/plane/api/views/cycle.py index f93b6673ca2..32eb941ca25 100644 --- a/apiserver/plane/api/views/cycle.py +++ b/apiserver/plane/api/views/cycle.py @@ -101,13 +101,22 @@ def get_queryset(self): .select_related("workspace") .select_related("owned_by") .annotate(is_favorite=Exists(subquery)) - .annotate(total_issues=Count("issue_cycle")) + .annotate( + total_issues=Count( + "issue_cycle", + filter=Q( + issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, + ), + ) + ) .annotate( completed_issues=Count( "issue_cycle__issue__state__group", filter=Q( issue_cycle__issue__state__group="completed", issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, ), ) ) @@ -117,6 +126,7 @@ def get_queryset(self): filter=Q( issue_cycle__issue__state__group="cancelled", issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, ), ) ) @@ -126,6 +136,7 @@ def get_queryset(self): filter=Q( issue_cycle__issue__state__group="started", issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, ), ) ) @@ -135,6 +146,7 @@ def get_queryset(self): filter=Q( issue_cycle__issue__state__group="unstarted", issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, ), ) ) @@ -144,6 +156,7 @@ def get_queryset(self): filter=Q( issue_cycle__issue__state__group="backlog", issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, ), ) ) @@ -154,6 +167,7 @@ def get_queryset(self): filter=Q( issue_cycle__issue__state__group="completed", issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, ), ) ) @@ -163,6 +177,7 @@ def get_queryset(self): filter=Q( issue_cycle__issue__state__group="started", issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, ), ) ) @@ -216,13 +231,19 @@ def list(self, request, slug, project_id): .annotate(assignee_id=F("assignees__id")) .annotate(avatar=F("assignees__avatar")) .values("display_name", "assignee_id", "avatar") - .annotate(total_issues=Count("assignee_id")) + .annotate( + total_issues=Count( + "assignee_id", + filter=Q(archived_at__isnull=True, is_draft=False), + ), + ) .annotate( completed_issues=Count( "assignee_id", filter=Q( completed_at__isnull=False, archived_at__isnull=True, + is_draft=False, ), ) ) @@ -232,6 +253,7 @@ def list(self, request, slug, project_id): filter=Q( completed_at__isnull=True, archived_at__isnull=True, + is_draft=False, ), ) ) @@ -248,13 +270,19 @@ def list(self, request, slug, project_id): .annotate(color=F("labels__color")) .annotate(label_id=F("labels__id")) .values("label_name", "color", "label_id") - .annotate(total_issues=Count("label_id")) + .annotate( + total_issues=Count( + "label_id", + filter=Q(archived_at__isnull=True, is_draft=False), + ) + ) .annotate( completed_issues=Count( "label_id", filter=Q( completed_at__isnull=False, archived_at__isnull=True, + is_draft=False, ), ) ) @@ -264,6 +292,7 @@ def list(self, request, slug, project_id): filter=Q( completed_at__isnull=True, archived_at__isnull=True, + is_draft=False, ), ) ) @@ -417,13 +446,19 @@ def retrieve(self, request, slug, project_id, pk): .values( "first_name", "last_name", "assignee_id", "avatar", "display_name" ) - .annotate(total_issues=Count("assignee_id")) + .annotate( + total_issues=Count( + "assignee_id", + filter=Q(archived_at__isnull=True, is_draft=False), + ), + ) .annotate( completed_issues=Count( "assignee_id", filter=Q( completed_at__isnull=False, archived_at__isnull=True, + is_draft=False, ), ) ) @@ -433,6 +468,7 @@ def retrieve(self, request, slug, project_id, pk): filter=Q( completed_at__isnull=True, archived_at__isnull=True, + is_draft=False, ), ) ) @@ -450,13 +486,19 @@ def retrieve(self, request, slug, project_id, pk): .annotate(color=F("labels__color")) .annotate(label_id=F("labels__id")) .values("label_name", "color", "label_id") - .annotate(total_issues=Count("label_id")) + .annotate( + total_issues=Count( + "label_id", + filter=Q(archived_at__isnull=True, is_draft=False), + ), + ) .annotate( completed_issues=Count( "label_id", filter=Q( completed_at__isnull=False, archived_at__isnull=True, + is_draft=False, ), ) ) @@ -466,6 +508,7 @@ def retrieve(self, request, slug, project_id, pk): filter=Q( completed_at__isnull=True, archived_at__isnull=True, + is_draft=False, ), ) ) diff --git a/apiserver/plane/api/views/module.py b/apiserver/plane/api/views/module.py index 516b7acb74a..f10e21bc077 100644 --- a/apiserver/plane/api/views/module.py +++ b/apiserver/plane/api/views/module.py @@ -78,13 +78,22 @@ def get_queryset(self): queryset=ModuleLink.objects.select_related("module", "created_by"), ) ) - .annotate(total_issues=Count("issue_module")) + .annotate( + total_issues=Count( + "issue_module", + filter=Q( + issue_module__issue__archived_at__isnull=True, + issue_module__issue__is_draft=False, + ), + ), + ) .annotate( completed_issues=Count( "issue_module__issue__state__group", filter=Q( issue_module__issue__state__group="completed", issue_module__issue__archived_at__isnull=True, + issue_module__issue__is_draft=False, ), ) ) @@ -94,6 +103,7 @@ def get_queryset(self): filter=Q( issue_module__issue__state__group="cancelled", issue_module__issue__archived_at__isnull=True, + issue_module__issue__is_draft=False, ), ) ) @@ -103,6 +113,7 @@ def get_queryset(self): filter=Q( issue_module__issue__state__group="started", issue_module__issue__archived_at__isnull=True, + issue_module__issue__is_draft=False, ), ) ) @@ -112,6 +123,7 @@ def get_queryset(self): filter=Q( issue_module__issue__state__group="unstarted", issue_module__issue__archived_at__isnull=True, + issue_module__issue__is_draft=False, ), ) ) @@ -121,6 +133,7 @@ def get_queryset(self): filter=Q( issue_module__issue__state__group="backlog", issue_module__issue__archived_at__isnull=True, + issue_module__issue__is_draft=False, ), ) ) @@ -196,13 +209,22 @@ def retrieve(self, request, slug, project_id, pk): .values( "first_name", "last_name", "assignee_id", "avatar", "display_name" ) - .annotate(total_issues=Count("assignee_id")) + .annotate( + total_issues=Count( + "assignee_id", + filter=Q( + archived_at__isnull=True, + is_draft=False, + ), + ) + ) .annotate( completed_issues=Count( "assignee_id", filter=Q( completed_at__isnull=False, archived_at__isnull=True, + is_draft=False, ), ) ) @@ -212,6 +234,7 @@ def retrieve(self, request, slug, project_id, pk): filter=Q( completed_at__isnull=True, archived_at__isnull=True, + is_draft=False, ), ) ) @@ -228,13 +251,22 @@ def retrieve(self, request, slug, project_id, pk): .annotate(color=F("labels__color")) .annotate(label_id=F("labels__id")) .values("label_name", "color", "label_id") - .annotate(total_issues=Count("label_id")) + .annotate( + total_issues=Count( + "label_id", + filter=Q( + archived_at__isnull=True, + is_draft=False, + ), + ), + ) .annotate( completed_issues=Count( "label_id", filter=Q( completed_at__isnull=False, archived_at__isnull=True, + is_draft=False, ), ) ) @@ -244,6 +276,7 @@ def retrieve(self, request, slug, project_id, pk): filter=Q( completed_at__isnull=True, archived_at__isnull=True, + is_draft=False, ), ) ) diff --git a/apiserver/plane/api/views/workspace.py b/apiserver/plane/api/views/workspace.py index 702546d74d9..97e991c862e 100644 --- a/apiserver/plane/api/views/workspace.py +++ b/apiserver/plane/api/views/workspace.py @@ -1239,13 +1239,21 @@ def get(self, request, slug, user_id): .annotate( created_issues=Count( "project_issue", - filter=Q(project_issue__created_by_id=user_id, project_issue__archived_at__isnull=True), + filter=Q( + project_issue__created_by_id=user_id, + project_issue__archived_at__isnull=True, + project_issue__is_draft=False, + ), ) ) .annotate( assigned_issues=Count( "project_issue", - filter=Q(project_issue__assignees__in=[user_id], project_issue__archived_at__isnull=True), + filter=Q( + project_issue__assignees__in=[user_id], + project_issue__archived_at__isnull=True, + project_issue__is_draft=False, + ), ) ) .annotate( @@ -1254,7 +1262,8 @@ def get(self, request, slug, user_id): filter=Q( project_issue__completed_at__isnull=False, project_issue__assignees__in=[user_id], - project_issue__archived_at__isnull=True + project_issue__archived_at__isnull=True, + project_issue__is_draft=False, ), ) ) @@ -1269,6 +1278,7 @@ def get(self, request, slug, user_id): ], project_issue__assignees__in=[user_id], project_issue__archived_at__isnull=True, + project_issue__is_draft=False, ), ) )