mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 22:13:26 +00:00
embeds: Propagate group membership before updating UserMessage flags.
This commit is contained in:
committed by
Tim Abbott
parent
bfdd28c638
commit
7480510aeb
@@ -442,10 +442,15 @@ def do_update_embedded_data(
|
|||||||
user_profile: UserProfile,
|
user_profile: UserProfile,
|
||||||
message: Message,
|
message: Message,
|
||||||
rendered_content: str | MessageRenderingResult,
|
rendered_content: str | MessageRenderingResult,
|
||||||
|
mention_data: MentionData | None = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
ums = UserMessage.objects.filter(message=message.id)
|
ums = UserMessage.objects.filter(message=message.id)
|
||||||
update_fields = ["rendered_content"]
|
update_fields = ["rendered_content"]
|
||||||
if isinstance(rendered_content, MessageRenderingResult):
|
if isinstance(rendered_content, MessageRenderingResult):
|
||||||
|
assert mention_data is not None
|
||||||
|
for group_id in rendered_content.mentions_user_group_ids:
|
||||||
|
members = mention_data.get_group_members(group_id)
|
||||||
|
rendered_content.mentions_user_ids.update(members)
|
||||||
update_user_message_flags(rendered_content, ums)
|
update_user_message_flags(rendered_content, ums)
|
||||||
message.rendered_content = rendered_content.rendered_content
|
message.rendered_content = rendered_content.rendered_content
|
||||||
message.rendered_content_version = markdown_version
|
message.rendered_content_version = markdown_version
|
||||||
|
|||||||
@@ -1051,9 +1051,14 @@ class NormalActionsTest(BaseAction):
|
|||||||
|
|
||||||
# Verify special case of embedded content update
|
# Verify special case of embedded content update
|
||||||
content = "embed_content"
|
content = "embed_content"
|
||||||
rendering_result = render_message_markdown(message, content)
|
mention_data = MentionData(
|
||||||
|
mention_backend=MentionBackend(message.realm_id),
|
||||||
|
content=content,
|
||||||
|
message_sender=message.sender,
|
||||||
|
)
|
||||||
|
rendering_result = render_message_markdown(message, content, mention_data=mention_data)
|
||||||
with self.verify_action(state_change_expected=False) as events:
|
with self.verify_action(state_change_expected=False) as events:
|
||||||
do_update_embedded_data(self.user_profile, message, rendering_result)
|
do_update_embedded_data(self.user_profile, message, rendering_result, mention_data)
|
||||||
check_update_message(
|
check_update_message(
|
||||||
"events[0]",
|
"events[0]",
|
||||||
events[0],
|
events[0],
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ from zerver.lib.url_preview.oembed import get_oembed_data, strip_cdata
|
|||||||
from zerver.lib.url_preview.parsers import GenericParser, OpenGraphParser
|
from zerver.lib.url_preview.parsers import GenericParser, OpenGraphParser
|
||||||
from zerver.lib.url_preview.preview import get_link_embed_data
|
from zerver.lib.url_preview.preview import get_link_embed_data
|
||||||
from zerver.lib.url_preview.types import UrlEmbedData, UrlOEmbedData
|
from zerver.lib.url_preview.types import UrlEmbedData, UrlOEmbedData
|
||||||
from zerver.models import Message, Realm, UserProfile
|
from zerver.models import Message, Realm, UserMessage, UserProfile
|
||||||
from zerver.worker.embed_links import FetchLinksEmbedData
|
from zerver.worker.embed_links import FetchLinksEmbedData
|
||||||
|
|
||||||
|
|
||||||
@@ -377,7 +377,11 @@ class PreviewTestCase(ZulipTestCase):
|
|||||||
@responses.activate
|
@responses.activate
|
||||||
@override_settings(INLINE_URL_EMBED_PREVIEW=True)
|
@override_settings(INLINE_URL_EMBED_PREVIEW=True)
|
||||||
def _send_message_with_test_org_url(
|
def _send_message_with_test_org_url(
|
||||||
self, sender: UserProfile, queue_should_run: bool = True, relative_url: bool = False
|
self,
|
||||||
|
sender: UserProfile,
|
||||||
|
queue_should_run: bool = True,
|
||||||
|
relative_url: bool = False,
|
||||||
|
other_content: str = "",
|
||||||
) -> Message:
|
) -> Message:
|
||||||
url = "http://test.org/"
|
url = "http://test.org/"
|
||||||
# Ensure the cache for this is empty
|
# Ensure the cache for this is empty
|
||||||
@@ -386,7 +390,7 @@ class PreviewTestCase(ZulipTestCase):
|
|||||||
msg_id = self.send_personal_message(
|
msg_id = self.send_personal_message(
|
||||||
sender,
|
sender,
|
||||||
self.example_user("cordelia"),
|
self.example_user("cordelia"),
|
||||||
content=url,
|
content=url + other_content,
|
||||||
)
|
)
|
||||||
if queue_should_run:
|
if queue_should_run:
|
||||||
patched.assert_called_once()
|
patched.assert_called_once()
|
||||||
@@ -510,6 +514,48 @@ class PreviewTestCase(ZulipTestCase):
|
|||||||
in info_logs.output[0]
|
in info_logs.output[0]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_mentions_preserved(self) -> None:
|
||||||
|
# Updating the message with the preview content should be sure
|
||||||
|
# to preserve the mention data.
|
||||||
|
msg = self._send_message_with_test_org_url(
|
||||||
|
sender=self.example_user("hamlet"),
|
||||||
|
other_content=" @**Cordelia, Lear's daughter** mention",
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
int(
|
||||||
|
UserMessage.objects.get(message=msg, user_profile=self.example_user("hamlet")).flags
|
||||||
|
),
|
||||||
|
int(UserMessage.flags.read | UserMessage.flags.is_private),
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
int(
|
||||||
|
UserMessage.objects.get(
|
||||||
|
message=msg, user_profile=self.example_user("cordelia")
|
||||||
|
).flags
|
||||||
|
),
|
||||||
|
int(UserMessage.flags.mentioned | UserMessage.flags.is_private),
|
||||||
|
)
|
||||||
|
|
||||||
|
msg = self._send_message_with_test_org_url(
|
||||||
|
sender=self.example_user("hamlet"), other_content=" @*hamletcharacters* mention"
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
int(
|
||||||
|
UserMessage.objects.get(message=msg, user_profile=self.example_user("hamlet")).flags
|
||||||
|
),
|
||||||
|
int(
|
||||||
|
UserMessage.flags.mentioned | UserMessage.flags.read | UserMessage.flags.is_private
|
||||||
|
),
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
int(
|
||||||
|
UserMessage.objects.get(
|
||||||
|
message=msg, user_profile=self.example_user("cordelia")
|
||||||
|
).flags
|
||||||
|
),
|
||||||
|
int(UserMessage.flags.mentioned | UserMessage.flags.is_private),
|
||||||
|
)
|
||||||
|
|
||||||
def test_get_link_embed_data(self) -> None:
|
def test_get_link_embed_data(self) -> None:
|
||||||
url = "http://test.org/"
|
url = "http://test.org/"
|
||||||
embedded_link = f'<a href="{url}" title="The Rock">The Rock</a>'
|
embedded_link = f'<a href="{url}" title="The Rock">The Rock</a>'
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from typing_extensions import override
|
|||||||
|
|
||||||
from zerver.actions.message_edit import do_update_embedded_data
|
from zerver.actions.message_edit import do_update_embedded_data
|
||||||
from zerver.actions.message_send import render_incoming_message
|
from zerver.actions.message_send import render_incoming_message
|
||||||
|
from zerver.lib.mention import MentionBackend, MentionData
|
||||||
from zerver.lib.url_preview import preview as url_preview
|
from zerver.lib.url_preview import preview as url_preview
|
||||||
from zerver.lib.url_preview.types import UrlEmbedData
|
from zerver.lib.url_preview.types import UrlEmbedData
|
||||||
from zerver.models import Message, Realm
|
from zerver.models import Message, Realm
|
||||||
@@ -57,13 +58,19 @@ class FetchLinksEmbedData(QueueProcessingWorker):
|
|||||||
realm = Realm.objects.get(id=event["message_realm_id"])
|
realm = Realm.objects.get(id=event["message_realm_id"])
|
||||||
|
|
||||||
# If rendering fails, the called code will raise a JsonableError.
|
# If rendering fails, the called code will raise a JsonableError.
|
||||||
|
mention_data = MentionData(
|
||||||
|
mention_backend=MentionBackend(message.realm_id),
|
||||||
|
content=message.content,
|
||||||
|
message_sender=message.sender,
|
||||||
|
)
|
||||||
rendering_result = render_incoming_message(
|
rendering_result = render_incoming_message(
|
||||||
message,
|
message,
|
||||||
message.content,
|
message.content,
|
||||||
realm,
|
realm,
|
||||||
url_embed_data=url_embed_data,
|
url_embed_data=url_embed_data,
|
||||||
|
mention_data=mention_data,
|
||||||
)
|
)
|
||||||
do_update_embedded_data(message.sender, message, rendering_result)
|
do_update_embedded_data(message.sender, message, rendering_result, mention_data)
|
||||||
|
|
||||||
@override
|
@override
|
||||||
def timer_expired(
|
def timer_expired(
|
||||||
|
|||||||
Reference in New Issue
Block a user