mirror of
https://github.com/zulip/zulip.git
synced 2025-11-13 02:17:19 +00:00
models: Move some functions to zerver.lib.display_recipient.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
committed by
Alex Vandiver
parent
f77648f279
commit
0c8d6dab65
@@ -15,19 +15,13 @@ from zerver.actions.message_send import (
|
||||
)
|
||||
from zerver.actions.uploads import check_attachment_reference_change, do_claim_attachments
|
||||
from zerver.lib.addressee import Addressee
|
||||
from zerver.lib.display_recipient import get_recipient_ids
|
||||
from zerver.lib.exceptions import JsonableError, RealmDeactivatedError, UserDeactivatedError
|
||||
from zerver.lib.message import SendMessageRequest, render_markdown, truncate_topic
|
||||
from zerver.lib.recipient_parsing import extract_direct_message_recipient_ids, extract_stream_id
|
||||
from zerver.lib.scheduled_messages import access_scheduled_message
|
||||
from zerver.lib.string_validation import check_stream_topic
|
||||
from zerver.models import (
|
||||
Client,
|
||||
Realm,
|
||||
ScheduledMessage,
|
||||
Subscription,
|
||||
UserProfile,
|
||||
get_recipient_ids,
|
||||
)
|
||||
from zerver.models import Client, Realm, ScheduledMessage, Subscription, UserProfile
|
||||
from zerver.models.users import get_system_bot
|
||||
from zerver.tornado.django_api import send_event
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from typing import Dict, List, Optional, Set, Tuple, TypedDict
|
||||
from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, TypedDict
|
||||
|
||||
from django_stubs_ext import ValuesQuerySet
|
||||
|
||||
@@ -9,8 +9,11 @@ from zerver.lib.cache import (
|
||||
generic_bulk_cached_fetch,
|
||||
single_user_display_recipient_cache_key,
|
||||
)
|
||||
from zerver.lib.per_request_cache import return_same_value_during_entire_request
|
||||
from zerver.lib.types import DisplayRecipientT, UserDisplayRecipient
|
||||
from zerver.models import Recipient, Stream, UserProfile, bulk_get_huddle_user_ids
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from zerver.models import Recipient
|
||||
|
||||
display_recipient_fields = [
|
||||
"id",
|
||||
@@ -44,6 +47,8 @@ def get_display_recipient_remote_cache(
|
||||
Do not use this for streams.
|
||||
"""
|
||||
|
||||
from zerver.models import Recipient, UserProfile
|
||||
|
||||
assert recipient_type != Recipient.STREAM
|
||||
|
||||
# The main priority for ordering here is being deterministic.
|
||||
@@ -64,6 +69,8 @@ def user_dict_id_fetcher(user_dict: UserDisplayRecipient) -> int:
|
||||
|
||||
|
||||
def bulk_fetch_single_user_display_recipients(uids: List[int]) -> Dict[int, UserDisplayRecipient]:
|
||||
from zerver.models import UserProfile
|
||||
|
||||
return bulk_cached_fetch(
|
||||
# Use a separate cache key to protect us from conflicts with
|
||||
# the get_user_profile_by_id cache.
|
||||
@@ -85,6 +92,8 @@ def bulk_fetch_stream_names(
|
||||
Returns dict mapping recipient_id to corresponding display_recipient
|
||||
"""
|
||||
|
||||
from zerver.models import Stream
|
||||
|
||||
if len(recipient_tuples) == 0:
|
||||
return {}
|
||||
|
||||
@@ -125,6 +134,8 @@ def bulk_fetch_user_display_recipients(
|
||||
Returns dict mapping recipient_id to corresponding display_recipient
|
||||
"""
|
||||
|
||||
from zerver.models import Recipient, bulk_get_huddle_user_ids
|
||||
|
||||
if len(recipient_tuples) == 0:
|
||||
return {}
|
||||
|
||||
@@ -172,6 +183,8 @@ def bulk_fetch_display_recipients(
|
||||
Returns dict mapping recipient_id to corresponding display_recipient
|
||||
"""
|
||||
|
||||
from zerver.models import Recipient
|
||||
|
||||
stream_recipients = {
|
||||
recipient for recipient in recipient_tuples if recipient[1] == Recipient.STREAM
|
||||
}
|
||||
@@ -184,3 +197,50 @@ def bulk_fetch_display_recipients(
|
||||
|
||||
# Glue the dicts together and return:
|
||||
return {**stream_display_recipients, **personal_and_huddle_display_recipients}
|
||||
|
||||
|
||||
@return_same_value_during_entire_request
|
||||
def get_display_recipient_by_id(
|
||||
recipient_id: int, recipient_type: int, recipient_type_id: Optional[int]
|
||||
) -> List[UserDisplayRecipient]:
|
||||
"""
|
||||
returns: an object describing the recipient (using a cache).
|
||||
If the type is a stream, the type_id must be an int; a string is returned.
|
||||
Otherwise, type_id may be None; an array of recipient dicts is returned.
|
||||
"""
|
||||
# Have to import here, to avoid circular dependency.
|
||||
from zerver.lib.display_recipient import get_display_recipient_remote_cache
|
||||
|
||||
return get_display_recipient_remote_cache(recipient_id, recipient_type, recipient_type_id)
|
||||
|
||||
|
||||
def get_display_recipient(recipient: "Recipient") -> List[UserDisplayRecipient]:
|
||||
return get_display_recipient_by_id(
|
||||
recipient.id,
|
||||
recipient.type,
|
||||
recipient.type_id,
|
||||
)
|
||||
|
||||
|
||||
def get_recipient_ids(
|
||||
recipient: Optional["Recipient"], user_profile_id: int
|
||||
) -> Tuple[List[int], str]:
|
||||
from zerver.models import Recipient
|
||||
|
||||
if recipient is None:
|
||||
recipient_type_str = ""
|
||||
to = []
|
||||
elif recipient.type == Recipient.STREAM:
|
||||
recipient_type_str = "stream"
|
||||
to = [recipient.type_id]
|
||||
else:
|
||||
recipient_type_str = "private"
|
||||
if recipient.type == Recipient.PERSONAL:
|
||||
to = [recipient.type_id]
|
||||
else:
|
||||
to = []
|
||||
for r in get_display_recipient(recipient):
|
||||
assert not isinstance(r, str) # It will only be a string for streams
|
||||
if r["id"] != user_profile_id:
|
||||
to.append(r["id"])
|
||||
return to, recipient_type_str
|
||||
|
||||
@@ -14,6 +14,7 @@ from zerver.actions.message_send import (
|
||||
internal_send_private_message,
|
||||
internal_send_stream_message,
|
||||
)
|
||||
from zerver.lib.display_recipient import get_display_recipient
|
||||
from zerver.lib.email_mirror_helpers import (
|
||||
ZulipEmailForwardError,
|
||||
ZulipEmailForwardUserError,
|
||||
@@ -36,7 +37,6 @@ from zerver.models import (
|
||||
Stream,
|
||||
UserProfile,
|
||||
get_client,
|
||||
get_display_recipient,
|
||||
get_stream_by_id_in_realm,
|
||||
)
|
||||
from zerver.models.users import get_system_bot, get_user_profile_by_id
|
||||
|
||||
@@ -21,6 +21,7 @@ from django.utils.translation import override as override_language
|
||||
from lxml.html import builder as e
|
||||
|
||||
from confirmation.models import one_click_unsubscribe_link
|
||||
from zerver.lib.display_recipient import get_display_recipient
|
||||
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
|
||||
@@ -44,7 +45,6 @@ from zerver.models import (
|
||||
UserMessage,
|
||||
UserProfile,
|
||||
get_context_for_message,
|
||||
get_display_recipient,
|
||||
)
|
||||
from zerver.models.users import get_user_profile_by_id
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ from zerver.lib.cache import (
|
||||
to_dict_cache_key,
|
||||
to_dict_cache_key_id,
|
||||
)
|
||||
from zerver.lib.display_recipient import bulk_fetch_display_recipients
|
||||
from zerver.lib.display_recipient import bulk_fetch_display_recipients, get_display_recipient_by_id
|
||||
from zerver.lib.exceptions import JsonableError, MissingAuthenticationError
|
||||
from zerver.lib.markdown import MessageRenderingResult, markdown_convert, topic_links
|
||||
from zerver.lib.markdown import version as markdown_version
|
||||
@@ -74,7 +74,6 @@ from zerver.models import (
|
||||
UserMessage,
|
||||
UserProfile,
|
||||
UserTopic,
|
||||
get_display_recipient_by_id,
|
||||
get_usermessage_by_message_id,
|
||||
query_for_ids,
|
||||
)
|
||||
|
||||
@@ -39,6 +39,7 @@ from zerver.actions.realm_settings import (
|
||||
do_set_realm_property,
|
||||
)
|
||||
from zerver.lib.avatar import absolute_avatar_url, get_avatar_for_inaccessible_user
|
||||
from zerver.lib.display_recipient import get_display_recipient
|
||||
from zerver.lib.emoji_utils import hex_codepoint_to_emoji
|
||||
from zerver.lib.exceptions import ErrorCode, JsonableError
|
||||
from zerver.lib.message import access_message, huddle_users
|
||||
@@ -64,7 +65,6 @@ from zerver.models import (
|
||||
UserGroup,
|
||||
UserMessage,
|
||||
UserProfile,
|
||||
get_display_recipient,
|
||||
)
|
||||
from zerver.models.realms import get_fake_email_domain
|
||||
from zerver.models.users import get_user_profile_by_id
|
||||
|
||||
@@ -43,8 +43,8 @@ from zerver.lib.cache import (
|
||||
realm_alert_words_automaton_cache_key,
|
||||
realm_alert_words_cache_key,
|
||||
)
|
||||
from zerver.lib.display_recipient import get_display_recipient, get_recipient_ids
|
||||
from zerver.lib.exceptions import RateLimitedError
|
||||
from zerver.lib.per_request_cache import return_same_value_during_entire_request
|
||||
from zerver.lib.timestamp import datetime_to_timestamp
|
||||
from zerver.lib.types import (
|
||||
DefaultStreamDict,
|
||||
@@ -56,7 +56,6 @@ from zerver.lib.types import (
|
||||
ProfileDataElementValue,
|
||||
RealmUserValidator,
|
||||
UnspecifiedValue,
|
||||
UserDisplayRecipient,
|
||||
UserFieldElement,
|
||||
Validator,
|
||||
)
|
||||
@@ -139,51 +138,6 @@ def query_for_ids(
|
||||
return query
|
||||
|
||||
|
||||
@return_same_value_during_entire_request
|
||||
def get_display_recipient_by_id(
|
||||
recipient_id: int, recipient_type: int, recipient_type_id: Optional[int]
|
||||
) -> List[UserDisplayRecipient]:
|
||||
"""
|
||||
returns: an object describing the recipient (using a cache).
|
||||
If the type is a stream, the type_id must be an int; a string is returned.
|
||||
Otherwise, type_id may be None; an array of recipient dicts is returned.
|
||||
"""
|
||||
# Have to import here, to avoid circular dependency.
|
||||
from zerver.lib.display_recipient import get_display_recipient_remote_cache
|
||||
|
||||
return get_display_recipient_remote_cache(recipient_id, recipient_type, recipient_type_id)
|
||||
|
||||
|
||||
def get_display_recipient(recipient: "Recipient") -> List[UserDisplayRecipient]:
|
||||
return get_display_recipient_by_id(
|
||||
recipient.id,
|
||||
recipient.type,
|
||||
recipient.type_id,
|
||||
)
|
||||
|
||||
|
||||
def get_recipient_ids(
|
||||
recipient: Optional["Recipient"], user_profile_id: int
|
||||
) -> Tuple[List[int], str]:
|
||||
if recipient is None:
|
||||
recipient_type_str = ""
|
||||
to = []
|
||||
elif recipient.type == Recipient.STREAM:
|
||||
recipient_type_str = "stream"
|
||||
to = [recipient.type_id]
|
||||
else:
|
||||
recipient_type_str = "private"
|
||||
if recipient.type == Recipient.PERSONAL:
|
||||
to = [recipient.type_id]
|
||||
else:
|
||||
to = []
|
||||
for r in get_display_recipient(recipient):
|
||||
assert not isinstance(r, str) # It will only be a string for streams
|
||||
if r["id"] != user_profile_id:
|
||||
to.append(r["id"])
|
||||
return to, recipient_type_str
|
||||
|
||||
|
||||
class Recipient(models.Model):
|
||||
"""Represents an audience that can potentially receive messages in Zulip.
|
||||
|
||||
|
||||
@@ -4,8 +4,9 @@ import orjson
|
||||
from typing_extensions import override
|
||||
|
||||
from zerver.lib.bot_lib import EmbeddedBotQuitError
|
||||
from zerver.lib.display_recipient import get_display_recipient
|
||||
from zerver.lib.test_classes import ZulipTestCase
|
||||
from zerver.models import UserProfile, get_display_recipient, get_service_profile
|
||||
from zerver.models import UserProfile, get_service_profile
|
||||
from zerver.models.realms import get_realm
|
||||
from zerver.models.users import get_user
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ from unittest import mock
|
||||
from django.utils.timezone import now as timezone_now
|
||||
|
||||
from zerver.lib.cache import cache_delete, to_dict_cache_key_id
|
||||
from zerver.lib.display_recipient import get_display_recipient
|
||||
from zerver.lib.markdown import version as markdown_version
|
||||
from zerver.lib.message import MessageDict, messages_for_ids, sew_messages_and_reactions
|
||||
from zerver.lib.per_request_cache import flush_per_request_caches
|
||||
@@ -19,7 +20,6 @@ from zerver.models import (
|
||||
Recipient,
|
||||
Stream,
|
||||
UserProfile,
|
||||
get_display_recipient,
|
||||
get_stream,
|
||||
)
|
||||
from zerver.models.realms import get_realm
|
||||
|
||||
@@ -18,6 +18,7 @@ from zerver.actions.uploads import do_claim_attachments
|
||||
from zerver.actions.user_settings import do_change_user_setting
|
||||
from zerver.actions.users import do_deactivate_user
|
||||
from zerver.lib.avatar import avatar_url
|
||||
from zerver.lib.display_recipient import get_display_recipient
|
||||
from zerver.lib.exceptions import JsonableError
|
||||
from zerver.lib.mention import MentionBackend, MentionData
|
||||
from zerver.lib.message import (
|
||||
@@ -57,7 +58,6 @@ from zerver.models import (
|
||||
UserMessage,
|
||||
UserProfile,
|
||||
UserTopic,
|
||||
get_display_recipient,
|
||||
get_stream,
|
||||
)
|
||||
from zerver.models.realms import get_realm
|
||||
|
||||
Reference in New Issue
Block a user