chore: v3 global issues (#2938)

This commit is contained in:
Bavisetti Narayan 2023-11-29 19:08:14 +05:30 committed by GitHub
parent 6d97dd814a
commit c7a3d8f0a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 62 additions and 1 deletions

View File

@ -6,6 +6,7 @@ from plane.app.views import (
GlobalViewViewSet, GlobalViewViewSet,
GlobalViewIssuesViewSet, GlobalViewIssuesViewSet,
IssueViewFavoriteViewSet, IssueViewFavoriteViewSet,
GlobalViewIssuesGroupedEndpoint
) )
@ -63,6 +64,11 @@ urlpatterns = [
), ),
name="global-view-issues", name="global-view-issues",
), ),
path(
"v3/workspaces/<str:slug>/issues/",
GlobalViewIssuesGroupedEndpoint.as_view(),
name="global-view-issues",
),
path( path(
"workspaces/<str:slug>/projects/<uuid:project_id>/user-favorite-views/", "workspaces/<str:slug>/projects/<uuid:project_id>/user-favorite-views/",
IssueViewFavoriteViewSet.as_view( IssueViewFavoriteViewSet.as_view(

View File

@ -52,6 +52,7 @@ from .view import (
GlobalViewIssuesViewSet, GlobalViewIssuesViewSet,
IssueViewViewSet, IssueViewViewSet,
IssueViewFavoriteViewSet, IssueViewFavoriteViewSet,
GlobalViewIssuesGroupedEndpoint
) )
from .cycle import ( from .cycle import (
CycleViewSet, CycleViewSet,

View File

@ -20,7 +20,7 @@ from rest_framework.response import Response
from rest_framework import status from rest_framework import status
# Module imports # Module imports
from . import BaseViewSet from . import BaseViewSet, BaseAPIView
from plane.app.serializers import ( from plane.app.serializers import (
GlobalViewSerializer, GlobalViewSerializer,
IssueViewSerializer, IssueViewSerializer,
@ -198,6 +198,60 @@ class GlobalViewIssuesViewSet(BaseViewSet):
return Response(issues, status=status.HTTP_200_OK) return Response(issues, status=status.HTTP_200_OK)
class GlobalViewIssuesGroupedEndpoint(BaseAPIView):
permission_classes = [
WorkspaceEntityPermission,
]
def get(self, request, slug):
filters = issue_filters(request.query_params, "GET")
fields = [field for field in request.GET.get("fields", "").split(",") if field]
issue_queryset = (
Issue.issue_objects.annotate(
sub_issues_count=Issue.issue_objects.filter(parent=OuterRef("id"))
.order_by()
.annotate(count=Func(F("id"), function="Count"))
.values("count")
)
.filter(workspace__slug=self.kwargs.get("slug"))
.filter(project__project_projectmember__member=self.request.user)
.filter(**filters)
.select_related("project")
.select_related("workspace")
.select_related("state")
.select_related("parent")
.prefetch_related("assignees")
.prefetch_related("labels")
.prefetch_related(
Prefetch(
"issue_reactions",
queryset=IssueReaction.objects.select_related("actor"),
)
)
.annotate(cycle_id=F("issue_cycle__cycle_id"))
.annotate(module_id=F("issue_module__module_id"))
.annotate(
link_count=IssueLink.objects.filter(issue=OuterRef("id"))
.order_by()
.annotate(count=Func(F("id"), function="Count"))
.values("count")
)
.annotate(
attachment_count=IssueAttachment.objects.filter(issue=OuterRef("id"))
.order_by()
.annotate(count=Func(F("id"), function="Count"))
.values("count")
)
)
issues = IssueLiteSerializer(issue_queryset, many=True, fields=fields if fields else None).data
issue_dict = {str(issue["id"]): issue for issue in issues}
return Response(
issue_dict,
status=status.HTTP_200_OK,
)
class IssueViewViewSet(BaseViewSet): class IssueViewViewSet(BaseViewSet):
serializer_class = IssueViewSerializer serializer_class = IssueViewSerializer
model = IssueView model = IssueView