chore: total issues count for issue listing endpoint (#2534)

* chore: total issues count for issue listing endpoint

* dev: add print for DEBUG mode

* fix: changed assignees_list and label_list

---------

Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
This commit is contained in:
Nikhil 2023-10-27 15:30:28 +05:30 committed by GitHub
parent 597ea26d7b
commit 55b2927a17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 61 additions and 26 deletions

View File

@ -75,13 +75,13 @@ class IssueCreateSerializer(BaseSerializer):
project_detail = ProjectLiteSerializer(read_only=True, source="project") project_detail = ProjectLiteSerializer(read_only=True, source="project")
workspace_detail = WorkspaceLiteSerializer(read_only=True, source="workspace") workspace_detail = WorkspaceLiteSerializer(read_only=True, source="workspace")
assignees_list = serializers.ListField( assignees = serializers.ListField(
child=serializers.PrimaryKeyRelatedField(queryset=User.objects.all()), child=serializers.PrimaryKeyRelatedField(queryset=User.objects.all()),
write_only=True, write_only=True,
required=False, required=False,
) )
labels_list = serializers.ListField( labels = serializers.ListField(
child=serializers.PrimaryKeyRelatedField(queryset=Label.objects.all()), child=serializers.PrimaryKeyRelatedField(queryset=Label.objects.all()),
write_only=True, write_only=True,
required=False, required=False,
@ -99,6 +99,12 @@ class IssueCreateSerializer(BaseSerializer):
"updated_at", "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): def validate(self, data):
if ( if (
data.get("start_date", None) is not None data.get("start_date", None) is not None
@ -109,8 +115,8 @@ class IssueCreateSerializer(BaseSerializer):
return data return data
def create(self, validated_data): def create(self, validated_data):
assignees = validated_data.pop("assignees_list", None) assignees = validated_data.pop("assignees", None)
labels = validated_data.pop("labels_list", None) labels = validated_data.pop("labels", None)
project_id = self.context["project_id"] project_id = self.context["project_id"]
workspace_id = self.context["workspace_id"] workspace_id = self.context["workspace_id"]
@ -168,8 +174,8 @@ class IssueCreateSerializer(BaseSerializer):
return issue return issue
def update(self, instance, validated_data): def update(self, instance, validated_data):
assignees = validated_data.pop("assignees_list", None) assignees = validated_data.pop("assignees", None)
labels = validated_data.pop("labels_list", None) labels = validated_data.pop("labels", None)
# Related models # Related models
project_id = instance.project_id project_id = instance.project_id

View File

@ -84,6 +84,7 @@ class BaseViewSet(TimezoneMixin, ModelViewSet, BasePaginator):
capture_exception(e) capture_exception(e)
return Response({"error": f"key {e} does not exist"}, status=status.HTTP_400_BAD_REQUEST) 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) capture_exception(e)
return Response({"error": "Something went wrong please try again later"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) 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): if isinstance(e, KeyError):
return Response({"error": f"key {e} does not exist"}, status=status.HTTP_400_BAD_REQUEST) 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) capture_exception(e)
return Response({"error": "Something went wrong please try again later"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) return Response({"error": "Something went wrong please try again later"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

View File

@ -579,6 +579,7 @@ class CycleIssueViewSet(BaseViewSet):
) )
) )
total_issues = issues.count()
issues_data = IssueStateSerializer(issues, many=True).data issues_data = IssueStateSerializer(issues, many=True).data
if sub_group_by and sub_group_by == group_by: if sub_group_by and sub_group_by == group_by:
@ -588,14 +589,14 @@ class CycleIssueViewSet(BaseViewSet):
) )
if group_by: if group_by:
grouped_results = group_results(issues_data, group_by, sub_group_by)
return Response( return Response(
group_results(issues_data, group_by, sub_group_by), {"data": grouped_results, "total_issues": total_issues},
status=status.HTTP_200_OK, status=status.HTTP_200_OK,
) )
return Response( return Response(
issues_data, {"data": issues_data, "total_issues": total_issues}, status=status.HTTP_200_OK
status=status.HTTP_200_OK,
) )
def create(self, request, slug, project_id, cycle_id): def create(self, request, slug, project_id, cycle_id):

View File

@ -217,6 +217,7 @@ class IssueViewSet(BaseViewSet):
else: else:
issue_queryset = issue_queryset.order_by(order_by_param) issue_queryset = issue_queryset.order_by(order_by_param)
total_issues = issue_queryset.count()
issues = IssueLiteSerializer(issue_queryset, many=True).data issues = IssueLiteSerializer(issue_queryset, many=True).data
## Grouping the results ## Grouping the results
@ -229,12 +230,16 @@ class IssueViewSet(BaseViewSet):
) )
if group_by: if group_by:
grouped_results = group_results(issues, group_by, sub_group_by)
return Response( return Response(
group_results(issues, group_by, sub_group_by), {"data": grouped_results, "total_issues": total_issues},
status=status.HTTP_200_OK, 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): def create(self, request, slug, project_id):
project = Project.objects.get(pk=project_id) project = Project.objects.get(pk=project_id)
@ -421,6 +426,7 @@ class UserWorkSpaceIssues(BaseAPIView):
else: else:
issue_queryset = issue_queryset.order_by(order_by_param) issue_queryset = issue_queryset.order_by(order_by_param)
total_issues = issue_queryset.count()
issues = IssueLiteSerializer(issue_queryset, many=True).data issues = IssueLiteSerializer(issue_queryset, many=True).data
## Grouping the results ## Grouping the results
@ -433,12 +439,15 @@ class UserWorkSpaceIssues(BaseAPIView):
) )
if group_by: if group_by:
grouped_results = group_results(issues, group_by, sub_group_by)
return Response( return Response(
group_results(issues, group_by, sub_group_by), {"data": grouped_results, "total_issues": total_issues},
status=status.HTTP_200_OK, 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): class WorkSpaceIssuesEndpoint(BaseAPIView):
@ -1165,9 +1174,7 @@ class IssueSubscriberViewSet(BaseViewSet):
def list(self, request, slug, project_id, issue_id): def list(self, request, slug, project_id, issue_id):
members = ( members = (
ProjectMember.objects.filter( ProjectMember.objects.filter(workspace__slug=slug, project_id=project_id)
workspace__slug=slug, project_id=project_id
)
.annotate( .annotate(
is_subscribed=Exists( is_subscribed=Exists(
IssueSubscriber.objects.filter( IssueSubscriber.objects.filter(
@ -2169,14 +2176,21 @@ class IssueDraftViewSet(BaseViewSet):
else: else:
issue_queryset = issue_queryset.order_by(order_by_param) issue_queryset = issue_queryset.order_by(order_by_param)
total_issues = issue_queryset.count()
issues = IssueLiteSerializer(issue_queryset, many=True).data issues = IssueLiteSerializer(issue_queryset, many=True).data
## Grouping the results ## Grouping the results
group_by = request.GET.get("group_by", False) group_by = request.GET.get("group_by", False)
if group_by: 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): def create(self, request, slug, project_id):
project = Project.objects.get(pk=project_id) project = Project.objects.get(pk=project_id)

View File

@ -361,7 +361,7 @@ class ModuleIssueViewSet(BaseViewSet):
.values("count") .values("count")
) )
) )
total_issues = issues.count()
issues_data = IssueStateSerializer(issues, many=True).data issues_data = IssueStateSerializer(issues, many=True).data
if sub_group_by and sub_group_by == group_by: if sub_group_by and sub_group_by == group_by:
@ -371,14 +371,14 @@ class ModuleIssueViewSet(BaseViewSet):
) )
if group_by: if group_by:
grouped_results = group_results(issues_data, group_by, sub_group_by)
return Response( return Response(
group_results(issues_data, group_by, sub_group_by), {"data": grouped_results, "total_issues": total_issues},
status=status.HTTP_200_OK, status=status.HTTP_200_OK,
) )
return Response( return Response(
issues_data, {"data": issues_data, "total_issues": total_issues}, status=status.HTTP_200_OK
status=status.HTTP_200_OK,
) )
def create(self, request, slug, project_id, module_id): def create(self, request, slug, project_id, module_id):

View File

@ -184,6 +184,7 @@ class GlobalViewIssuesViewSet(BaseViewSet):
else: else:
issue_queryset = issue_queryset.order_by(order_by_param) issue_queryset = issue_queryset.order_by(order_by_param)
total_issues = issue_queryset.count()
issues = IssueLiteSerializer(issue_queryset, many=True).data issues = IssueLiteSerializer(issue_queryset, many=True).data
## Grouping the results ## Grouping the results
@ -196,11 +197,15 @@ class GlobalViewIssuesViewSet(BaseViewSet):
) )
if group_by: if group_by:
grouped_results = group_results(issues, group_by, sub_group_by)
return Response( 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): class IssueViewViewSet(BaseViewSet):

View File

@ -1223,14 +1223,21 @@ class WorkspaceUserProfileIssuesEndpoint(BaseAPIView):
else: else:
issue_queryset = issue_queryset.order_by(order_by_param) issue_queryset = issue_queryset.order_by(order_by_param)
total_issues = issue_queryset.count()
issues = IssueLiteSerializer(issue_queryset, many=True).data issues = IssueLiteSerializer(issue_queryset, many=True).data
## Grouping the results ## Grouping the results
group_by = request.GET.get("group_by", False) group_by = request.GET.get("group_by", False)
if group_by: 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): class WorkspaceLabelsEndpoint(BaseAPIView):