From 17336c966b3f91407ad47b57571c582882f7990e Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Mon, 6 Nov 2023 18:45:41 +0530 Subject: [PATCH 1/9] fix: mention notification --- apiserver/plane/bgtasks/notification_task.py | 56 +++++++++++++++++--- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/apiserver/plane/bgtasks/notification_task.py b/apiserver/plane/bgtasks/notification_task.py index 4380f4ee90e..ca3e5b1212b 100644 --- a/apiserver/plane/bgtasks/notification_task.py +++ b/apiserver/plane/bgtasks/notification_task.py @@ -14,6 +14,7 @@ Issue, Notification, IssueComment, + IssueActivity ) # Third Party imports @@ -218,8 +219,17 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi mention_subscribers, batch_size=100) for mention_id in new_mentions: + last_activity = ( + IssueActivity.objects.filter(issue_id=issue_id) + .order_by("-created_at") + .first() + ) if (mention_id != actor_id): - for issue_activity in issue_activities_created: + if ( + last_activity is not None + and last_activity.field == "description" + and actor_id == str(last_activity.actor_id) + ): bulk_notifications.append( Notification( workspace=project.workspace, @@ -240,16 +250,48 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi "state_group": issue.state.group, }, "issue_activity": { - "id": str(issue_activity.get("id")), - "verb": str(issue_activity.get("verb")), - "field": str(issue_activity.get("field")), - "actor": str(issue_activity.get("actor_id")), - "new_value": str(issue_activity.get("new_value")), - "old_value": str(issue_activity.get("old_value")), + "id": str(last_activity.id), + "verb": str(last_activity.verb), + "field": str(last_activity.field), + "actor": str(last_activity.actor_id), + "new_value": str(last_activity.new_value), + "old_value": str(last_activity.old_value), }, }, ) ) + else: + for issue_activity in issue_activities_created: + bulk_notifications.append( + Notification( + workspace=project.workspace, + sender="in_app:issue_activities:mention", + triggered_by_id=actor_id, + receiver_id=mention_id, + entity_identifier=issue_id, + entity_name="issue", + project=project, + message=f"You have been mentioned in the issue {issue.name}", + data={ + "issue": { + "id": str(issue_id), + "name": str(issue.name), + "identifier": str(issue.project.identifier), + "sequence_id": issue.sequence_id, + "state_name": issue.state.name, + "state_group": issue.state.group, + }, + "issue_activity": { + "id": str(issue_activity.get("id")), + "verb": str(issue_activity.get("verb")), + "field": str(issue_activity.get("field")), + "actor": str(issue_activity.get("actor_id")), + "new_value": str(issue_activity.get("new_value")), + "old_value": str(issue_activity.get("old_value")), + }, + }, + ) + ) # Create New Mentions Here aggregated_issue_mentions = [] From a1747642363875f668f567171704d6e807b25efe Mon Sep 17 00:00:00 2001 From: Henit Chobisa Date: Tue, 7 Nov 2023 12:13:45 +0530 Subject: [PATCH 2/9] feat: updated mentions for comments in the notification background task --- apiserver/plane/bgtasks/notification_task.py | 240 +++++++++++++------ 1 file changed, 162 insertions(+), 78 deletions(-) diff --git a/apiserver/plane/bgtasks/notification_task.py b/apiserver/plane/bgtasks/notification_task.py index ca3e5b1212b..a4214bac863 100644 --- a/apiserver/plane/bgtasks/notification_task.py +++ b/apiserver/plane/bgtasks/notification_task.py @@ -22,12 +22,36 @@ from bs4 import BeautifulSoup + +# =========== Issue Description Html Parsing and Notification Functions ====================== + +def update_mentions_for_issue(issue, project, new_mentions, removed_mention): + aggregated_issue_mentions = [] + + for mention_id in new_mentions: + mentioned_user = User.objects.get(pk=mention_id) + aggregated_issue_mentions.append( + IssueMention( + mention=mentioned_user, + issue=issue, + project=project, + workspace=project.workspace + ) + ) + + IssueMention.objects.bulk_create( + aggregated_issue_mentions, batch_size=100) + IssueMention.objects.filter( + issue=issue, mention__in=removed_mention).delete() + + def get_new_mentions(requested_instance, current_instance): # requested_data is the newer instance of the current issue # current_instance is the older instance of the current issue, saved in the database # extract mentions from both the instance of data mentions_older = extract_mentions(current_instance) + mentions_newer = extract_mentions(requested_instance) # Getting Set Difference from mentions_newer @@ -82,8 +106,6 @@ def extract_mentions_as_subscribers(project_id, issue_id, mentions): return bulk_mention_subscribers # Parse Issue Description & extracts mentions - - def extract_mentions(issue_instance): try: # issue_instance has to be a dictionary passed, containing the description_html and other set of activity data. @@ -100,6 +122,65 @@ def extract_mentions(issue_instance): return list(set(mentions)) except Exception as e: return [] + + +# =========== Comment Parsing and Notification Functions ====================== +def extract_comment_mentions(comment_value): + try: + mentions = [] + soup = BeautifulSoup(comment_value, 'html.parser') + mentions_tags = soup.find_all( + 'mention-component', attrs={'target': 'users'} + ) + for mention_tag in mentions_tags: + mentions.append(mention_tag['id']) + return list(set(mentions)) + except Exception as e: + return [] + +def get_new_comment_mentions(new_value, old_value): + + mentions_newer = extract_comment_mentions(new_value) + if old_value is None: + return mentions_newer + + mentions_older = extract_comment_mentions(old_value) + # Getting Set Difference from mentions_newer + new_mentions = [ + mention for mention in mentions_newer if mention not in mentions_older] + + return new_mentions + + +def createMentionNotification(project, notication_comment, issue, actor_id, mention_id, issue_id, activity): + return Notification( + workspace=project.workspace, + sender="in_app:issue_activities:mention", + triggered_by_id=actor_id, + receiver_id=mention_id, + entity_identifier=issue_id, + entity_name="issue", + project=project, + message=notication_comment, + data={ + "issue": { + "id": str(issue_id), + "name": str(issue.name), + "identifier": str(issue.project.identifier), + "sequence_id": issue.sequence_id, + "state_name": issue.state.name, + "state_group": issue.state.group, + }, + "issue_activity": { + "id": str(activity.get("id")), + "verb": str(activity.get("verb")), + "field": str(activity.get("field")), + "actor": str(activity.get("actor_id")), + "new_value": str(activity.get("new_value")), + "old_value": str(activity.get("old_value")), + } + }, + ) @shared_task @@ -127,27 +208,43 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi bulk_notifications = [] """ - Mention Tasks - 1. Perform Diffing and Extract the mentions, that mention notification needs to be sent - 2. From the latest set of mentions, extract the users which are not a subscribers & make them subscribers - """ + Mention Tasks + 1. Perform Diffing and Extract the mentions, that mention notification needs to be sent + 2. From the latest set of mentions, extract the users which are not a subscribers & make them subscribers + """ # Get new mentions from the newer instance new_mentions = get_new_mentions( requested_instance=requested_data, current_instance=current_instance) removed_mention = get_removed_mentions( requested_instance=requested_data, current_instance=current_instance) + + comment_mentions = [] # Get New Subscribers from the mentions of the newer instance requested_mentions = extract_mentions( issue_instance=requested_data) mention_subscribers = extract_mentions_as_subscribers( project_id=project_id, issue_id=issue_id, mentions=requested_mentions) - + + for issue_activity in issue_activities_created: + issue_comment = issue_activity.get("issue_comment") + issue_comment_new_value = issue_activity.get("new_value") + issue_comment_old_value = issue_activity.get("old_value") + if issue_comment is not None: + # TODO: Maybe save the comment mentions, so that in future, we can filter out the issues based on comment mentions as well. + new_comment_mentions = get_new_comment_mentions(old_value=issue_comment_old_value, new_value=issue_comment_new_value) + comment_mentions = comment_mentions + new_comment_mentions + """ + We will not send subscription activity notification to the below mentioned user sets + - Those who have been newly mentioned in the issue description, we will send mention notification to them. + - When the activity is a comment_created and there exist a mention in the comment, then we have to send the "mention_in_comment" notification + - When the activity is a comment_updated and there exist a mention change, then also we have to send the "mention_in_comment" notification + """ issue_subscribers = list( IssueSubscriber.objects.filter( project_id=project_id, issue_id=issue_id) - .exclude(subscriber_id__in=list(new_mentions + [actor_id])) + .exclude(subscriber_id__in=list(new_mentions + comment_mentions + [actor_id])) .values_list("subscriber", flat=True) ) @@ -177,7 +274,9 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi for issue_activity in issue_activities_created: issue_comment = issue_activity.get("issue_comment") if issue_comment is not None: - issue_comment = IssueComment.objects.get(id=issue_comment, issue_id=issue_id, project_id=project_id, workspace_id=project.workspace_id) + issue_comment = IssueComment.objects.get( + id=issue_comment, issue_id=issue_id, project_id=project_id, workspace_id=project.workspace_id) + bulk_notifications.append( Notification( workspace=project.workspace, @@ -218,12 +317,30 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi IssueSubscriber.objects.bulk_create( mention_subscribers, batch_size=100) + last_activity = ( + IssueActivity.objects.filter(issue_id=issue_id) + .order_by("-created_at") + .first() + ) + + actor = User.objects.get(pk=actor_id) + + for mention_id in comment_mentions: + if (mention_id != actor_id): + for issue_activity in issue_activities_created: + notification = createMentionNotification( + project=project, + issue=issue, + notication_comment=f"{actor.display_name} has mentioned you in a comment in issue {issue.name}", + actor_id=actor_id, + mention_id=mention_id, + issue_id=issue_id, + activity=issue_activity + ) + bulk_notifications.append(notification) + + for mention_id in new_mentions: - last_activity = ( - IssueActivity.objects.filter(issue_id=issue_id) - .order_by("-created_at") - .first() - ) if (mention_id != actor_id): if ( last_activity is not None @@ -231,8 +348,8 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi and actor_id == str(last_activity.actor_id) ): bulk_notifications.append( - Notification( - workspace=project.workspace, + Notification( + workspace=project.workspace, sender="in_app:issue_activities:mention", triggered_by_id=actor_id, receiver_id=mention_id, @@ -247,70 +364,37 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi "identifier": str(issue.project.identifier), "sequence_id": issue.sequence_id, "state_name": issue.state.name, - "state_group": issue.state.group, - }, - "issue_activity": { - "id": str(last_activity.id), - "verb": str(last_activity.verb), - "field": str(last_activity.field), - "actor": str(last_activity.actor_id), - "new_value": str(last_activity.new_value), - "old_value": str(last_activity.old_value), - }, - }, - ) - ) + "state_group": issue.state.group, + }, + "issue_activity": { + "id": str(last_activity.id), + "verb": str(last_activity.verb), + "field": str(last_activity.field), + "actor": str(last_activity.actor_id), + "new_value": str(last_activity.new_value), + "old_value": str(last_activity.old_value), + }, + }, + ) + ) else: for issue_activity in issue_activities_created: - bulk_notifications.append( - Notification( - workspace=project.workspace, - sender="in_app:issue_activities:mention", - triggered_by_id=actor_id, - receiver_id=mention_id, - entity_identifier=issue_id, - entity_name="issue", - project=project, - message=f"You have been mentioned in the issue {issue.name}", - data={ - "issue": { - "id": str(issue_id), - "name": str(issue.name), - "identifier": str(issue.project.identifier), - "sequence_id": issue.sequence_id, - "state_name": issue.state.name, - "state_group": issue.state.group, - }, - "issue_activity": { - "id": str(issue_activity.get("id")), - "verb": str(issue_activity.get("verb")), - "field": str(issue_activity.get("field")), - "actor": str(issue_activity.get("actor_id")), - "new_value": str(issue_activity.get("new_value")), - "old_value": str(issue_activity.get("old_value")), - }, - }, - ) - ) - - # Create New Mentions Here - aggregated_issue_mentions = [] - - for mention_id in new_mentions: - mentioned_user = User.objects.get(pk=mention_id) - aggregated_issue_mentions.append( - IssueMention( - mention=mentioned_user, - issue=issue, - project=project, - workspace=project.workspace - ) - ) - - IssueMention.objects.bulk_create( - aggregated_issue_mentions, batch_size=100) - IssueMention.objects.filter( - issue=issue, mention__in=removed_mention).delete() + notification = createMentionNotification( + project=project, + issue=issue, + notication_comment=f"You have been mentioned in the issue {issue.name}", + actor_id=actor_id, + mention_id=mention_id, + issue_id=issue_id, + activity=issue_activity + ) + bulk_notifications.append(notification) + # save new mentions for the particular issue and remove the mentions that has been deleted from the description + update_mentions_for_issue(issue=issue, project=project, new_mentions=new_mentions, + removed_mention=removed_mention) + # Bulk create notifications Notification.objects.bulk_create(bulk_notifications, batch_size=100) + + From 5001465a8df807b216e1d5055cb5ecfe5bb6ade3 Mon Sep 17 00:00:00 2001 From: Henit Chobisa Date: Tue, 7 Nov 2023 13:24:06 +0530 Subject: [PATCH 3/9] feat: added subscription for issue_comment_mentions as well --- apiserver/plane/bgtasks/notification_task.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/apiserver/plane/bgtasks/notification_task.py b/apiserver/plane/bgtasks/notification_task.py index a4214bac863..6a9a5d4af87 100644 --- a/apiserver/plane/bgtasks/notification_task.py +++ b/apiserver/plane/bgtasks/notification_task.py @@ -220,6 +220,7 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi requested_instance=requested_data, current_instance=current_instance) comment_mentions = [] + all_comment_mentions = [] # Get New Subscribers from the mentions of the newer instance requested_mentions = extract_mentions( @@ -233,8 +234,13 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi issue_comment_old_value = issue_activity.get("old_value") if issue_comment is not None: # TODO: Maybe save the comment mentions, so that in future, we can filter out the issues based on comment mentions as well. + + all_comment_mentions = all_comment_mentions + extract_comment_mentions(issue_comment_new_value) + new_comment_mentions = get_new_comment_mentions(old_value=issue_comment_old_value, new_value=issue_comment_new_value) comment_mentions = comment_mentions + new_comment_mentions + + comment_mention_subscribers = extract_mentions_as_subscribers( project_id=project_id, issue_id=issue_id, mentions=all_comment_mentions) """ We will not send subscription activity notification to the below mentioned user sets - Those who have been newly mentioned in the issue description, we will send mention notification to them. @@ -315,7 +321,7 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi # Add Mentioned as Issue Subscribers IssueSubscriber.objects.bulk_create( - mention_subscribers, batch_size=100) + mention_subscribers + comment_mention_subscribers, batch_size=100) last_activity = ( IssueActivity.objects.filter(issue_id=issue_id) @@ -327,6 +333,8 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi for mention_id in comment_mentions: if (mention_id != actor_id): + print("sending notification for the issue activity") + print(mention_id) for issue_activity in issue_activities_created: notification = createMentionNotification( project=project, @@ -337,7 +345,7 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi issue_id=issue_id, activity=issue_activity ) - bulk_notifications.append(notification) + bulk_notifications.append(notification) for mention_id in new_mentions: From 2e0daf1143620954c4a5c4ff640cb7f84ffe38d1 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Tue, 7 Nov 2023 14:51:43 +0530 Subject: [PATCH 4/9] fix: removed the print statement --- apiserver/plane/bgtasks/notification_task.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/apiserver/plane/bgtasks/notification_task.py b/apiserver/plane/bgtasks/notification_task.py index 6a9a5d4af87..bd603b8ac1b 100644 --- a/apiserver/plane/bgtasks/notification_task.py +++ b/apiserver/plane/bgtasks/notification_task.py @@ -333,8 +333,6 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi for mention_id in comment_mentions: if (mention_id != actor_id): - print("sending notification for the issue activity") - print(mention_id) for issue_activity in issue_activities_created: notification = createMentionNotification( project=project, From 31c01280ad491fcf26862b43a17ca07ff17a45c3 Mon Sep 17 00:00:00 2001 From: Henit Chobisa Date: Tue, 7 Nov 2023 17:09:24 +0530 Subject: [PATCH 5/9] fix: double notification popup for mentioned assignees --- apiserver/plane/bgtasks/notification_task.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/apiserver/plane/bgtasks/notification_task.py b/apiserver/plane/bgtasks/notification_task.py index bd603b8ac1b..3ae0f3db1e6 100644 --- a/apiserver/plane/bgtasks/notification_task.py +++ b/apiserver/plane/bgtasks/notification_task.py @@ -91,6 +91,9 @@ def extract_mentions_as_subscribers(project_id, issue_id, mentions): issue_id=issue_id, subscriber=mention_id, project=project_id, + ).exists() and not IssueAssignee.objects.filter( + project_id=project_id, issue_id=issue_id, + assignee=mention_id ).exists(): mentioned_user = User.objects.get(pk=mention_id) @@ -247,20 +250,21 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi - When the activity is a comment_created and there exist a mention in the comment, then we have to send the "mention_in_comment" notification - When the activity is a comment_updated and there exist a mention change, then also we have to send the "mention_in_comment" notification """ + + issue_assignees = list( + IssueAssignee.objects.filter( + project_id=project_id, issue_id=issue_id) + .exclude(assignee_id__in=list([actor_id] + new_mentions + comment_mentions)) + .values_list("assignee", flat=True) + ) + issue_subscribers = list( IssueSubscriber.objects.filter( project_id=project_id, issue_id=issue_id) .exclude(subscriber_id__in=list(new_mentions + comment_mentions + [actor_id])) .values_list("subscriber", flat=True) ) - - issue_assignees = list( - IssueAssignee.objects.filter( - project_id=project_id, issue_id=issue_id) - .exclude(assignee_id=actor_id) - .values_list("assignee", flat=True) - ) - + issue_subscribers = issue_subscribers + issue_assignees issue = Issue.objects.filter(pk=issue_id).first() From 63dd1b8f82759a5395a7ae4708e52fabfff84400 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Tue, 7 Nov 2023 17:15:22 +0530 Subject: [PATCH 6/9] fix: added issue subscriber --- apiserver/plane/bgtasks/notification_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apiserver/plane/bgtasks/notification_task.py b/apiserver/plane/bgtasks/notification_task.py index 3ae0f3db1e6..9f5fe0d2bc6 100644 --- a/apiserver/plane/bgtasks/notification_task.py +++ b/apiserver/plane/bgtasks/notification_task.py @@ -273,7 +273,7 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi # add the user to issue subscriber try: _ = IssueSubscriber.objects.get_or_create( - issue_id=issue_id, subscriber_id=actor_id + project_id=project_id, issue_id=issue_id, subscriber_id=actor_id ) except Exception as e: pass From df1895477e39333c51380a744da2dcca924b7b61 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Tue, 7 Nov 2023 17:51:59 +0530 Subject: [PATCH 7/9] fix: removed creator for subscribed --- apiserver/plane/bgtasks/notification_task.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/apiserver/plane/bgtasks/notification_task.py b/apiserver/plane/bgtasks/notification_task.py index 9f5fe0d2bc6..2797b86aff1 100644 --- a/apiserver/plane/bgtasks/notification_task.py +++ b/apiserver/plane/bgtasks/notification_task.py @@ -269,12 +269,16 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi issue = Issue.objects.filter(pk=issue_id).first() + if (str(issue.created_by_id) != str(actor_id)): + issue_subscribers = issue_subscribers + [issue.created_by_id] + if subscriber: # add the user to issue subscriber try: - _ = IssueSubscriber.objects.get_or_create( - project_id=project_id, issue_id=issue_id, subscriber_id=actor_id - ) + if str(issue.created_by_id) != str(actor_id): + _ = IssueSubscriber.objects.get_or_create( + project_id=project_id, issue_id=issue_id, subscriber_id=actor_id + ) except Exception as e: pass From 0c668b8f2c24862a6e91f29e5703f77164525494 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Wed, 8 Nov 2023 12:17:04 +0530 Subject: [PATCH 8/9] fix: creator will not be subscribed to issue --- apiserver/plane/bgtasks/notification_task.py | 36 +++++++++----------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/apiserver/plane/bgtasks/notification_task.py b/apiserver/plane/bgtasks/notification_task.py index 2797b86aff1..875ae9ca432 100644 --- a/apiserver/plane/bgtasks/notification_task.py +++ b/apiserver/plane/bgtasks/notification_task.py @@ -1,9 +1,6 @@ # Python imports import json -# Django imports -from django.utils import timezone - # Module imports from plane.db.models import ( IssueMention, @@ -29,13 +26,12 @@ def update_mentions_for_issue(issue, project, new_mentions, removed_mention): aggregated_issue_mentions = [] for mention_id in new_mentions: - mentioned_user = User.objects.get(pk=mention_id) aggregated_issue_mentions.append( IssueMention( - mention=mentioned_user, + mention_id=mention_id, issue=issue, project=project, - workspace=project.workspace + workspace_id=project.workspace_id ) ) @@ -89,22 +85,22 @@ def extract_mentions_as_subscribers(project_id, issue_id, mentions): # If the particular mention has not already been subscribed to the issue, he must be sent the mentioned notification if not IssueSubscriber.objects.filter( issue_id=issue_id, - subscriber=mention_id, - project=project_id, + subscriber_id=mention_id, + project_id=project_id, ).exists() and not IssueAssignee.objects.filter( project_id=project_id, issue_id=issue_id, - assignee=mention_id + assignee_id=mention_id + ).exists() and not Issue.objects.filter( + project_id=project_id, pk=issue_id, created_by_id=mention_id ).exists(): - mentioned_user = User.objects.get(pk=mention_id) project = Project.objects.get(pk=project_id) - issue = Issue.objects.get(pk=issue_id) bulk_mention_subscribers.append(IssueSubscriber( - workspace=project.workspace, - project=project, - issue=issue, - subscriber=mentioned_user, + workspace_id=project.workspace_id, + project_id=project_id, + issue_id=issue_id, + subscriber_id=mention_id, )) return bulk_mention_subscribers @@ -155,7 +151,7 @@ def get_new_comment_mentions(new_value, old_value): return new_mentions -def createMentionNotification(project, notication_comment, issue, actor_id, mention_id, issue_id, activity): +def createMentionNotification(project, notification_comment, issue, actor_id, mention_id, issue_id, activity): return Notification( workspace=project.workspace, sender="in_app:issue_activities:mention", @@ -164,7 +160,7 @@ def createMentionNotification(project, notication_comment, issue, actor_id, ment entity_identifier=issue_id, entity_name="issue", project=project, - message=notication_comment, + message=notification_comment, data={ "issue": { "id": str(issue_id), @@ -269,7 +265,7 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi issue = Issue.objects.filter(pk=issue_id).first() - if (str(issue.created_by_id) != str(actor_id)): + if (issue.created_by_id is not None and str(issue.created_by_id) != str(actor_id)): issue_subscribers = issue_subscribers + [issue.created_by_id] if subscriber: @@ -345,7 +341,7 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi notification = createMentionNotification( project=project, issue=issue, - notication_comment=f"{actor.display_name} has mentioned you in a comment in issue {issue.name}", + notification_comment=f"{actor.display_name} has mentioned you in a comment in issue {issue.name}", actor_id=actor_id, mention_id=mention_id, issue_id=issue_id, @@ -396,7 +392,7 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi notification = createMentionNotification( project=project, issue=issue, - notication_comment=f"You have been mentioned in the issue {issue.name}", + notification_comment=f"You have been mentioned in the issue {issue.name}", actor_id=actor_id, mention_id=mention_id, issue_id=issue_id, From 4d0218fb5a1698e30eab24ece280c1e4c87be254 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Thu, 9 Nov 2023 11:47:15 +0530 Subject: [PATCH 9/9] fix: double notification removed --- apiserver/plane/bgtasks/notification_task.py | 24 +++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/apiserver/plane/bgtasks/notification_task.py b/apiserver/plane/bgtasks/notification_task.py index 875ae9ca432..0c2199e447e 100644 --- a/apiserver/plane/bgtasks/notification_task.py +++ b/apiserver/plane/bgtasks/notification_task.py @@ -1,5 +1,6 @@ # Python imports import json +import uuid # Module imports from plane.db.models import ( @@ -154,7 +155,7 @@ def get_new_comment_mentions(new_value, old_value): def createMentionNotification(project, notification_comment, issue, actor_id, mention_id, issue_id, activity): return Notification( workspace=project.workspace, - sender="in_app:issue_activities:mention", + sender="in_app:issue_activities:mentioned", triggered_by_id=actor_id, receiver_id=mention_id, entity_identifier=issue_id, @@ -250,7 +251,7 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi issue_assignees = list( IssueAssignee.objects.filter( project_id=project_id, issue_id=issue_id) - .exclude(assignee_id__in=list([actor_id] + new_mentions + comment_mentions)) + .exclude(assignee_id__in=list(new_mentions + comment_mentions)) .values_list("assignee", flat=True) ) @@ -260,8 +261,6 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi .exclude(subscriber_id__in=list(new_mentions + comment_mentions + [actor_id])) .values_list("subscriber", flat=True) ) - - issue_subscribers = issue_subscribers + issue_assignees issue = Issue.objects.filter(pk=issue_id).first() @@ -271,7 +270,7 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi if subscriber: # add the user to issue subscriber try: - if str(issue.created_by_id) != str(actor_id): + if str(issue.created_by_id) != str(actor_id) and uuid.UUID(actor_id) not in issue_assignees: _ = IssueSubscriber.objects.get_or_create( project_id=project_id, issue_id=issue_id, subscriber_id=actor_id ) @@ -280,7 +279,16 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi project = Project.objects.get(pk=project_id) - for subscriber in list(set(issue_subscribers)): + issue_subscribers = list(set(issue_subscribers + issue_assignees) - {uuid.UUID(actor_id)}) + + for subscriber in issue_subscribers: + if subscriber in issue_subscribers: + sender = "in_app:issue_activities:subscribed" + if issue.created_by_id is not None and subscriber == issue.created_by_id: + sender = "in_app:issue_activities:created" + if subscriber in issue_assignees: + sender = "in_app:issue_activities:assigned" + for issue_activity in issue_activities_created: issue_comment = issue_activity.get("issue_comment") if issue_comment is not None: @@ -290,7 +298,7 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi bulk_notifications.append( Notification( workspace=project.workspace, - sender="in_app:issue_activities", + sender=sender, triggered_by_id=actor_id, receiver_id=subscriber, entity_identifier=issue_id, @@ -360,7 +368,7 @@ def notifications(type, issue_id, project_id, actor_id, subscriber, issue_activi bulk_notifications.append( Notification( workspace=project.workspace, - sender="in_app:issue_activities:mention", + sender="in_app:issue_activities:mentioned", triggered_by_id=actor_id, receiver_id=mention_id, entity_identifier=issue_id,