From 32ab7951f715b9f23c8f5e2b7a7dfd4070a3f4e6 Mon Sep 17 00:00:00 2001 From: pablohashescobar <118773738+pablohashescobar@users.noreply.github.com> Date: Sat, 25 Mar 2023 23:56:53 +0530 Subject: [PATCH] perf: update issue serializer (#534) --- apiserver/plane/api/serializers/__init__.py | 4 +- apiserver/plane/api/serializers/issue.py | 37 ++++++- apiserver/plane/api/serializers/project.py | 7 ++ apiserver/plane/api/serializers/state.py | 12 ++ apiserver/plane/api/views/issue.py | 117 +++----------------- apiserver/plane/api/views/page.py | 4 +- apiserver/plane/api/views/view.py | 42 +------ 7 files changed, 76 insertions(+), 147 deletions(-) diff --git a/apiserver/plane/api/serializers/__init__.py b/apiserver/plane/api/serializers/__init__.py index 71ee447f5..bd34a668e 100644 --- a/apiserver/plane/api/serializers/__init__.py +++ b/apiserver/plane/api/serializers/__init__.py @@ -18,8 +18,9 @@ from .project import ( ProjectMemberInviteSerializer, ProjectIdentifierSerializer, ProjectFavoriteSerializer, + ProjectLiteSerializer, ) -from .state import StateSerializer +from .state import StateSerializer, StateLiteSerializer from .shortcut import ShortCutSerializer from .view import IssueViewSerializer, IssueViewFavoriteSerializer from .cycle import CycleSerializer, CycleIssueSerializer, CycleFavoriteSerializer @@ -38,6 +39,7 @@ from .issue import ( IssueFlatSerializer, IssueStateSerializer, IssueLinkSerializer, + IssueLiteSerializer, ) from .module import ( diff --git a/apiserver/plane/api/serializers/issue.py b/apiserver/plane/api/serializers/issue.py index 171bdf2d2..fdc5e4b68 100644 --- a/apiserver/plane/api/serializers/issue.py +++ b/apiserver/plane/api/serializers/issue.py @@ -4,9 +4,9 @@ from rest_framework import serializers # Module imports from .base import BaseSerializer from .user import UserLiteSerializer -from .state import StateSerializer +from .state import StateSerializer, StateLiteSerializer from .user import UserLiteSerializer -from .project import ProjectSerializer +from .project import ProjectSerializer, ProjectLiteSerializer from .workspace import WorkSpaceSerializer from plane.db.models import ( User, @@ -305,6 +305,16 @@ class LabelSerializer(BaseSerializer): ] +class LabelLiteSerializer(BaseSerializer): + class Meta: + model = Label + fields = [ + "id", + "name", + "color", + ] + + class IssueLabelSerializer(BaseSerializer): # label_details = LabelSerializer(read_only=True, source="label") @@ -468,3 +478,26 @@ class IssueSerializer(BaseSerializer): "created_at", "updated_at", ] + + +class IssueLiteSerializer(BaseSerializer): + project_detail = ProjectLiteSerializer(read_only=True, source="project") + state_detail = StateLiteSerializer(read_only=True, source="state") + label_details = LabelLiteSerializer(read_only=True, source="labels", many=True) + assignee_details = UserLiteSerializer(read_only=True, source="assignees", many=True) + sub_issues_count = serializers.IntegerField(read_only=True) + + class Meta: + model = Issue + fields = "__all__" + read_only_fields = [ + "start_date", + "target_date", + "completed_at", + "workspace", + "project", + "created_by", + "updated_by", + "created_at", + "updated_at", + ] diff --git a/apiserver/plane/api/serializers/project.py b/apiserver/plane/api/serializers/project.py index 61d09b4a8..2bdfdf02c 100644 --- a/apiserver/plane/api/serializers/project.py +++ b/apiserver/plane/api/serializers/project.py @@ -118,3 +118,10 @@ class ProjectFavoriteSerializer(BaseSerializer): "workspace", "user", ] + + +class ProjectLiteSerializer(BaseSerializer): + class Meta: + model = Project + fields = ["id", "identifier", "name"] + read_only_fields = fields diff --git a/apiserver/plane/api/serializers/state.py b/apiserver/plane/api/serializers/state.py index 6917f8d69..37e94d661 100644 --- a/apiserver/plane/api/serializers/state.py +++ b/apiserver/plane/api/serializers/state.py @@ -12,3 +12,15 @@ class StateSerializer(BaseSerializer): "workspace", "project", ] + + +class StateLiteSerializer(BaseSerializer): + class Meta: + model = State + fields = [ + "id", + "name", + "color", + "group", + ] + read_only_fields = fields diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index 9447fff95..d609d2678 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -26,6 +26,7 @@ from plane.api.serializers import ( LabelSerializer, IssueFlatSerializer, IssueLinkSerializer, + IssueLiteSerializer, ) from plane.api.permissions import ( ProjectEntityPermission, @@ -136,40 +137,6 @@ class IssueViewSet(BaseViewSet): .select_related("parent") .prefetch_related("assignees") .prefetch_related("labels") - .prefetch_related( - Prefetch( - "blocked_issues", - queryset=IssueBlocker.objects.select_related("blocked_by", "block"), - ) - ) - .prefetch_related( - Prefetch( - "blocker_issues", - queryset=IssueBlocker.objects.select_related("block", "blocked_by"), - ) - ) - .prefetch_related( - Prefetch( - "issue_cycle", - queryset=CycleIssue.objects.select_related("cycle", "issue"), - ), - ) - .prefetch_related( - Prefetch( - "issue_module", - queryset=ModuleIssue.objects.select_related( - "module", "issue" - ).prefetch_related("module__members"), - ), - ) - .prefetch_related( - Prefetch( - "issue_link", - queryset=IssueLink.objects.select_related("issue").select_related( - "created_by" - ), - ) - ) ) def list(self, request, slug, project_id): @@ -189,7 +156,7 @@ class IssueViewSet(BaseViewSet): else issue_queryset.filter(parent__isnull=True) ) - issues = IssueSerializer(issue_queryset, many=True).data + issues = IssueLiteSerializer(issue_queryset, many=True).data ## Grouping the results group_by = request.GET.get("group_by", False) @@ -201,7 +168,6 @@ class IssueViewSet(BaseViewSet): return Response(issues, status=status.HTTP_200_OK) except Exception as e: - print(e) capture_exception(e) return Response( {"error": "Something went wrong please try again later"}, @@ -239,6 +205,17 @@ class IssueViewSet(BaseViewSet): {"error": "Project was not found"}, status=status.HTTP_404_NOT_FOUND ) + def retrieve(self, request, slug, project_id, pk=None): + try: + issue = Issue.objects.get( + workspace__slug=slug, project_id=project_id, pk=pk + ) + return Response(IssueSerializer(issue).data, status=status.HTTP_200_OK) + except Issue.DoesNotExist: + return Response( + {"error": "Issue Does not exist"}, status=status.HTTP_404_NOT_FOUND + ) + class UserWorkSpaceIssues(BaseAPIView): def get(self, request, slug): @@ -257,45 +234,9 @@ class UserWorkSpaceIssues(BaseAPIView): .select_related("parent") .prefetch_related("assignees") .prefetch_related("labels") - .prefetch_related( - Prefetch( - "blocked_issues", - queryset=IssueBlocker.objects.select_related( - "blocked_by", "block" - ), - ) - ) - .prefetch_related( - Prefetch( - "blocker_issues", - queryset=IssueBlocker.objects.select_related( - "block", "blocked_by" - ), - ) - ) - .prefetch_related( - Prefetch( - "issue_cycle", - queryset=CycleIssue.objects.select_related("cycle", "issue"), - ), - ) - .prefetch_related( - Prefetch( - "issue_module", - queryset=ModuleIssue.objects.select_related("module", "issue"), - ), - ) - .prefetch_related( - Prefetch( - "issue_link", - queryset=IssueLink.objects.select_related( - "issue" - ).select_related("created_by"), - ) - ) .order_by("-created_at") ) - serializer = IssueSerializer(issues, many=True) + serializer = IssueLiteSerializer(issues, many=True) return Response(serializer.data, status=status.HTTP_200_OK) except Exception as e: capture_exception(e) @@ -625,37 +566,9 @@ class SubIssuesEndpoint(BaseAPIView): .select_related("parent") .prefetch_related("assignees") .prefetch_related("labels") - .prefetch_related( - Prefetch( - "blocked_issues", - queryset=IssueBlocker.objects.select_related( - "blocked_by", "block" - ), - ) - ) - .prefetch_related( - Prefetch( - "blocker_issues", - queryset=IssueBlocker.objects.select_related( - "block", "blocked_by" - ), - ) - ) - .prefetch_related( - Prefetch( - "issue_cycle", - queryset=CycleIssue.objects.select_related("cycle", "issue"), - ), - ) - .prefetch_related( - Prefetch( - "issue_module", - queryset=ModuleIssue.objects.select_related("module", "issue"), - ), - ) ) - serializer = IssueSerializer(sub_issues, many=True) + serializer = IssueLiteSerializer(sub_issues, many=True) return Response(serializer.data, status=status.HTTP_200_OK) except Exception as e: capture_exception(e) diff --git a/apiserver/plane/api/views/page.py b/apiserver/plane/api/views/page.py index 868a03996..dbedb15fb 100644 --- a/apiserver/plane/api/views/page.py +++ b/apiserver/plane/api/views/page.py @@ -26,7 +26,7 @@ from plane.api.serializers import ( PageSerializer, PageBlockSerializer, PageFavoriteSerializer, - IssueSerializer, + IssueLiteSerializer, ) @@ -217,7 +217,7 @@ class CreateIssueFromPageBlockEndpoint(BaseAPIView): page_block.issue = issue page_block.save() - return Response(IssueSerializer(issue).data, status=status.HTTP_200_OK) + return Response(IssueLiteSerializer(issue).data, status=status.HTTP_200_OK) except PageBlock.DoesNotExist: return Response( {"error": "Page Block does not exist"}, status=status.HTTP_404_NOT_FOUND diff --git a/apiserver/plane/api/views/view.py b/apiserver/plane/api/views/view.py index bcd0be957..8c0c9267f 100644 --- a/apiserver/plane/api/views/view.py +++ b/apiserver/plane/api/views/view.py @@ -11,7 +11,7 @@ from sentry_sdk import capture_exception from . import BaseViewSet, BaseAPIView from plane.api.serializers import ( IssueViewSerializer, - IssueSerializer, + IssueLiteSerializer, IssueViewFavoriteSerializer, ) from plane.api.permissions import ProjectEntityPermission @@ -81,47 +81,9 @@ class ViewIssuesEndpoint(BaseAPIView): .select_related("parent") .prefetch_related("assignees") .prefetch_related("labels") - .prefetch_related( - Prefetch( - "blocked_issues", - queryset=IssueBlocker.objects.select_related( - "blocked_by", "block" - ), - ) - ) - .prefetch_related( - Prefetch( - "blocker_issues", - queryset=IssueBlocker.objects.select_related( - "block", "blocked_by" - ), - ) - ) - .prefetch_related( - Prefetch( - "issue_cycle", - queryset=CycleIssue.objects.select_related("cycle", "issue"), - ), - ) - .prefetch_related( - Prefetch( - "issue_module", - queryset=ModuleIssue.objects.select_related( - "module", "issue" - ).prefetch_related("module__members"), - ), - ) - .prefetch_related( - Prefetch( - "issue_link", - queryset=IssueLink.objects.select_related( - "issue" - ).select_related("created_by"), - ) - ) ) - serializer = IssueSerializer(issues, many=True) + serializer = IssueLiteSerializer(issues, many=True) return Response(serializer.data, status=status.HTTP_200_OK) except IssueView.DoesNotExist: return Response(