Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions apiserver/plane/api/serializers/cycle.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# Third party imports
from rest_framework import serializers

# Module imports
from .base import BaseSerializer
from .user import UserLiteSerializer
Expand All @@ -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
Expand Down
3 changes: 2 additions & 1 deletion apiserver/plane/api/serializers/issue.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -443,4 +444,4 @@ class Meta:
"updated_by",
"created_at",
"updated_at",
]
]
3 changes: 2 additions & 1 deletion apiserver/plane/api/serializers/module.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -200,4 +201,4 @@ class Meta:
"updated_by",
"created_at",
"updated_at",
]
]
9 changes: 9 additions & 0 deletions apiserver/plane/api/views/cycle.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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)
Expand Down
16 changes: 15 additions & 1 deletion apiserver/plane/api/views/issue.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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"},
Expand Down Expand Up @@ -218,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")
Expand Down
8 changes: 7 additions & 1 deletion apiserver/plane/api/views/module.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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"))
Expand Down
12 changes: 10 additions & 2 deletions apiserver/plane/api/views/workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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())
Expand 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)
Expand Down