snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
This commit is contained in:
98
zerver/actions/submessage.py
Normal file
98
zerver/actions/submessage.py
Normal file
@@ -0,0 +1,98 @@
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
from zerver.actions.user_topics import do_set_user_topic_visibility_policy
|
||||
from zerver.lib.exceptions import JsonableError
|
||||
from zerver.lib.message import (
|
||||
event_recipient_ids_for_action_on_messages,
|
||||
set_visibility_policy_possible,
|
||||
should_change_visibility_policy,
|
||||
visibility_policy_for_participation,
|
||||
)
|
||||
from zerver.lib.streams import access_stream_by_id
|
||||
from zerver.models import Realm, SubMessage, UserProfile
|
||||
from zerver.tornado.django_api import send_event_on_commit
|
||||
|
||||
|
||||
def verify_submessage_sender(
|
||||
*,
|
||||
message_id: int,
|
||||
message_sender_id: int,
|
||||
submessage_sender_id: int,
|
||||
) -> None:
|
||||
"""Even though our submessage architecture is geared toward
|
||||
collaboration among all message readers, we still enforce
|
||||
the first person to attach a submessage to the message
|
||||
must be the original sender of the message.
|
||||
"""
|
||||
|
||||
if message_sender_id == submessage_sender_id:
|
||||
return
|
||||
|
||||
if SubMessage.objects.filter(
|
||||
message_id=message_id,
|
||||
sender_id=message_sender_id,
|
||||
).exists():
|
||||
return
|
||||
|
||||
raise JsonableError(_("You cannot attach a submessage to this message."))
|
||||
|
||||
|
||||
def do_add_submessage(
|
||||
realm: Realm,
|
||||
sender_id: int,
|
||||
message_id: int,
|
||||
msg_type: str,
|
||||
content: str,
|
||||
) -> None:
|
||||
"""Should be called while holding a SELECT FOR UPDATE lock
|
||||
(e.g. via access_message(..., lock_message=True)) on the
|
||||
Message row, to prevent race conditions.
|
||||
"""
|
||||
submessage = SubMessage(
|
||||
sender_id=sender_id,
|
||||
message_id=message_id,
|
||||
msg_type=msg_type,
|
||||
content=content,
|
||||
)
|
||||
submessage.save()
|
||||
|
||||
# Determine and set the visibility_policy depending on 'automatically_follow_topics_policy'
|
||||
# and 'automatically_unmute_topics_policy'.
|
||||
sender = submessage.sender
|
||||
if set_visibility_policy_possible(
|
||||
sender, submessage.message
|
||||
) and UserProfile.AUTOMATICALLY_CHANGE_VISIBILITY_POLICY_ON_PARTICIPATION in [
|
||||
sender.automatically_follow_topics_policy,
|
||||
sender.automatically_unmute_topics_in_muted_streams_policy,
|
||||
]:
|
||||
stream_id = submessage.message.recipient.type_id
|
||||
(stream, sub) = access_stream_by_id(sender, stream_id)
|
||||
assert stream is not None
|
||||
if sub:
|
||||
new_visibility_policy = visibility_policy_for_participation(sender, sub.is_muted)
|
||||
if new_visibility_policy and should_change_visibility_policy(
|
||||
new_visibility_policy,
|
||||
sender,
|
||||
stream_id,
|
||||
topic_name=submessage.message.topic_name(),
|
||||
):
|
||||
do_set_user_topic_visibility_policy(
|
||||
user_profile=sender,
|
||||
stream=stream,
|
||||
topic_name=submessage.message.topic_name(),
|
||||
visibility_policy=new_visibility_policy,
|
||||
)
|
||||
|
||||
event = dict(
|
||||
type="submessage",
|
||||
msg_type=msg_type,
|
||||
message_id=message_id,
|
||||
submessage_id=submessage.id,
|
||||
sender_id=sender_id,
|
||||
content=content,
|
||||
)
|
||||
target_user_ids = event_recipient_ids_for_action_on_messages(
|
||||
[submessage.message.id], submessage.message.is_channel_message
|
||||
)
|
||||
|
||||
send_event_on_commit(realm, event, target_user_ids)
|
||||
Reference in New Issue
Block a user