From 503d0de6217792d77baf737c0b35c9cf641b6721 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Fri, 20 Jan 2023 12:53:45 +0530 Subject: [PATCH 1/2] refactor: add anotations in queryset to return sub_issues_count --- apiserver/plane/api/serializers/issue.py | 3 ++- apiserver/plane/api/views/issue.py | 10 +++++++++- apiserver/plane/api/views/workspace.py | 12 ++++++++++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/apiserver/plane/api/serializers/issue.py b/apiserver/plane/api/serializers/issue.py index 227d3b96ddd..a148cbfb51a 100644 --- a/apiserver/plane/api/serializers/issue.py +++ b/apiserver/plane/api/serializers/issue.py @@ -432,6 +432,7 @@ class IssueSerializer(BaseSerializer): blocker_issues = BlockerIssueSerializer(read_only=True, many=True) issue_cycle = IssueCycleDetailSerializer(read_only=True) issue_module = IssueModuleDetailSerializer(read_only=True) + sub_issues_count = serializers.IntegerField(read_only=True) class Meta: model = Issue @@ -443,4 +444,4 @@ class Meta: "updated_by", "created_at", "updated_at", - ] \ No newline at end of file + ] diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index dd012c129a5..13ecf8996af 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -3,7 +3,7 @@ from itertools import groupby, chain # Django imports -from django.db.models import Prefetch +from django.db.models import Prefetch, OuterRef, Func, F from django.core.serializers.json import DjangoJSONEncoder # Third Party imports @@ -93,9 +93,16 @@ def perform_update(self, serializer): return super().perform_update(serializer) def get_queryset(self): + return ( super() .get_queryset() + .annotate( + sub_issues_count=Issue.objects.filter(parent=OuterRef("id")) + .order_by() + .annotate(count=Func(F("id"), function="Count")) + .values("count") + ) .filter(project_id=self.kwargs.get("project_id")) .filter(workspace__slug=self.kwargs.get("slug")) .select_related("project") @@ -178,6 +185,7 @@ def list(self, request, slug, project_id): ) except Exception as e: + print(e) capture_exception(e) return Response( {"error": "Something went wrong please try again later"}, diff --git a/apiserver/plane/api/views/workspace.py b/apiserver/plane/api/views/workspace.py index e03a80e821c..e8695c8182e 100644 --- a/apiserver/plane/api/views/workspace.py +++ b/apiserver/plane/api/views/workspace.py @@ -10,7 +10,7 @@ from django.core.exceptions import ValidationError from django.core.validators import validate_email from django.contrib.sites.shortcuts import get_current_site -from django.db.models import CharField, Count +from django.db.models import CharField, Count, OuterRef, Func, F from django.db.models.functions import Cast # Third party modules @@ -111,6 +111,14 @@ class UserWorkSpacesEndpoint(BaseAPIView): def get(self, request): try: + + member_count = ( + WorkspaceMember.objects.filter(workspace=OuterRef("id")) + .order_by() + .annotate(count=Func(F("id"), function="Count")) + .values("count") + ) + workspace = ( Workspace.objects.prefetch_related( Prefetch("workspace_member", queryset=WorkspaceMember.objects.all()) @@ -119,7 +127,7 @@ def get(self, request): workspace_member__member=request.user, ) .select_related("owner") - ).annotate(total_members=Count("workspace_member")) + ).annotate(total_members=member_count) serializer = WorkSpaceSerializer(self.filter_queryset(workspace), many=True) return Response(serializer.data, status=status.HTTP_200_OK) From a0992d59c14a7012cfcdb386dac91d43dfa4a8fe Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Wed, 25 Jan 2023 15:11:50 +0530 Subject: [PATCH 2/2] refactor: add sub issue count in modules cycles and my issues endpoint --- apiserver/plane/api/serializers/cycle.py | 4 ++++ apiserver/plane/api/serializers/module.py | 3 ++- apiserver/plane/api/views/cycle.py | 9 +++++++++ apiserver/plane/api/views/issue.py | 6 ++++++ apiserver/plane/api/views/module.py | 8 +++++++- 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/apiserver/plane/api/serializers/cycle.py b/apiserver/plane/api/serializers/cycle.py index 4e125bfaeb1..09f35b66940 100644 --- a/apiserver/plane/api/serializers/cycle.py +++ b/apiserver/plane/api/serializers/cycle.py @@ -1,3 +1,6 @@ +# Third party imports +from rest_framework import serializers + # Module imports from .base import BaseSerializer from .user import UserLiteSerializer @@ -22,6 +25,7 @@ class Meta: class CycleIssueSerializer(BaseSerializer): issue_detail = IssueStateSerializer(read_only=True, source="issue") + sub_issues_count = serializers.IntegerField(read_only=True) class Meta: model = CycleIssue diff --git a/apiserver/plane/api/serializers/module.py b/apiserver/plane/api/serializers/module.py index 1d3748f8d6f..9f165dd282d 100644 --- a/apiserver/plane/api/serializers/module.py +++ b/apiserver/plane/api/serializers/module.py @@ -150,6 +150,7 @@ class ModuleIssueSerializer(BaseSerializer): module_detail = ModuleFlatSerializer(read_only=True, source="module") issue_detail = IssueStateSerializer(read_only=True, source="issue") + sub_issues_count = serializers.IntegerField(read_only=True) class Meta: model = ModuleIssue @@ -200,4 +201,4 @@ class Meta: "updated_by", "created_at", "updated_at", - ] \ No newline at end of file + ] diff --git a/apiserver/plane/api/views/cycle.py b/apiserver/plane/api/views/cycle.py index 28125512f90..d1b291d9a2b 100644 --- a/apiserver/plane/api/views/cycle.py +++ b/apiserver/plane/api/views/cycle.py @@ -1,3 +1,6 @@ +# Django imports +from django.db.models import OuterRef, Func, F + # Third party imports from rest_framework.response import Response from rest_framework import status @@ -56,6 +59,12 @@ def get_queryset(self): return self.filter_queryset( super() .get_queryset() + .annotate( + sub_issues_count=Issue.objects.filter(parent=OuterRef("issue_id")) + .order_by() + .annotate(count=Func(F("id"), function="Count")) + .values("count") + ) .filter(workspace__slug=self.kwargs.get("slug")) .filter(project_id=self.kwargs.get("project_id")) .filter(project__project_projectmember__member=self.request.user) diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index 13ecf8996af..4212934bf95 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -226,6 +226,12 @@ def get(self, request, slug): try: issues = ( Issue.objects.filter(assignees__in=[request.user], workspace__slug=slug) + .annotate( + sub_issues_count=Issue.objects.filter(parent=OuterRef("id")) + .order_by() + .annotate(count=Func(F("id"), function="Count")) + .values("count") + ) .select_related("project") .select_related("workspace") .select_related("state") diff --git a/apiserver/plane/api/views/module.py b/apiserver/plane/api/views/module.py index 4c121f23f24..9955ded76a2 100644 --- a/apiserver/plane/api/views/module.py +++ b/apiserver/plane/api/views/module.py @@ -1,6 +1,6 @@ # Django Imports from django.db import IntegrityError -from django.db.models import Prefetch +from django.db.models import Prefetch, F, OuterRef, Func # Third party imports from rest_framework.response import Response @@ -118,6 +118,12 @@ def get_queryset(self): return self.filter_queryset( super() .get_queryset() + .annotate( + sub_issues_count=Issue.objects.filter(parent=OuterRef("issue")) + .order_by() + .annotate(count=Func(F("id"), function="Count")) + .values("count") + ) .filter(workspace__slug=self.kwargs.get("slug")) .filter(project_id=self.kwargs.get("project_id")) .filter(module_id=self.kwargs.get("module_id"))