From a9288573a3e4421f612afec6778ec3e6f7465aa6 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Fri, 21 Jul 2023 13:31:48 +0530 Subject: [PATCH 01/11] dev: sub issue listing --- apiserver/plane/api/views/issue.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index aab926fd2c7..02c8ed46a95 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -629,7 +629,7 @@ def get(self, request, slug, project_id, issue_id): try: sub_issues = ( Issue.issue_objects.filter( - parent_id=issue_id, workspace__slug=slug, project_id=project_id + parent_id=issue_id, workspace__slug=slug ) .select_related("project") .select_related("workspace") @@ -661,7 +661,7 @@ def get(self, request, slug, project_id, issue_id): state_distribution = ( State.objects.filter( - ~Q(name="Triage"), workspace__slug=slug, project_id=project_id + ~Q(name="Triage"), workspace__slug=slug ) .annotate( state_count=Count( From 194e6e91bdf2ddbe6bdca8a075b5967c44a6d251 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Fri, 21 Jul 2023 16:04:41 +0530 Subject: [PATCH 02/11] feat: cross project issue linking --- apiserver/plane/api/serializers/issue.py | 29 ++++++++++++++++++++---- apiserver/plane/api/views/search.py | 5 +++- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/apiserver/plane/api/serializers/issue.py b/apiserver/plane/api/serializers/issue.py index 7aeee7d7074..2d10d075656 100644 --- a/apiserver/plane/api/serializers/issue.py +++ b/apiserver/plane/api/serializers/issue.py @@ -50,6 +50,19 @@ class Meta: ] +class IssueProjectLiteSerializer(BaseSerializer): + project_detail = ProjectLiteSerializer(source="project", read_only=True) + + class Meta: + model = Issue + fields = [ + "project_detail", + "name", + "sequence_id", + ] + read_only_fields = fields + + ##TODO: Find a better way to write this serializer ## Find a better approach to save manytomany? class IssueCreateSerializer(BaseSerializer): @@ -335,19 +348,27 @@ class Meta: class BlockedIssueSerializer(BaseSerializer): - blocked_issue_detail = IssueFlatSerializer(source="block", read_only=True) + blocked_issue_detail = IssueProjectLiteSerializer(source="block", read_only=True) class Meta: model = IssueBlocker - fields = "__all__" + fields = [ + "blocked_issue_detail", + ] + read_only_fields = fields class BlockerIssueSerializer(BaseSerializer): - blocker_issue_detail = IssueFlatSerializer(source="blocked_by", read_only=True) + blocker_issue_detail = IssueProjectLiteSerializer( + source="blocked_by", read_only=True + ) class Meta: model = IssueBlocker - fields = "__all__" + fields = [ + "blocker_issue_detail", + ] + read_only_fields = fields class IssueAssigneeSerializer(BaseSerializer): diff --git a/apiserver/plane/api/views/search.py b/apiserver/plane/api/views/search.py index 51925dd7b13..2db44ffa650 100644 --- a/apiserver/plane/api/views/search.py +++ b/apiserver/plane/api/views/search.py @@ -206,6 +206,7 @@ class IssueSearchEndpoint(BaseAPIView): def get(self, request, slug, project_id): try: query = request.query_params.get("search", False) + project_search = request.query_params.get("project_search", "false") parent = request.query_params.get("parent", "false") blocker_blocked_by = request.query_params.get("blocker_blocked_by", "false") cycle = request.query_params.get("cycle", "false") @@ -216,10 +217,12 @@ def get(self, request, slug, project_id): issues = Issue.issue_objects.filter( workspace__slug=slug, - project_id=project_id, project__project_projectmember__member=self.request.user, ) + if project_search == "true": + issues = issues.filter(project_id=project_id) + if query: issues = search_issues(query, issues) From 56f1d7f8a370a6ddf518e2477ae232d1fd744b97 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Fri, 21 Jul 2023 16:09:59 +0530 Subject: [PATCH 03/11] dev: project search --- apiserver/plane/api/views/search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apiserver/plane/api/views/search.py b/apiserver/plane/api/views/search.py index 2db44ffa650..26e7824b57a 100644 --- a/apiserver/plane/api/views/search.py +++ b/apiserver/plane/api/views/search.py @@ -206,7 +206,7 @@ class IssueSearchEndpoint(BaseAPIView): def get(self, request, slug, project_id): try: query = request.query_params.get("search", False) - project_search = request.query_params.get("project_search", "false") + project_search = request.query_params.get("project_search", "true") parent = request.query_params.get("parent", "false") blocker_blocked_by = request.query_params.get("blocker_blocked_by", "false") cycle = request.query_params.get("cycle", "false") From 98704204b451798144b882b1b4bd266da34ed14d Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Fri, 21 Jul 2023 19:24:06 +0530 Subject: [PATCH 04/11] dev: workspace search logic --- apiserver/plane/api/views/search.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apiserver/plane/api/views/search.py b/apiserver/plane/api/views/search.py index 26e7824b57a..478f9773d3f 100644 --- a/apiserver/plane/api/views/search.py +++ b/apiserver/plane/api/views/search.py @@ -206,7 +206,7 @@ class IssueSearchEndpoint(BaseAPIView): def get(self, request, slug, project_id): try: query = request.query_params.get("search", False) - project_search = request.query_params.get("project_search", "true") + workspace_search = request.query_params.get("workspace_search", "false") parent = request.query_params.get("parent", "false") blocker_blocked_by = request.query_params.get("blocker_blocked_by", "false") cycle = request.query_params.get("cycle", "false") @@ -220,7 +220,7 @@ def get(self, request, slug, project_id): project__project_projectmember__member=self.request.user, ) - if project_search == "true": + if workspace_search == "false": issues = issues.filter(project_id=project_id) if query: From 180e5e3ecf821aa2acd0150e42b24f578f2fc65b Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Fri, 21 Jul 2023 19:34:46 +0530 Subject: [PATCH 05/11] dev: return state and project details for parent issues --- apiserver/plane/api/serializers/issue.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apiserver/plane/api/serializers/issue.py b/apiserver/plane/api/serializers/issue.py index 2d10d075656..cc0c56dc7f7 100644 --- a/apiserver/plane/api/serializers/issue.py +++ b/apiserver/plane/api/serializers/issue.py @@ -500,7 +500,7 @@ class Meta: class IssueSerializer(BaseSerializer): project_detail = ProjectLiteSerializer(read_only=True, source="project") state_detail = StateSerializer(read_only=True, source="state") - parent_detail = IssueFlatSerializer(read_only=True, source="parent") + parent_detail = IssueStateSerializer(read_only=True, source="parent") label_details = LabelSerializer(read_only=True, source="labels", many=True) assignee_details = UserLiteSerializer(read_only=True, source="assignees", many=True) # List of issues blocked by this issue From 4dccf74bc7d3d34aae8222fa47ec1e74560c1dba Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Fri, 21 Jul 2023 19:38:18 +0530 Subject: [PATCH 06/11] dev: issue state flat serializer --- apiserver/plane/api/serializers/issue.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/apiserver/plane/api/serializers/issue.py b/apiserver/plane/api/serializers/issue.py index cc0c56dc7f7..ed93b1c3297 100644 --- a/apiserver/plane/api/serializers/issue.py +++ b/apiserver/plane/api/serializers/issue.py @@ -481,6 +481,21 @@ class Meta: ] +class IssueStateFlatSerializer(BaseSerializer): + state_detail = StateLiteSerializer(read_only=True, source="state") + project_detail = ProjectLiteSerializer(read_only=True, source="project") + + class Meta: + model = Issue + fields = [ + "id", + "sequence_id", + "name", + "state_detail", + "project_detail", + ] + + # Issue Serializer with state details class IssueStateSerializer(BaseSerializer): label_details = LabelLiteSerializer(read_only=True, source="labels", many=True) @@ -500,7 +515,7 @@ class Meta: class IssueSerializer(BaseSerializer): project_detail = ProjectLiteSerializer(read_only=True, source="project") state_detail = StateSerializer(read_only=True, source="state") - parent_detail = IssueStateSerializer(read_only=True, source="parent") + parent_detail = IssueStateFlatSerializer(read_only=True, source="parent") label_details = LabelSerializer(read_only=True, source="labels", many=True) assignee_details = UserLiteSerializer(read_only=True, source="assignees", many=True) # List of issues blocked by this issue From ae8cb2e6d5f05be8e8c55923a10ecbc2a0d50106 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Fri, 21 Jul 2023 19:52:22 +0530 Subject: [PATCH 07/11] dev: id for lite serializer --- apiserver/plane/api/serializers/issue.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apiserver/plane/api/serializers/issue.py b/apiserver/plane/api/serializers/issue.py index ed93b1c3297..ed5d9105f08 100644 --- a/apiserver/plane/api/serializers/issue.py +++ b/apiserver/plane/api/serializers/issue.py @@ -56,6 +56,7 @@ class IssueProjectLiteSerializer(BaseSerializer): class Meta: model = Issue fields = [ + "id", "project_detail", "name", "sequence_id", From 44aa0d054b5d0aec7990914fee814dbf4c264cfd Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Fri, 21 Jul 2023 20:00:17 +0530 Subject: [PATCH 08/11] dev: project name in for the response issues --- apiserver/plane/api/views/search.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apiserver/plane/api/views/search.py b/apiserver/plane/api/views/search.py index 478f9773d3f..b7ad654e26c 100644 --- a/apiserver/plane/api/views/search.py +++ b/apiserver/plane/api/views/search.py @@ -260,6 +260,7 @@ def get(self, request, slug, project_id): "name", "id", "sequence_id", + "project__name", "project__identifier", "project_id", "workspace__slug", From 923fe03edc44965cc3dfd242a6dbbc76b0015363 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Fri, 21 Jul 2023 20:13:53 +0530 Subject: [PATCH 09/11] dev: issue cross project --- apiserver/plane/bgtasks/issue_activites_task.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apiserver/plane/bgtasks/issue_activites_task.py b/apiserver/plane/bgtasks/issue_activites_task.py index 105a05b5695..ea588beb6cf 100644 --- a/apiserver/plane/bgtasks/issue_activites_task.py +++ b/apiserver/plane/bgtasks/issue_activites_task.py @@ -1034,7 +1034,7 @@ def issue_activity( "module.activity.created", "module.activity.deleted", ]: - issue = Issue.objects.filter(pk=issue_id, project_id=project_id).first() + issue = Issue.objects.filter(pk=issue_id).first() if issue is not None: issue.updated_at = timezone.now() @@ -1122,7 +1122,7 @@ def issue_activity( issue_subscribers = issue_subscribers + issue_assignees - issue = Issue.objects.filter(pk=issue_id, project_id=project_id).first() + issue = Issue.objects.filter(pk=issue_id).first() # Add bot filtering if ( From f7ecd78a3105b0e61d2ea1f6f106eefff7cb1cff Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Fri, 21 Jul 2023 20:24:57 +0530 Subject: [PATCH 10/11] dev: issue project identifiers --- .../plane/bgtasks/issue_activites_task.py | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/apiserver/plane/bgtasks/issue_activites_task.py b/apiserver/plane/bgtasks/issue_activites_task.py index ea588beb6cf..49b1a414532 100644 --- a/apiserver/plane/bgtasks/issue_activites_task.py +++ b/apiserver/plane/bgtasks/issue_activites_task.py @@ -70,7 +70,7 @@ def track_parent( issue_id=issue_id, actor=actor, verb="updated", - old_value=f"{project.identifier}-{old_parent.sequence_id}", + old_value=f"{old_parent.project.identifier}-{old_parent.sequence_id}", new_value=None, field="parent", project=project, @@ -88,10 +88,10 @@ def track_parent( issue_id=issue_id, actor=actor, verb="updated", - old_value=f"{project.identifier}-{old_parent.sequence_id}" + old_value=f"{old_parent.project.identifier}-{old_parent.sequence_id}" if old_parent is not None else None, - new_value=f"{project.identifier}-{new_parent.sequence_id}", + new_value=f"{new_parent.project.identifier}-{new_parent.sequence_id}", field="parent", project=project, workspace=project.workspace, @@ -415,11 +415,11 @@ def track_blocks( actor=actor, verb="updated", old_value="", - new_value=f"{project.identifier}-{issue.sequence_id}", + new_value=f"{issue.project.identifier}-{issue.sequence_id}", field="blocks", project=project, workspace=project.workspace, - comment=f"{actor.email} added blocking issue {project.identifier}-{issue.sequence_id}", + comment=f"{actor.email} added blocking issue {issue.project.identifier}-{issue.sequence_id}", new_identifier=issue.id, ) ) @@ -436,12 +436,12 @@ def track_blocks( issue_id=issue_id, actor=actor, verb="updated", - old_value=f"{project.identifier}-{issue.sequence_id}", + old_value=f"{issue.project.identifier}-{issue.sequence_id}", new_value="", field="blocks", project=project, workspace=project.workspace, - comment=f"{actor.email} removed blocking issue {project.identifier}-{issue.sequence_id}", + comment=f"{actor.email} removed blocking issue {issue.project.identifier}-{issue.sequence_id}", old_identifier=issue.id, ) ) @@ -477,11 +477,11 @@ def track_blockings( actor=actor, verb="updated", old_value="", - new_value=f"{project.identifier}-{issue.sequence_id}", + new_value=f"{issue.project.identifier}-{issue.sequence_id}", field="blocking", project=project, workspace=project.workspace, - comment=f"{actor.email} added blocked by issue {project.identifier}-{issue.sequence_id}", + comment=f"{actor.email} added blocked by issue {issue.project.identifier}-{issue.sequence_id}", new_identifier=issue.id, ) ) @@ -498,12 +498,12 @@ def track_blockings( issue_id=issue_id, actor=actor, verb="updated", - old_value=f"{project.identifier}-{issue.sequence_id}", + old_value=f"{issue.project.identifier}-{issue.sequence_id}", new_value="", field="blocking", project=project, workspace=project.workspace, - comment=f"{actor.email} removed blocked by issue {project.identifier}-{issue.sequence_id}", + comment=f"{actor.email} removed blocked by issue {issue.project.identifier}-{issue.sequence_id}", old_identifier=issue.id, ) ) @@ -1149,7 +1149,7 @@ def issue_activity( "issue": { "id": str(issue_id), "name": str(issue.name), - "identifier": str(project.identifier), + "identifier": str(issue.project.identifier), "sequence_id": issue.sequence_id, "state_name": issue.state.name, "state_group": issue.state.group, From fdfca139267c29ccbd3eb7d04e0dacae9f82f5cd Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Mon, 24 Jul 2023 00:07:25 +0530 Subject: [PATCH 11/11] dev: blocked and blocked by activity --- apiserver/plane/api/serializers/issue.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apiserver/plane/api/serializers/issue.py b/apiserver/plane/api/serializers/issue.py index ed5d9105f08..6a8ccee84b5 100644 --- a/apiserver/plane/api/serializers/issue.py +++ b/apiserver/plane/api/serializers/issue.py @@ -355,6 +355,8 @@ class Meta: model = IssueBlocker fields = [ "blocked_issue_detail", + "blocked_by", + "block", ] read_only_fields = fields @@ -368,6 +370,8 @@ class Meta: model = IssueBlocker fields = [ "blocker_issue_detail", + "blocked_by", + "block", ] read_only_fields = fields