From ec4332ea6b4c9c1a1cd753ba87a29de147e64208 Mon Sep 17 00:00:00 2001 From: pablohashescobar <118773738+pablohashescobar@users.noreply.github.com> Date: Mon, 27 Feb 2023 15:32:15 +0530 Subject: [PATCH] feat: filtering for cycle and module issue and updated grouper function for grouping in modules and cycles (#342) --- apiserver/plane/api/views/cycle.py | 31 ++++++++++++++++++++++++++++ apiserver/plane/api/views/module.py | 30 +++++++++++++++++++++++++-- apiserver/plane/utils/grouper.py | 32 ++++++++++++++++++++++++----- 3 files changed, 86 insertions(+), 7 deletions(-) diff --git a/apiserver/plane/api/views/cycle.py b/apiserver/plane/api/views/cycle.py index 2b18aab96b..682cdedcaf 100644 --- a/apiserver/plane/api/views/cycle.py +++ b/apiserver/plane/api/views/cycle.py @@ -16,6 +16,7 @@ from plane.api.serializers import CycleSerializer, CycleIssueSerializer from plane.api.permissions import ProjectEntityPermission from plane.db.models import Cycle, CycleIssue, Issue from plane.bgtasks.issue_activites_task import issue_activity +from plane.utils.grouper import group_results class CycleViewSet(BaseViewSet): @@ -52,6 +53,11 @@ class CycleIssueViewSet(BaseViewSet): ProjectEntityPermission, ] + filterset_fields = [ + "issue__labels__id", + "issue__assignees__id", + ] + def perform_create(self, serializer): serializer.save( project_id=self.kwargs.get("project_id"), @@ -80,6 +86,31 @@ class CycleIssueViewSet(BaseViewSet): .distinct() ) + def list(self, request, slug, project_id, cycle_id): + try: + order_by = request.GET.get("order_by", "issue__created_at") + queryset = self.get_queryset().order_by(order_by) + group_by = request.GET.get("group_by", False) + + cycle_issues = CycleIssueSerializer(queryset, many=True).data + + if group_by: + return Response( + group_results(cycle_issues, f"issue_detail.{group_by}"), + status=status.HTTP_200_OK, + ) + + return Response( + cycle_issues, + status=status.HTTP_200_OK, + ) + except Exception as e: + capture_exception(e) + return Response( + {"error": "Something went wrong please try again later"}, + status=status.HTTP_400_BAD_REQUEST, + ) + def create(self, request, slug, project_id, cycle_id): try: issues = request.data.get("issues", []) diff --git a/apiserver/plane/api/views/module.py b/apiserver/plane/api/views/module.py index a1cda98346..1bd93d1c11 100644 --- a/apiserver/plane/api/views/module.py +++ b/apiserver/plane/api/views/module.py @@ -27,6 +27,7 @@ from plane.db.models import ( ModuleLink, ) from plane.bgtasks.issue_activites_task import issue_activity +from plane.utils.grouper import group_results class ModuleViewSet(BaseViewSet): @@ -103,8 +104,8 @@ class ModuleIssueViewSet(BaseViewSet): model = ModuleIssue filterset_fields = [ - "issue__id", - "workspace__id", + "issue__labels__id", + "issue__assignees__id", ] permission_classes = [ @@ -140,6 +141,31 @@ class ModuleIssueViewSet(BaseViewSet): .distinct() ) + def list(self, request, slug, project_id, cycle_id): + try: + order_by = request.GET.get("order_by", "issue__created_at") + queryset = self.get_queryset().order_by(order_by) + group_by = request.GET.get("group_by", False) + + module_issues = ModuleIssueSerializer(queryset, many=True).data + + if group_by: + return Response( + group_results(module_issues, f"issue_detail.{group_by}"), + status=status.HTTP_200_OK, + ) + + return Response( + module_issues, + status=status.HTTP_200_OK, + ) + except Exception as e: + capture_exception(e) + return Response( + {"error": "Something went wrong please try again later"}, + status=status.HTTP_400_BAD_REQUEST, + ) + def create(self, request, slug, project_id, module_id): try: issues = request.data.get("issues", []) diff --git a/apiserver/plane/utils/grouper.py b/apiserver/plane/utils/grouper.py index 51c1f61c29..798b652fac 100644 --- a/apiserver/plane/utils/grouper.py +++ b/apiserver/plane/utils/grouper.py @@ -1,12 +1,34 @@ -def group_results(results_data, group_by): +def resolve_keys(group_keys, value): + """resolve keys to a key which will be used for + grouping + + Args: + group_keys (string): key which will be used for grouping + value (obj): data value + + Returns: + string: the key which will be used for """ - Utility function to group data into a given attribute. - Function can group attributes of string and list type. + keys = group_keys.split(".") + for key in keys: + value = value.get(key, None) + return value + + +def group_results(results_data, group_by): + """group results data into certain group_by + + Args: + results_data (obj): complete results data + group_by (key): string + + Returns: + obj: grouped results """ response_dict = dict() for value in results_data: - group_attribute = value.get(group_by, None) + group_attribute = resolve_keys(group_by, value) if isinstance(group_attribute, list): if len(group_attribute): for attrib in group_attribute: @@ -28,4 +50,4 @@ def group_results(results_data, group_by): response_dict[str(group_attribute)] = [] response_dict[str(group_attribute)].append(value) - return response_dict \ No newline at end of file + return response_dict