From b15962690968e38fdaa55d7aacf5c4cf4a36c210 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Wed, 27 Nov 2024 13:18:12 +0530 Subject: [PATCH] chore: restrict email notifications for removed users --- .../plane/app/views/notification/base.py | 4 +++ apiserver/plane/app/views/workspace/base.py | 1 + apiserver/plane/bgtasks/notification_task.py | 29 ++++++++++++++----- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/apiserver/plane/app/views/notification/base.py b/apiserver/plane/app/views/notification/base.py index d2aa1a02d7b..11d18ade399 100644 --- a/apiserver/plane/app/views/notification/base.py +++ b/apiserver/plane/app/views/notification/base.py @@ -62,6 +62,10 @@ def list(self, request, slug): Notification.objects.filter( workspace__slug=slug, receiver_id=request.user.id ) + .filter( + project__project_projectmember__member=request.user, + project__project_projectmember__is_active=True, + ) .filter(entity_name="issue") .annotate(is_inbox_issue=Exists(intake_issue)) .annotate(is_intake_issue=Exists(intake_issue)) diff --git a/apiserver/plane/app/views/workspace/base.py b/apiserver/plane/app/views/workspace/base.py index 63c482f2071..515a3479bbd 100644 --- a/apiserver/plane/app/views/workspace/base.py +++ b/apiserver/plane/app/views/workspace/base.py @@ -353,6 +353,7 @@ def post(self, request, slug, user_id): workspace__slug=slug, created_at__date=request.data.get("date"), project__project_projectmember__member=request.user, + project__project_projectmember__is_active=True, actor_id=user_id, ).select_related("actor", "workspace", "issue", "project")[:10000] diff --git a/apiserver/plane/bgtasks/notification_task.py b/apiserver/plane/bgtasks/notification_task.py index e4a54172999..2adff6cc62c 100644 --- a/apiserver/plane/bgtasks/notification_task.py +++ b/apiserver/plane/bgtasks/notification_task.py @@ -16,8 +16,9 @@ IssueComment, IssueActivity, UserNotificationPreference, - ProjectMember + ProjectMember, ) +from django.db.models import Subquery # Third Party imports from celery import shared_task @@ -95,7 +96,8 @@ def extract_mentions_as_subscribers(project_id, issue_id, mentions): ).exists() and not Issue.objects.filter( project_id=project_id, pk=issue_id, created_by_id=mention_id - ).exists() and ProjectMember.objects.filter( + ).exists() + and ProjectMember.objects.filter( project_id=project_id, member_id=mention_id, is_active=True ).exists() ): @@ -242,14 +244,19 @@ def notifications( 2. From the latest set of mentions, extract the users which are not a subscribers & make them subscribers """ + # get the list of active project members + project_members = ProjectMember.objects.filter( + project_id=project_id, is_active=True + ).values_list("member_id", flat=True) + # Get new mentions from the newer instance new_mentions = get_new_mentions( requested_instance=requested_data, current_instance=current_instance ) - new_mentions = list(ProjectMember.objects.filter( - project_id=project_id, member_id__in=new_mentions, is_active=True - ).values_list("member_id", flat=True)) - new_mentions = [str(member_id) for member_id in new_mentions] + + new_mentions = [ + str(mention) for mention in new_mentions if mention in new_mentions + ] removed_mention = get_removed_mentions( requested_instance=requested_data, current_instance=current_instance ) @@ -293,7 +300,11 @@ def notifications( # ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- # issue_subscribers = list( - IssueSubscriber.objects.filter(project_id=project_id, issue_id=issue_id, project__project_projectmember__is_active=True,) + IssueSubscriber.objects.filter( + project_id=project_id, + issue_id=issue_id, + subscriber__in=Subquery(project_members), + ) .exclude( subscriber_id__in=list(new_mentions + comment_mentions + [actor_id]) ) @@ -314,7 +325,9 @@ def notifications( project = Project.objects.get(pk=project_id) issue_assignees = IssueAssignee.objects.filter( - issue_id=issue_id, project_id=project_id + issue_id=issue_id, + project_id=project_id, + assignee__in=Subquery(project_members), ).values_list("assignee", flat=True) issue_subscribers = list(set(issue_subscribers) - {uuid.UUID(actor_id)})