notifications: Move user group mentions helpers together.

This refactored `get_mentioned_user_group_name` from
`zerver/lib/email_notifications.py` to
`zerver/lib/notification_data.py` just after
`get_user_group_mentions_data` to indicate the logical
similarity between them.

Signed-off-by: Zixuan James Li <359101898@qq.com>
This commit is contained in:
Zixuan James Li
2022-04-18 16:46:07 -04:00
committed by Tim Abbott
parent c97162e485
commit d8101de34d
2 changed files with 44 additions and 44 deletions

View File

@@ -1,7 +1,6 @@
# See https://zulip.readthedocs.io/en/latest/subsystems/notifications.html
import logging
import math
import re
from collections import defaultdict
from datetime import timedelta
@@ -23,6 +22,7 @@ from confirmation.models import one_click_unsubscribe_link
from zerver.decorator import statsd_increment
from zerver.lib.markdown.fenced_code import FENCE_RE
from zerver.lib.message import bulk_access_messages
from zerver.lib.notification_data import get_mentioned_user_group_name
from zerver.lib.queue import queue_json_publish
from zerver.lib.send_email import FromAddress, send_future_email
from zerver.lib.types import DisplayRecipientT
@@ -32,12 +32,10 @@ from zerver.lib.url_encoding import (
stream_narrow_url,
topic_narrow_url,
)
from zerver.lib.user_groups import get_user_group_direct_member_ids
from zerver.models import (
Message,
Recipient,
Stream,
UserGroup,
UserMessage,
UserProfile,
get_context_for_message,
@@ -344,45 +342,6 @@ def get_narrow_url(
return topic_narrow_url(user_profile.realm, stream, message.topic_name())
def get_mentioned_user_group_name(
messages: List[Dict[str, Any]], user_profile: UserProfile
) -> Optional[str]:
"""Returns the user group name to display in the email notification
if user group(s) are mentioned.
This implements the same algorithm as get_user_group_mentions_data
in zerver/lib/notification_data.py, but we're passed a list of
messages instead.
"""
for message in messages:
if message["mentioned_user_group_id"] is None and message["trigger"] == "mentioned":
# The user has also been personally mentioned, so that gets prioritized.
return None
# These IDs are those of the smallest user groups mentioned in each message.
mentioned_user_group_ids = [
message["mentioned_user_group_id"]
for message in messages
if message["mentioned_user_group_id"] is not None
]
# We now want to calculate the name of the smallest user group mentioned among
# all these messages.
smallest_user_group_size = math.inf
smallest_user_group_name = None
for user_group_id in mentioned_user_group_ids:
current_user_group = UserGroup.objects.get(id=user_group_id, realm=user_profile.realm)
current_user_group_size = len(get_user_group_direct_member_ids(current_user_group))
if current_user_group_size < smallest_user_group_size:
# If multiple user groups are mentioned, we prefer the
# user group with the least members.
smallest_user_group_size = current_user_group_size
smallest_user_group_name = current_user_group.name
return smallest_user_group_name
def message_content_allowed_in_missedmessage_emails(user_profile: UserProfile) -> bool:
return (
user_profile.realm.message_content_allowed_in_email_notifications

View File

@@ -1,8 +1,10 @@
import math
from dataclasses import dataclass
from typing import Collection, Dict, List, Optional, Set
from typing import Any, Collection, Dict, List, Optional, Set
from zerver.lib.mention import MentionData
from zerver.models import NotificationTriggers
from zerver.lib.user_groups import get_user_group_direct_member_ids
from zerver.models import NotificationTriggers, UserGroup, UserProfile
@dataclass
@@ -187,3 +189,42 @@ def get_user_group_mentions_data(
mentioned_user_groups_map[member_id] = group_id
return mentioned_user_groups_map
def get_mentioned_user_group_name(
messages: List[Dict[str, Any]], user_profile: UserProfile
) -> Optional[str]:
"""Returns the user group name to display in the email notification
if user group(s) are mentioned.
This implements the same algorithm as get_user_group_mentions_data
in zerver/lib/notification_data.py, but we're passed a list of
messages instead.
"""
for message in messages:
if message["mentioned_user_group_id"] is None and message["trigger"] == "mentioned":
# The user has also been personally mentioned, so that gets prioritized.
return None
# These IDs are those of the smallest user groups mentioned in each message.
mentioned_user_group_ids = [
message["mentioned_user_group_id"]
for message in messages
if message["mentioned_user_group_id"] is not None
]
# We now want to calculate the name of the smallest user group mentioned among
# all these messages.
smallest_user_group_size = math.inf
smallest_user_group_name = None
for user_group_id in mentioned_user_group_ids:
current_user_group = UserGroup.objects.get(id=user_group_id, realm=user_profile.realm)
current_user_group_size = len(get_user_group_direct_member_ids(current_user_group))
if current_user_group_size < smallest_user_group_size:
# If multiple user groups are mentioned, we prefer the
# user group with the least members.
smallest_user_group_size = current_user_group_size
smallest_user_group_name = current_user_group.name
return smallest_user_group_name