diff --git a/apiserver/plane/api/serializers/issue.py b/apiserver/plane/api/serializers/issue.py index 57539f24c..2b64e22ef 100644 --- a/apiserver/plane/api/serializers/issue.py +++ b/apiserver/plane/api/serializers/issue.py @@ -75,13 +75,13 @@ class IssueCreateSerializer(BaseSerializer): project_detail = ProjectLiteSerializer(read_only=True, source="project") workspace_detail = WorkspaceLiteSerializer(read_only=True, source="workspace") - assignees_list = serializers.ListField( + assignees = serializers.ListField( child=serializers.PrimaryKeyRelatedField(queryset=User.objects.all()), write_only=True, required=False, ) - labels_list = serializers.ListField( + labels = serializers.ListField( child=serializers.PrimaryKeyRelatedField(queryset=Label.objects.all()), write_only=True, required=False, @@ -99,6 +99,12 @@ class IssueCreateSerializer(BaseSerializer): "updated_at", ] + def to_representation(self, instance): + data = super().to_representation(instance) + data['assignees'] = [str(assignee.id) for assignee in instance.assignees.all()] + data['labels'] = [str(label.id) for label in instance.labels.all()] + return data + def validate(self, data): if ( data.get("start_date", None) is not None @@ -109,8 +115,8 @@ class IssueCreateSerializer(BaseSerializer): return data def create(self, validated_data): - assignees = validated_data.pop("assignees_list", None) - labels = validated_data.pop("labels_list", None) + assignees = validated_data.pop("assignees", None) + labels = validated_data.pop("labels", None) project_id = self.context["project_id"] workspace_id = self.context["workspace_id"] @@ -168,8 +174,8 @@ class IssueCreateSerializer(BaseSerializer): return issue def update(self, instance, validated_data): - assignees = validated_data.pop("assignees_list", None) - labels = validated_data.pop("labels_list", None) + assignees = validated_data.pop("assignees", None) + labels = validated_data.pop("labels", None) # Related models project_id = instance.project_id diff --git a/apiserver/plane/api/views/base.py b/apiserver/plane/api/views/base.py index 538c8e484..7ab660e81 100644 --- a/apiserver/plane/api/views/base.py +++ b/apiserver/plane/api/views/base.py @@ -84,6 +84,7 @@ class BaseViewSet(TimezoneMixin, ModelViewSet, BasePaginator): capture_exception(e) return Response({"error": f"key {e} does not exist"}, status=status.HTTP_400_BAD_REQUEST) + print(e) if settings.DEBUG else print("Server Error") capture_exception(e) return Response({"error": "Something went wrong please try again later"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) @@ -161,6 +162,7 @@ class BaseAPIView(TimezoneMixin, APIView, BasePaginator): if isinstance(e, KeyError): return Response({"error": f"key {e} does not exist"}, status=status.HTTP_400_BAD_REQUEST) + print(e) if settings.DEBUG else print("Server Error") capture_exception(e) return Response({"error": "Something went wrong please try again later"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) diff --git a/apiserver/plane/api/views/cycle.py b/apiserver/plane/api/views/cycle.py index 7b14af4a2..cfab09801 100644 --- a/apiserver/plane/api/views/cycle.py +++ b/apiserver/plane/api/views/cycle.py @@ -579,6 +579,7 @@ class CycleIssueViewSet(BaseViewSet): ) ) + total_issues = issues.count() issues_data = IssueStateSerializer(issues, many=True).data if sub_group_by and sub_group_by == group_by: @@ -588,14 +589,14 @@ class CycleIssueViewSet(BaseViewSet): ) if group_by: + grouped_results = group_results(issues_data, group_by, sub_group_by) return Response( - group_results(issues_data, group_by, sub_group_by), + {"data": grouped_results, "total_issues": total_issues}, status=status.HTTP_200_OK, ) return Response( - issues_data, - status=status.HTTP_200_OK, + {"data": issues_data, "total_issues": total_issues}, status=status.HTTP_200_OK ) def create(self, request, slug, project_id, cycle_id): diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index be95c304e..e4a2f68b8 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -217,6 +217,7 @@ class IssueViewSet(BaseViewSet): else: issue_queryset = issue_queryset.order_by(order_by_param) + total_issues = issue_queryset.count() issues = IssueLiteSerializer(issue_queryset, many=True).data ## Grouping the results @@ -229,12 +230,16 @@ class IssueViewSet(BaseViewSet): ) if group_by: + grouped_results = group_results(issues, group_by, sub_group_by) return Response( - group_results(issues, group_by, sub_group_by), + {"data": grouped_results, "total_issues": total_issues}, status=status.HTTP_200_OK, ) - return Response(issues, status=status.HTTP_200_OK) + return Response( + {"data": issues, "total_issues": total_issues}, status=status.HTTP_200_OK + ) + def create(self, request, slug, project_id): project = Project.objects.get(pk=project_id) @@ -421,6 +426,7 @@ class UserWorkSpaceIssues(BaseAPIView): else: issue_queryset = issue_queryset.order_by(order_by_param) + total_issues = issue_queryset.count() issues = IssueLiteSerializer(issue_queryset, many=True).data ## Grouping the results @@ -433,12 +439,15 @@ class UserWorkSpaceIssues(BaseAPIView): ) if group_by: + grouped_results = group_results(issues, group_by, sub_group_by) return Response( - group_results(issues, group_by, sub_group_by), + {"data": grouped_results, "total_issues": total_issues}, status=status.HTTP_200_OK, ) - return Response(issues, status=status.HTTP_200_OK) + return Response( + {"data": issues, "total_issues": total_issues}, status=status.HTTP_200_OK + ) class WorkSpaceIssuesEndpoint(BaseAPIView): @@ -1165,9 +1174,7 @@ class IssueSubscriberViewSet(BaseViewSet): def list(self, request, slug, project_id, issue_id): members = ( - ProjectMember.objects.filter( - workspace__slug=slug, project_id=project_id - ) + ProjectMember.objects.filter(workspace__slug=slug, project_id=project_id) .annotate( is_subscribed=Exists( IssueSubscriber.objects.filter( @@ -2169,14 +2176,21 @@ class IssueDraftViewSet(BaseViewSet): else: issue_queryset = issue_queryset.order_by(order_by_param) + total_issues = issue_queryset.count() issues = IssueLiteSerializer(issue_queryset, many=True).data ## Grouping the results group_by = request.GET.get("group_by", False) if group_by: - return Response(group_results(issues, group_by), status=status.HTTP_200_OK) + grouped_results = group_results(issues, group_by) + return Response( + {"data": grouped_results, "total_issues": total_issues}, + status=status.HTTP_200_OK, + ) - return Response(issues, status=status.HTTP_200_OK) + return Response( + {"data": issues, "total_issues": total_issues}, status=status.HTTP_200_OK + ) def create(self, request, slug, project_id): project = Project.objects.get(pk=project_id) diff --git a/apiserver/plane/api/views/module.py b/apiserver/plane/api/views/module.py index ba088ea9c..45c52c0bf 100644 --- a/apiserver/plane/api/views/module.py +++ b/apiserver/plane/api/views/module.py @@ -361,7 +361,7 @@ class ModuleIssueViewSet(BaseViewSet): .values("count") ) ) - + total_issues = issues.count() issues_data = IssueStateSerializer(issues, many=True).data if sub_group_by and sub_group_by == group_by: @@ -371,14 +371,14 @@ class ModuleIssueViewSet(BaseViewSet): ) if group_by: + grouped_results = group_results(issues_data, group_by, sub_group_by) return Response( - group_results(issues_data, group_by, sub_group_by), + {"data": grouped_results, "total_issues": total_issues}, status=status.HTTP_200_OK, ) return Response( - issues_data, - status=status.HTTP_200_OK, + {"data": issues_data, "total_issues": total_issues}, status=status.HTTP_200_OK ) def create(self, request, slug, project_id, module_id): diff --git a/apiserver/plane/api/views/view.py b/apiserver/plane/api/views/view.py index 0e4b074c6..c549324a1 100644 --- a/apiserver/plane/api/views/view.py +++ b/apiserver/plane/api/views/view.py @@ -184,6 +184,7 @@ class GlobalViewIssuesViewSet(BaseViewSet): else: issue_queryset = issue_queryset.order_by(order_by_param) + total_issues = issue_queryset.count() issues = IssueLiteSerializer(issue_queryset, many=True).data ## Grouping the results @@ -196,11 +197,15 @@ class GlobalViewIssuesViewSet(BaseViewSet): ) if group_by: + grouped_results = group_results(issues, group_by, sub_group_by) return Response( - group_results(issues, group_by, sub_group_by), status=status.HTTP_200_OK + {"data": grouped_results, "total_issues": total_issues}, + status=status.HTTP_200_OK, ) - return Response(issues, status=status.HTTP_200_OK) + return Response( + {"data": issues, "total_issues": total_issues}, status=status.HTTP_200_OK + ) class IssueViewViewSet(BaseViewSet): diff --git a/apiserver/plane/api/views/workspace.py b/apiserver/plane/api/views/workspace.py index 9aa0ebcd9..e92859f14 100644 --- a/apiserver/plane/api/views/workspace.py +++ b/apiserver/plane/api/views/workspace.py @@ -1223,14 +1223,21 @@ class WorkspaceUserProfileIssuesEndpoint(BaseAPIView): else: issue_queryset = issue_queryset.order_by(order_by_param) + total_issues = issue_queryset.count() issues = IssueLiteSerializer(issue_queryset, many=True).data ## Grouping the results group_by = request.GET.get("group_by", False) if group_by: - return Response(group_results(issues, group_by), status=status.HTTP_200_OK) + grouped_results = group_results(issues, group_by) + return Response( + {"data": grouped_results, "total_issues": total_issues}, + status=status.HTTP_200_OK, + ) - return Response(issues, status=status.HTTP_200_OK) + return Response( + {"data": issues, "total_issues": total_issues}, status=status.HTTP_200_OK + ) class WorkspaceLabelsEndpoint(BaseAPIView):