From 988201d72952bbb87395e1cad6fc34c8cfd5935d Mon Sep 17 00:00:00 2001 From: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Date: Mon, 8 Jul 2024 20:54:10 +0530 Subject: [PATCH] [WEB - 1888] dev: log issue activity when transferring issues from one cycle to another (#5073) * fix: cycle transfer activity * chore: external api transfer issue * chore: moved the cycle id --------- Co-authored-by: NarayanBavisetti --- apiserver/plane/api/serializers/cycle.py | 6 ++-- apiserver/plane/api/views/cycle.py | 26 +++++++++++++++ apiserver/plane/app/views/cycle/base.py | 42 +++++++++++++++++++----- 3 files changed, 63 insertions(+), 11 deletions(-) diff --git a/apiserver/plane/api/serializers/cycle.py b/apiserver/plane/api/serializers/cycle.py index 6fc73a4bc7..d03af1a8b2 100644 --- a/apiserver/plane/api/serializers/cycle.py +++ b/apiserver/plane/api/serializers/cycle.py @@ -13,9 +13,9 @@ class CycleSerializer(BaseSerializer): started_issues = serializers.IntegerField(read_only=True) unstarted_issues = serializers.IntegerField(read_only=True) backlog_issues = serializers.IntegerField(read_only=True) - total_estimates = serializers.IntegerField(read_only=True) - completed_estimates = serializers.IntegerField(read_only=True) - started_estimates = serializers.IntegerField(read_only=True) + total_estimates = serializers.FloatField(read_only=True) + completed_estimates = serializers.FloatField(read_only=True) + started_estimates = serializers.FloatField(read_only=True) def validate(self, data): if ( diff --git a/apiserver/plane/api/views/cycle.py b/apiserver/plane/api/views/cycle.py index a95a4d5f46..8b9f90de5f 100644 --- a/apiserver/plane/api/views/cycle.py +++ b/apiserver/plane/api/views/cycle.py @@ -1140,12 +1140,38 @@ class TransferCycleIssueAPIEndpoint(BaseAPIView): ) updated_cycles = [] + update_cycle_issue_activity = [] for cycle_issue in cycle_issues: cycle_issue.cycle_id = new_cycle_id updated_cycles.append(cycle_issue) + update_cycle_issue_activity.append( + { + "old_cycle_id": str(cycle_id), + "new_cycle_id": str(new_cycle_id), + "issue_id": str(cycle_issue.issue_id), + } + ) cycle_issues = CycleIssue.objects.bulk_update( updated_cycles, ["cycle_id"], batch_size=100 ) + # Capture Issue Activity + issue_activity.delay( + type="cycle.activity.created", + requested_data=json.dumps({"cycles_list": []}), + actor_id=str(self.request.user.id), + issue_id=None, + project_id=str(self.kwargs.get("project_id", None)), + current_instance=json.dumps( + { + "updated_cycle_issues": update_cycle_issue_activity, + "created_cycle_issues": "[]", + } + ), + epoch=int(timezone.now().timestamp()), + notification=True, + origin=request.META.get("HTTP_ORIGIN"), + ) + return Response({"message": "Success"}, status=status.HTTP_200_OK) diff --git a/apiserver/plane/app/views/cycle/base.py b/apiserver/plane/app/views/cycle/base.py index 65d65e5257..2583913aa5 100644 --- a/apiserver/plane/app/views/cycle/base.py +++ b/apiserver/plane/app/views/cycle/base.py @@ -465,14 +465,14 @@ class CycleViewSet(BaseViewSet): } if data[0]["start_date"] and data[0]["end_date"]: - data[0]["estimate_distribution"]["completion_chart"] = ( - burndown_plot( - queryset=queryset.first(), - slug=slug, - project_id=project_id, - plot_type="points", - cycle_id=data[0]["id"], - ) + data[0]["estimate_distribution"][ + "completion_chart" + ] = burndown_plot( + queryset=queryset.first(), + slug=slug, + project_id=project_id, + plot_type="points", + cycle_id=data[0]["id"], ) assignee_distribution = ( @@ -1507,14 +1507,40 @@ class TransferCycleIssueEndpoint(BaseAPIView): ) updated_cycles = [] + update_cycle_issue_activity = [] for cycle_issue in cycle_issues: cycle_issue.cycle_id = new_cycle_id updated_cycles.append(cycle_issue) + update_cycle_issue_activity.append( + { + "old_cycle_id": str(cycle_id), + "new_cycle_id": str(new_cycle_id), + "issue_id": str(cycle_issue.issue_id), + } + ) cycle_issues = CycleIssue.objects.bulk_update( updated_cycles, ["cycle_id"], batch_size=100 ) + # Capture Issue Activity + issue_activity.delay( + type="cycle.activity.created", + requested_data=json.dumps({"cycles_list": []}), + actor_id=str(self.request.user.id), + issue_id=None, + project_id=str(self.kwargs.get("project_id", None)), + current_instance=json.dumps( + { + "updated_cycle_issues": update_cycle_issue_activity, + "created_cycle_issues": "[]", + } + ), + epoch=int(timezone.now().timestamp()), + notification=True, + origin=request.META.get("HTTP_ORIGIN"), + ) + return Response({"message": "Success"}, status=status.HTTP_200_OK)