refactor: update response structure for cycle issue and module issues (#432)

This commit is contained in:
pablohashescobar 2023-03-15 23:21:37 +05:30 committed by GitHub
parent c07cfee018
commit ab9e0cf559
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 61 additions and 11 deletions

View File

@ -434,6 +434,8 @@ class IssueStateSerializer(BaseSerializer):
project_detail = ProjectSerializer(read_only=True, source="project") project_detail = ProjectSerializer(read_only=True, source="project")
label_details = LabelSerializer(read_only=True, source="labels", many=True) label_details = LabelSerializer(read_only=True, source="labels", many=True)
assignee_details = UserLiteSerializer(read_only=True, source="assignees", many=True) assignee_details = UserLiteSerializer(read_only=True, source="assignees", many=True)
sub_issues_count = serializers.IntegerField(read_only=True)
bridge_id = serializers.UUIDField(read_only=True)
class Meta: class Meta:
model = Issue model = Issue

View File

@ -3,7 +3,7 @@ import json
# Django imports # Django imports
from django.db import IntegrityError from django.db import IntegrityError
from django.db.models import OuterRef, Func, F, Q, Exists, OuterRef from django.db.models import OuterRef, Func, F, Q, Exists, OuterRef, Prefetch
from django.core import serializers from django.core import serializers
from django.utils import timezone from django.utils import timezone
@ -18,9 +18,18 @@ from plane.api.serializers import (
CycleSerializer, CycleSerializer,
CycleIssueSerializer, CycleIssueSerializer,
CycleFavoriteSerializer, CycleFavoriteSerializer,
IssueStateSerializer,
) )
from plane.api.permissions import ProjectEntityPermission from plane.api.permissions import ProjectEntityPermission
from plane.db.models import Cycle, CycleIssue, Issue, CycleFavorite from plane.db.models import (
Cycle,
CycleIssue,
Issue,
CycleFavorite,
IssueBlocker,
IssueLink,
ModuleIssue,
)
from plane.bgtasks.issue_activites_task import issue_activity from plane.bgtasks.issue_activites_task import issue_activity
from plane.utils.grouper import group_results from plane.utils.grouper import group_results
@ -133,19 +142,38 @@ class CycleIssueViewSet(BaseViewSet):
def list(self, request, slug, project_id, cycle_id): def list(self, request, slug, project_id, cycle_id):
try: try:
order_by = request.GET.get("order_by", "created_at") order_by = request.GET.get("order_by", "created_at")
queryset = self.get_queryset().order_by(f"issue__{order_by}")
group_by = request.GET.get("group_by", False) group_by = request.GET.get("group_by", False)
cycle_issues = CycleIssueSerializer(queryset, many=True).data issues = (
Issue.objects.filter(issue_cycle__cycle_id=cycle_id)
.annotate(
sub_issues_count=Issue.objects.filter(parent=OuterRef("id"))
.order_by()
.annotate(count=Func(F("id"), function="Count"))
.values("count")
)
.annotate(bridge_id=F("issue_cycle__id"))
.filter(project_id=project_id)
.filter(workspace__slug=slug)
.select_related("project")
.select_related("workspace")
.select_related("state")
.select_related("parent")
.prefetch_related("assignees")
.prefetch_related("labels")
.order_by(order_by)
)
issues_data = IssueStateSerializer(issues, many=True).data
if group_by: if group_by:
return Response( return Response(
group_results(cycle_issues, f"issue_detail.{group_by}"), group_results(issues_data, group_by),
status=status.HTTP_200_OK, status=status.HTTP_200_OK,
) )
return Response( return Response(
cycle_issues, issues_data,
status=status.HTTP_200_OK, status=status.HTTP_200_OK,
) )
except Exception as e: except Exception as e:

View File

@ -19,6 +19,7 @@ from plane.api.serializers import (
ModuleIssueSerializer, ModuleIssueSerializer,
ModuleLinkSerializer, ModuleLinkSerializer,
ModuleFavoriteSerializer, ModuleFavoriteSerializer,
IssueStateSerializer,
) )
from plane.api.permissions import ProjectEntityPermission from plane.api.permissions import ProjectEntityPermission
from plane.db.models import ( from plane.db.models import (
@ -153,20 +154,39 @@ class ModuleIssueViewSet(BaseViewSet):
def list(self, request, slug, project_id, module_id): def list(self, request, slug, project_id, module_id):
try: try:
order_by = request.GET.get("order_by", "issue__created_at") order_by = request.GET.get("order_by", "created_at")
queryset = self.get_queryset().order_by(f"issue__{order_by}")
group_by = request.GET.get("group_by", False) group_by = request.GET.get("group_by", False)
module_issues = ModuleIssueSerializer(queryset, many=True).data issues = (
Issue.objects.filter(issue_module__module_id=module_id)
.annotate(
sub_issues_count=Issue.objects.filter(parent=OuterRef("id"))
.order_by()
.annotate(count=Func(F("id"), function="Count"))
.values("count")
)
.annotate(bridge_id=F("issue_module__id"))
.filter(project_id=project_id)
.filter(workspace__slug=slug)
.select_related("project")
.select_related("workspace")
.select_related("state")
.select_related("parent")
.prefetch_related("assignees")
.prefetch_related("labels")
.order_by(order_by)
)
issues_data = IssueStateSerializer(issues, many=True).data
if group_by: if group_by:
return Response( return Response(
group_results(module_issues, f"issue_detail.{group_by}"), group_results(issues_data, group_by),
status=status.HTTP_200_OK, status=status.HTTP_200_OK,
) )
return Response( return Response(
module_issues, issues_data,
status=status.HTTP_200_OK, status=status.HTTP_200_OK,
) )
except Exception as e: except Exception as e: