diff --git a/apps/api/plane/api/views/issue.py b/apps/api/plane/api/views/issue.py index 94dc9e1d0..5a75503d7 100644 --- a/apps/api/plane/api/views/issue.py +++ b/apps/api/plane/api/views/issue.py @@ -331,6 +331,10 @@ class IssueListCreateAPIEndpoint(BaseAPIView): ) ) + total_issue_queryset = Issue.issue_objects.filter( + project_id=project_id, workspace__slug=slug + ) + # Priority Ordering if order_by_param == "priority" or order_by_param == "-priority": priority_order = ( @@ -390,6 +394,7 @@ class IssueListCreateAPIEndpoint(BaseAPIView): return self.paginate( request=request, queryset=(issue_queryset), + total_count_queryset=total_issue_queryset, on_results=lambda issues: IssueSerializer( issues, many=True, fields=self.fields, expand=self.expand ).data, diff --git a/apps/api/plane/app/views/issue/archive.py b/apps/api/plane/app/views/issue/archive.py index 118d1e7f9..122f4bdc8 100644 --- a/apps/api/plane/app/views/issue/archive.py +++ b/apps/api/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, Subquery +from django.db.models import F, Func, OuterRef, Q, Prefetch, Exists, Subquery, Count from django.utils import timezone from django.utils.decorators import method_decorator from django.views.decorators.gzip import gzip_page @@ -69,25 +69,31 @@ class IssueArchiveViewSet(BaseViewSet): ) ) .annotate( - link_count=IssueLink.objects.filter(issue=OuterRef("id")) - .order_by() - .annotate(count=Func(F("id"), function="Count")) - .values("count") - ) - .annotate( - attachment_count=FileAsset.objects.filter( - issue_id=OuterRef("id"), - entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT, + link_count=Subquery( + IssueLink.objects.filter(issue=OuterRef("id")) + .values("issue") + .annotate(count=Count("id")) + .values("count") ) - .order_by() - .annotate(count=Func(F("id"), function="Count")) - .values("count") ) .annotate( - sub_issues_count=Issue.issue_objects.filter(parent=OuterRef("id")) - .order_by() - .annotate(count=Func(F("id"), function="Count")) - .values("count") + attachment_count=Subquery( + FileAsset.objects.filter( + issue_id=OuterRef("id"), + entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT, + ) + .values("issue_id") + .annotate(count=Count("id")) + .values("count") + ) + ) + .annotate( + sub_issues_count=Subquery( + Issue.issue_objects.filter(parent=OuterRef("id")) + .values("parent") + .annotate(count=Count("id")) + .values("count") + ) ) ) @@ -101,6 +107,19 @@ class IssueArchiveViewSet(BaseViewSet): issue_queryset = self.get_queryset().filter(**filters) + total_issue_queryset = Issue.objects.filter( + deleted_at__isnull=True, + archived_at__isnull=False, + project_id=project_id, + workspace__slug=slug, + ).filter(**filters) + + total_issue_queryset = ( + total_issue_queryset + if show_sub_issues == "true" + else total_issue_queryset.filter(parent__isnull=True) + ) + issue_queryset = ( issue_queryset if show_sub_issues == "true" @@ -136,6 +155,7 @@ class IssueArchiveViewSet(BaseViewSet): request=request, order_by=order_by_param, queryset=issue_queryset, + total_count_queryset=total_issue_queryset, on_results=lambda issues: issue_on_results( group_by=group_by, issues=issues, sub_group_by=sub_group_by ), @@ -170,6 +190,7 @@ class IssueArchiveViewSet(BaseViewSet): request=request, order_by=order_by_param, queryset=issue_queryset, + total_count_queryset=total_issue_queryset, on_results=lambda issues: issue_on_results( group_by=group_by, issues=issues, sub_group_by=sub_group_by ), @@ -196,6 +217,7 @@ class IssueArchiveViewSet(BaseViewSet): order_by=order_by_param, request=request, queryset=issue_queryset, + total_count_queryset=total_issue_queryset, on_results=lambda issues: issue_on_results( group_by=group_by, issues=issues, sub_group_by=sub_group_by ), diff --git a/apps/api/plane/app/views/issue/base.py b/apps/api/plane/app/views/issue/base.py index 6944ed98f..21e5eaf70 100644 --- a/apps/api/plane/app/views/issue/base.py +++ b/apps/api/plane/app/views/issue/base.py @@ -213,27 +213,33 @@ class IssueViewSet(BaseViewSet): ) ) .annotate( - link_count=IssueLink.objects.filter(issue=OuterRef("id")) - .order_by() - .annotate(count=Func(F("id"), function="Count")) - .values("count") - ) - .annotate( - attachment_count=FileAsset.objects.filter( - issue_id=OuterRef("id"), - entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT, + link_count=Subquery( + IssueLink.objects.filter(issue=OuterRef("id")) + .values("issue") + .annotate(count=Count("id")) + .values("count") ) - .order_by() - .annotate(count=Func(F("id"), function="Count")) - .values("count") ) .annotate( - sub_issues_count=Issue.issue_objects.filter(parent=OuterRef("id")) - .order_by() - .annotate(count=Func(F("id"), function="Count")) - .values("count") + attachment_count=Subquery( + FileAsset.objects.filter( + issue_id=OuterRef("id"), + entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT, + ) + .values("issue_id") + .annotate(count=Count("id")) + .values("count") + ) ) - ).distinct() + .annotate( + sub_issues_count=Subquery( + Issue.issue_objects.filter(parent=OuterRef("id")) + .values("parent") + .annotate(count=Count("id")) + .values("count") + ) + ) + ) @method_decorator(gzip_page) @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST]) @@ -249,6 +255,10 @@ class IssueViewSet(BaseViewSet): issue_queryset = self.get_queryset().filter(**filters, **extra_filters) # Custom ordering for priority and state + total_issue_queryset = Issue.issue_objects.filter( + project_id=project_id, workspace__slug=slug + ).filter(**filters, **extra_filters) + # Issue queryset issue_queryset, order_by_param = order_issue_queryset( issue_queryset=issue_queryset, order_by_param=order_by_param @@ -281,6 +291,7 @@ class IssueViewSet(BaseViewSet): and not project.guest_view_all_features ): issue_queryset = issue_queryset.filter(created_by=request.user) + total_issue_queryset = total_issue_queryset.filter(created_by=request.user) if group_by: if sub_group_by: @@ -296,6 +307,7 @@ class IssueViewSet(BaseViewSet): request=request, order_by=order_by_param, queryset=issue_queryset, + total_count_queryset=total_issue_queryset, on_results=lambda issues: issue_on_results( group_by=group_by, issues=issues, sub_group_by=sub_group_by ), @@ -329,6 +341,7 @@ class IssueViewSet(BaseViewSet): request=request, order_by=order_by_param, queryset=issue_queryset, + total_count_queryset=total_issue_queryset, on_results=lambda issues: issue_on_results( group_by=group_by, issues=issues, sub_group_by=sub_group_by ), @@ -354,6 +367,7 @@ class IssueViewSet(BaseViewSet): order_by=order_by_param, request=request, queryset=issue_queryset, + total_count_queryset=total_issue_queryset, on_results=lambda issues: issue_on_results( group_by=group_by, issues=issues, sub_group_by=sub_group_by ), diff --git a/apps/api/plane/utils/paginator.py b/apps/api/plane/utils/paginator.py index ce9c65f64..0d065e253 100644 --- a/apps/api/plane/utils/paginator.py +++ b/apps/api/plane/utils/paginator.py @@ -160,7 +160,7 @@ class OffsetPaginator: total_count = ( self.total_count_queryset.count() if self.total_count_queryset - else results.count() + else queryset.count() ) # Check if there are more results available after the current page