mirror of
https://github.com/zulip/zulip.git
synced 2025-11-06 23:13:25 +00:00
zerver/lib/notifications: Add stream email notifications.
This modifies the logic for formatting outgoing missed-message emails to support the upcoming stream email notifications feature (providing a new format for the subject, etc.).
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
{% if group_pm %} Group PMs with {{ huddle_display_name }}
|
{% if group_pm %} Group PMs with {{ huddle_display_name }}
|
||||||
{% elif mention %} {{ sender_str }} mentioned you
|
{% elif mention %} {{ sender_str }} mentioned you
|
||||||
{% elif private_message %} {{ sender_str }} sent you a message
|
{% elif private_message %} {{ sender_str }} sent you a message
|
||||||
|
{% elif stream_email_notify %} New messages in {{ messages[0].header.plain }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
New missed message{{ message_count|pluralize }}
|
New missed message{{ message_count|pluralize }}
|
||||||
|
|||||||
@@ -367,6 +367,8 @@ def do_send_missedmessage_events_reply_in_zulip(user_profile: UserProfile,
|
|||||||
if m['trigger'] == 'mentioned'))
|
if m['trigger'] == 'mentioned'))
|
||||||
# TODO: When we add wildcard mentions that send emails, we
|
# TODO: When we add wildcard mentions that send emails, we
|
||||||
# should make sure the right logic applies here.
|
# should make sure the right logic applies here.
|
||||||
|
elif ('stream_email_notify' in unique_triggers):
|
||||||
|
context.update({'stream_email_notify': True})
|
||||||
else:
|
else:
|
||||||
raise AssertionError("Invalid messages!")
|
raise AssertionError("Invalid messages!")
|
||||||
|
|
||||||
|
|||||||
@@ -163,6 +163,7 @@ class EditMessageSideEffectsTest(ZulipTestCase):
|
|||||||
private_message=False,
|
private_message=False,
|
||||||
mentioned=True,
|
mentioned=True,
|
||||||
stream_push_notify=False,
|
stream_push_notify=False,
|
||||||
|
stream_email_notify=False,
|
||||||
stream_name='Scotland',
|
stream_name='Scotland',
|
||||||
always_push_notify=False,
|
always_push_notify=False,
|
||||||
idle=True,
|
idle=True,
|
||||||
@@ -314,6 +315,7 @@ class EditMessageSideEffectsTest(ZulipTestCase):
|
|||||||
private_message=False,
|
private_message=False,
|
||||||
mentioned=True,
|
mentioned=True,
|
||||||
stream_push_notify=False,
|
stream_push_notify=False,
|
||||||
|
stream_email_notify=False,
|
||||||
stream_name='Scotland',
|
stream_name='Scotland',
|
||||||
always_push_notify=True,
|
always_push_notify=True,
|
||||||
idle=False,
|
idle=False,
|
||||||
@@ -351,6 +353,7 @@ class EditMessageSideEffectsTest(ZulipTestCase):
|
|||||||
private_message=False,
|
private_message=False,
|
||||||
mentioned=False,
|
mentioned=False,
|
||||||
stream_push_notify=False,
|
stream_push_notify=False,
|
||||||
|
stream_email_notify=False,
|
||||||
stream_name='Scotland',
|
stream_name='Scotland',
|
||||||
always_push_notify=True,
|
always_push_notify=True,
|
||||||
idle=False,
|
idle=False,
|
||||||
@@ -388,6 +391,7 @@ class EditMessageSideEffectsTest(ZulipTestCase):
|
|||||||
private_message=False,
|
private_message=False,
|
||||||
mentioned=True,
|
mentioned=True,
|
||||||
stream_push_notify=False,
|
stream_push_notify=False,
|
||||||
|
stream_email_notify=False,
|
||||||
stream_name='Scotland',
|
stream_name='Scotland',
|
||||||
always_push_notify=False,
|
always_push_notify=False,
|
||||||
idle=True,
|
idle=True,
|
||||||
@@ -422,6 +426,7 @@ class EditMessageSideEffectsTest(ZulipTestCase):
|
|||||||
private_message=False,
|
private_message=False,
|
||||||
mentioned=True,
|
mentioned=True,
|
||||||
stream_push_notify=False,
|
stream_push_notify=False,
|
||||||
|
stream_email_notify=False,
|
||||||
stream_name='Scotland',
|
stream_name='Scotland',
|
||||||
always_push_notify=False,
|
always_push_notify=False,
|
||||||
idle=False,
|
idle=False,
|
||||||
|
|||||||
@@ -117,6 +117,24 @@ class TestMissedMessages(ZulipTestCase):
|
|||||||
verify_body_does_not_include=verify_body_does_not_include,
|
verify_body_does_not_include=verify_body_does_not_include,
|
||||||
trigger='mentioned')
|
trigger='mentioned')
|
||||||
|
|
||||||
|
@patch('zerver.lib.email_mirror.generate_random_token')
|
||||||
|
def _extra_context_in_missed_stream_messages_email_notify(self, send_as_user: bool,
|
||||||
|
mock_random_token: MagicMock) -> None:
|
||||||
|
tokens = self._get_tokens()
|
||||||
|
mock_random_token.side_effect = tokens
|
||||||
|
|
||||||
|
for i in range(0, 11):
|
||||||
|
self.send_stream_message(self.example_email('othello'), "Denmark", content=str(i))
|
||||||
|
self.send_stream_message(
|
||||||
|
self.example_email('othello'), "Denmark",
|
||||||
|
'11', topic_name='test2')
|
||||||
|
msg_id = self.send_stream_message(
|
||||||
|
self.example_email('othello'), "denmark",
|
||||||
|
'12')
|
||||||
|
body = 'Denmark > test Othello, the Moor of Venice 1 2 3 4 5 6 7 8 9 10 12'
|
||||||
|
subject = 'New messages in Denmark > test'
|
||||||
|
self._test_cases(tokens, msg_id, body, subject, send_as_user, trigger='stream_email_notify')
|
||||||
|
|
||||||
@patch('zerver.lib.email_mirror.generate_random_token')
|
@patch('zerver.lib.email_mirror.generate_random_token')
|
||||||
def _extra_context_in_missed_stream_messages_mention_two_senders(
|
def _extra_context_in_missed_stream_messages_mention_two_senders(
|
||||||
self, send_as_user: bool, mock_random_token: MagicMock) -> None:
|
self, send_as_user: bool, mock_random_token: MagicMock) -> None:
|
||||||
@@ -363,6 +381,13 @@ class TestMissedMessages(ZulipTestCase):
|
|||||||
def test_reply_to_email_in_personal_missed_stream_messages(self) -> None:
|
def test_reply_to_email_in_personal_missed_stream_messages(self) -> None:
|
||||||
self._reply_to_email_in_personal_missed_stream_messages(False)
|
self._reply_to_email_in_personal_missed_stream_messages(False)
|
||||||
|
|
||||||
|
@override_settings(SEND_MISSED_MESSAGE_EMAILS_AS_USER=True)
|
||||||
|
def test_extra_context_in_missed_stream_messages_email_notify_as_user(self) -> None:
|
||||||
|
self._extra_context_in_missed_stream_messages_email_notify(True)
|
||||||
|
|
||||||
|
def test_extra_context_in_missed_stream_messages_email_notify(self) -> None:
|
||||||
|
self._extra_context_in_missed_stream_messages_email_notify(False)
|
||||||
|
|
||||||
@override_settings(EMAIL_GATEWAY_PATTERN="")
|
@override_settings(EMAIL_GATEWAY_PATTERN="")
|
||||||
def test_reply_warning_in_personal_missed_stream_messages(self) -> None:
|
def test_reply_warning_in_personal_missed_stream_messages(self) -> None:
|
||||||
self._reply_warning_in_personal_missed_stream_messages(False)
|
self._reply_warning_in_personal_missed_stream_messages(False)
|
||||||
@@ -482,6 +507,102 @@ class TestMissedMessages(ZulipTestCase):
|
|||||||
subject = 'Iago sent you a message'
|
subject = 'Iago sent you a message'
|
||||||
self.assertEqual(mail.outbox[1].subject, subject)
|
self.assertEqual(mail.outbox[1].subject, subject)
|
||||||
|
|
||||||
|
@patch('zerver.lib.email_mirror.generate_random_token')
|
||||||
|
def test_multiple_stream_messages(self, mock_random_token: MagicMock) -> None:
|
||||||
|
tokens = self._get_tokens()
|
||||||
|
mock_random_token.side_effect = tokens
|
||||||
|
|
||||||
|
hamlet = self.example_user('hamlet')
|
||||||
|
msg_id_1 = self.send_stream_message(self.example_email('othello'),
|
||||||
|
"Denmark",
|
||||||
|
'Message1')
|
||||||
|
msg_id_2 = self.send_stream_message(self.example_email('iago'),
|
||||||
|
"Denmark",
|
||||||
|
'Message2')
|
||||||
|
|
||||||
|
handle_missedmessage_emails(hamlet.id, [
|
||||||
|
{'message_id': msg_id_1, "trigger": "stream_email_notify"},
|
||||||
|
{'message_id': msg_id_2, "trigger": "stream_email_notify"},
|
||||||
|
])
|
||||||
|
self.assertEqual(len(mail.outbox), 1)
|
||||||
|
subject = 'New messages in Denmark > test'
|
||||||
|
self.assertEqual(mail.outbox[0].subject, subject)
|
||||||
|
|
||||||
|
@patch('zerver.lib.email_mirror.generate_random_token')
|
||||||
|
def test_multiple_stream_messages_and_mentions(self, mock_random_token: MagicMock) -> None:
|
||||||
|
"""A mention should take precedence over regular stream messages for email subjects."""
|
||||||
|
tokens = self._get_tokens()
|
||||||
|
mock_random_token.side_effect = tokens
|
||||||
|
|
||||||
|
hamlet = self.example_user('hamlet')
|
||||||
|
msg_id_1 = self.send_stream_message(self.example_email('iago'),
|
||||||
|
"Denmark",
|
||||||
|
'Regular message')
|
||||||
|
msg_id_2 = self.send_stream_message(self.example_email('othello'),
|
||||||
|
"Denmark",
|
||||||
|
'@**King Hamlet**')
|
||||||
|
|
||||||
|
handle_missedmessage_emails(hamlet.id, [
|
||||||
|
{'message_id': msg_id_1, "trigger": "stream_email_notify"},
|
||||||
|
{'message_id': msg_id_2, "trigger": "mentioned"},
|
||||||
|
])
|
||||||
|
self.assertEqual(len(mail.outbox), 1)
|
||||||
|
subject = 'Othello, the Moor of Venice mentioned you'
|
||||||
|
self.assertEqual(mail.outbox[0].subject, subject)
|
||||||
|
|
||||||
|
@patch('zerver.lib.email_mirror.generate_random_token')
|
||||||
|
def test_stream_mentions_multiple_people(self, mock_random_token: MagicMock) -> None:
|
||||||
|
"""A mention should take precedence over regular stream messages for email subjects.
|
||||||
|
|
||||||
|
Each sender who has mentioned a user should appear in the email subject line.
|
||||||
|
"""
|
||||||
|
tokens = self._get_tokens()
|
||||||
|
mock_random_token.side_effect = tokens
|
||||||
|
|
||||||
|
hamlet = self.example_user('hamlet')
|
||||||
|
msg_id_1 = self.send_stream_message(self.example_email('iago'),
|
||||||
|
"Denmark",
|
||||||
|
'@**King Hamlet**')
|
||||||
|
msg_id_2 = self.send_stream_message(self.example_email('othello'),
|
||||||
|
"Denmark",
|
||||||
|
'@**King Hamlet**')
|
||||||
|
msg_id_3 = self.send_stream_message(self.example_email('cordelia'),
|
||||||
|
"Denmark",
|
||||||
|
'Regular message')
|
||||||
|
|
||||||
|
handle_missedmessage_emails(hamlet.id, [
|
||||||
|
{'message_id': msg_id_1, "trigger": "mentioned"},
|
||||||
|
{'message_id': msg_id_2, "trigger": "mentioned"},
|
||||||
|
{'message_id': msg_id_3, "trigger": "stream_email_notify"},
|
||||||
|
])
|
||||||
|
self.assertEqual(len(mail.outbox), 1)
|
||||||
|
subject = 'Iago, Othello, the Moor of Venice mentioned you'
|
||||||
|
self.assertEqual(mail.outbox[0].subject, subject)
|
||||||
|
|
||||||
|
@patch('zerver.lib.email_mirror.generate_random_token')
|
||||||
|
def test_multiple_stream_messages_different_topics(self, mock_random_token: MagicMock) -> None:
|
||||||
|
"""Should receive separate emails for each topic within a stream."""
|
||||||
|
tokens = self._get_tokens()
|
||||||
|
mock_random_token.side_effect = tokens
|
||||||
|
|
||||||
|
hamlet = self.example_user('hamlet')
|
||||||
|
msg_id_1 = self.send_stream_message(self.example_email('othello'),
|
||||||
|
"Denmark",
|
||||||
|
'Message1')
|
||||||
|
msg_id_2 = self.send_stream_message(self.example_email('iago'),
|
||||||
|
"Denmark",
|
||||||
|
'Message2',
|
||||||
|
topic_name="test2")
|
||||||
|
|
||||||
|
handle_missedmessage_emails(hamlet.id, [
|
||||||
|
{'message_id': msg_id_1, "trigger": "stream_email_notify"},
|
||||||
|
{'message_id': msg_id_2, "trigger": "stream_email_notify"},
|
||||||
|
])
|
||||||
|
self.assertEqual(len(mail.outbox), 2)
|
||||||
|
subjects = {mail.outbox[0].subject, mail.outbox[1].subject}
|
||||||
|
valid_subjects = {'New messages in Denmark > test', 'New messages in Denmark > test2'}
|
||||||
|
self.assertEqual(subjects, valid_subjects)
|
||||||
|
|
||||||
def test_relative_to_full_url(self) -> None:
|
def test_relative_to_full_url(self) -> None:
|
||||||
# Run `relative_to_full_url()` function over test fixtures present in
|
# Run `relative_to_full_url()` function over test fixtures present in
|
||||||
# 'markdown_test_cases.json' and check that it converts all the relative
|
# 'markdown_test_cases.json' and check that it converts all the relative
|
||||||
|
|||||||
Reference in New Issue
Block a user