From 532311fc73e79a7aaffb160866023fdd9018582c Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Thu, 24 Aug 2023 23:33:36 +0530 Subject: [PATCH 1/2] chore: track project deploy board comment and reaction users for public deploy boards --- apiserver/plane/api/serializers/__init__.py | 1 + apiserver/plane/api/serializers/project.py | 15 ++++- apiserver/plane/api/views/issue.py | 62 ++++++++++++++++++++- apiserver/plane/db/models/__init__.py | 1 + apiserver/plane/db/models/project.py | 15 +++++ 5 files changed, 90 insertions(+), 4 deletions(-) diff --git a/apiserver/plane/api/serializers/__init__.py b/apiserver/plane/api/serializers/__init__.py index 5855f0413b6..1906d001e01 100644 --- a/apiserver/plane/api/serializers/__init__.py +++ b/apiserver/plane/api/serializers/__init__.py @@ -20,6 +20,7 @@ ProjectMemberLiteSerializer, ProjectDeployBoardSerializer, ProjectMemberAdminSerializer, + ProjectPublicMemberSerializer ) from .state import StateSerializer, StateLiteSerializer from .view import IssueViewSerializer, IssueViewFavoriteSerializer diff --git a/apiserver/plane/api/serializers/project.py b/apiserver/plane/api/serializers/project.py index 1f7a973c1d8..eddae2cd644 100644 --- a/apiserver/plane/api/serializers/project.py +++ b/apiserver/plane/api/serializers/project.py @@ -15,6 +15,7 @@ ProjectIdentifier, ProjectFavorite, ProjectDeployBoard, + ProjectPublicMember, ) @@ -177,5 +178,17 @@ class Meta: fields = "__all__" read_only_fields = [ "workspace", - "project" "anchor", + "project", "anchor", + ] + + +class ProjectPublicMemberSerializer(BaseSerializer): + + class Meta: + model = ProjectPublicMember + fields = "__all__" + read_only_fields = [ + "workspace", + "project", + "member", ] diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index 0b08bb14fd8..f05eb12782e 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -73,6 +73,7 @@ CommentReaction, ProjectDeployBoard, IssueVote, + ProjectPublicMember, ) from plane.bgtasks.issue_activites_task import issue_activity from plane.utils.grouper import group_results @@ -769,7 +770,9 @@ def get(self, request, slug, project_id, issue_id): .order_by("state_group") ) - result = {item["state_group"]: item["state_count"] for item in state_distribution} + result = { + item["state_group"]: item["state_count"] for item in state_distribution + } serializer = IssueLiteSerializer( sub_issues, @@ -1379,6 +1382,15 @@ def get_queryset(self): ) def perform_create(self, serializer): + if not ProjectMember.objects.filter( + project_id=self.kwargs.get("project_id"), + member=self.request.user, + ).exists(): + # Add the user for workspace tracking + _ = ProjectPublicMember.objects.get_or_create( + project_id=self.kwargs.get("project_id"), + member=self.request.user, + ) serializer.save( issue_id=self.kwargs.get("issue_id"), project_id=self.kwargs.get("project_id"), @@ -1429,6 +1441,15 @@ def get_queryset(self): ) def perform_create(self, serializer): + if not ProjectMember.objects.filter( + project_id=self.kwargs.get("project_id"), + member=self.request.user, + ).exists(): + # Add the user for workspace tracking + _ = ProjectPublicMember.objects.get_or_create( + project_id=self.kwargs.get("project_id"), + member=self.request.user, + ) serializer.save( actor=self.request.user, comment_id=self.kwargs.get("comment_id"), @@ -1523,6 +1544,16 @@ def create(self, request, slug, project_id, issue_id): project_id=str(project_id), current_instance=None, ) + if not ProjectMember.objects.filter( + project_id=project_id, + member=request.user, + ).exists(): + # Add the user for workspace tracking + _ = ProjectPublicMember.objects.get_or_create( + project_id=project_id, + member=request.user, + ) + return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) except Exception as e: @@ -1567,7 +1598,8 @@ def partial_update(self, request, slug, project_id, issue_id, pk): except (IssueComment.DoesNotExist, ProjectDeployBoard.DoesNotExist): return Response( {"error": "IssueComent Does not exists"}, - status=status.HTTP_400_BAD_REQUEST,) + status=status.HTTP_400_BAD_REQUEST, + ) def destroy(self, request, slug, project_id, issue_id, pk): try: @@ -1648,6 +1680,15 @@ def create(self, request, slug, project_id, issue_id): serializer.save( project_id=project_id, issue_id=issue_id, actor=request.user ) + if not ProjectMember.objects.filter( + project_id=project_id, + member=request.user, + ).exists(): + # Add the user for workspace tracking + _ = ProjectPublicMember.objects.get_or_create( + project_id=project_id, + member=request.user, + ) return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) except ProjectDeployBoard.DoesNotExist: @@ -1733,6 +1774,14 @@ def create(self, request, slug, project_id, comment_id): serializer.save( project_id=project_id, comment_id=comment_id, actor=request.user ) + if not ProjectMember.objects.filter( + project_id=project_id, member=request.user + ).exists(): + # Add the user for workspace tracking + _ = ProjectPublicMember.objects.get_or_create( + project_id=project_id, + member=request.user, + ) return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) except ProjectDeployBoard.DoesNotExist: @@ -1801,6 +1850,14 @@ def create(self, request, slug, project_id, issue_id): issue_id=issue_id, vote=request.data.get("vote", 1), ) + # Add the user for workspace tracking + if not ProjectMember.objects.filter( + project_id=project_id, member=request.user + ).exists(): + _ = ProjectPublicMember.objects.get_or_create( + project_id=project_id, + member=request.user, + ) serializer = IssueVoteSerializer(issue_vote) return Response(serializer.data, status=status.HTTP_201_CREATED) except Exception as e: @@ -1826,4 +1883,3 @@ def destroy(self, request, slug, project_id, issue_id): {"error": "Something went wrong please try again later"}, status=status.HTTP_400_BAD_REQUEST, ) - diff --git a/apiserver/plane/db/models/__init__.py b/apiserver/plane/db/models/__init__.py index 659eea3eb38..90532dc64e3 100644 --- a/apiserver/plane/db/models/__init__.py +++ b/apiserver/plane/db/models/__init__.py @@ -19,6 +19,7 @@ ProjectIdentifier, ProjectFavorite, ProjectDeployBoard, + ProjectPublicMember, ) from .issue import ( diff --git a/apiserver/plane/db/models/project.py b/apiserver/plane/db/models/project.py index 0c2b5cb96db..da155af4029 100644 --- a/apiserver/plane/db/models/project.py +++ b/apiserver/plane/db/models/project.py @@ -254,3 +254,18 @@ class Meta: def __str__(self): """Return project and anchor""" return f"{self.anchor} <{self.project.name}>" + + +class ProjectPublicMember(ProjectBaseModel): + member = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="public_project_members", + ) + + class Meta: + unique_together = ["project", "member"] + verbose_name = "Project Public Member" + verbose_name_plural = "Project Public Members" + db_table = "project_public_members" + ordering = ("-created_at",) From 1e5d18587ba7a2bc580fc445c6e8b9238a1211d4 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Wed, 30 Aug 2023 12:13:50 +0530 Subject: [PATCH 2/2] dev: remove tracking from project viewsets --- apiserver/plane/api/views/issue.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index 0360b4abafd..802431d2e8b 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -1400,15 +1400,6 @@ def get_queryset(self): ) def perform_create(self, serializer): - if not ProjectMember.objects.filter( - project_id=self.kwargs.get("project_id"), - member=self.request.user, - ).exists(): - # Add the user for workspace tracking - _ = ProjectPublicMember.objects.get_or_create( - project_id=self.kwargs.get("project_id"), - member=self.request.user, - ) serializer.save( issue_id=self.kwargs.get("issue_id"), project_id=self.kwargs.get("project_id"), @@ -1459,15 +1450,6 @@ def get_queryset(self): ) def perform_create(self, serializer): - if not ProjectMember.objects.filter( - project_id=self.kwargs.get("project_id"), - member=self.request.user, - ).exists(): - # Add the user for workspace tracking - _ = ProjectPublicMember.objects.get_or_create( - project_id=self.kwargs.get("project_id"), - member=self.request.user, - ) serializer.save( actor=self.request.user, comment_id=self.kwargs.get("comment_id"),