diff --git a/templates/zephyr/missed_message_email.txt b/templates/zephyr/missed_message_email.txt index bd1c881193..04af21bcee 100644 --- a/templates/zephyr/missed_message_email.txt +++ b/templates/zephyr/missed_message_email.txt @@ -6,12 +6,17 @@ Hello {{ name }}, While you were away you received {{ messages|length }} new message{{ messages|pluralize }}{% if mention %} in which you were mentioned{% endif %}! -{% for message in messages %} -{{ message.sender }} ---- -{{ message.content }} + +{% for recipient_block in messages %} + {{ recipient_block.header|safe }} + {% for sender_block in recipient_block.senders %} + {% if sender_block.sender %}{{ sender_block.sender }}{% endif %}{% for message_block in sender_block.content %} + {{ message_block.plain }} + {% endfor %} + {% endfor %} {% endfor %} + Click here to log in to Humbug and view your new messages: {{ url }} diff --git a/templates/zephyr/missed_message_email_html.txt b/templates/zephyr/missed_message_email_html.txt index fd5cfa4159..39113e1572 100644 --- a/templates/zephyr/missed_message_email_html.txt +++ b/templates/zephyr/missed_message_email_html.txt @@ -5,16 +5,28 @@ Mail sent to user when she was not logged in and received a PM or @-mention Hello {{ name }},

-While you were away you received {{ messages|length }} new message{{ messages|pluralize }}{% if mention %} in which you were mentioned{%endif %}! +While you were away you received {{ message_count }} new message{{ message_count|pluralize }}{% if mention %} in which you were mentioned{%endif %}!

-{% for message in messages %} -
{{ message.sender }}:
-
{{ message.rendered_content|safe }}
+{% for recipient_block in messages %} +
+
{{ recipient_block.header }}
+
+ {% for sender_block in recipient_block.senders %} + {% if sender_block.sender %}
{{ sender_block.sender }}
{% endif %} + {% for message_block in sender_block.content %} +
+ {{ message_block.html|safe }} +
+ {% endfor %} + {% endfor %} +
+
{% endfor %}
+

Click here to log in to Humbug and view your new messages.

{% if reply_warning %} diff --git a/zephyr/lib/actions.py b/zephyr/lib/actions.py index c95c5f1f84..95bac03bcf 100644 --- a/zephyr/lib/actions.py +++ b/zephyr/lib/actions.py @@ -1148,6 +1148,86 @@ def do_send_confirmation_email(invitee, referrer): subject_template_path='confirmation/invite_email_subject.txt', body_template_path='confirmation/invite_email_body.txt') +def build_message_list(user_profile, messages): + """ + Builds the message list object for the missed message email template. + The messages are collapsed into per-recipient and per-sender blocks, like + our web interface + """ + messages_to_render = [] + + def sender_string(message): + sender = '' + if message.recipient.type in (Recipient.STREAM, Recipient.HUDDLE): + sender = message.sender.full_name + return sender + + def build_message_payload(message): + return {'plain': message.content, + 'html': message.rendered_content} + + def build_sender_payload(message): + sender = sender_string(message) + return {'sender': sender, + 'content': [build_message_payload(message)]} + + def message_header(user_profile, message): + disp_recipient = get_display_recipient(message.recipient) + if message.recipient.type == Recipient.PERSONAL: + header = "You and %s" % (message.sender.full_name) + elif message.recipient.type == Recipient.HUDDLE: + other_recipients = [r['full_name'] for r in disp_recipient + if r['email'] != user_profile.email] + header = "You and %s" % (", ".join(other_recipients),) + else: + header = "%s > %s" % (disp_recipient, message.subject) + return header + + # # Collapse message list to + # [ + # { + # "header":"xxx", + # "senders":[ + # { + # "sender":"sender_name", + # "content":[ + # { + # "plain":"content", + # "html":"htmlcontent" + # } + # { + # "plain":"content", + # "html":"htmlcontent" + # } + # ] + # } + # ] + # }, + # ] + + for message in messages: + header = message_header(user_profile, message) + + # If we want to collapse into the previous recipient block + if len(messages_to_render) > 0 and messages_to_render[-1]['header'] == header: + sender = sender_string(message) + sender_block = messages_to_render[-1]['senders'] + + # Same message sender, collapse again + if sender_block[-1]['sender'] == sender: + sender_block[-1]['content'].append(build_message_payload(message)) + else: + # Start a new sender block + sender_block.append(build_sender_payload(message)) + else: + # New recipient and sender block + recipient_block = {'header': header, + 'senders': [build_sender_payload(message)]} + + messages_to_render.append(recipient_block) + + return messages_to_render + @statsd_increment("missed_message_reminders") def do_send_missedmessage_email(user_profile, missed_messages): """ @@ -1156,15 +1236,9 @@ def do_send_missedmessage_email(user_profile, missed_messages): `user_profile` is the user to send the reminder to `missed_messages` is a list of Message objects to remind about """ - - messages_to_render = [{'sender': message.sender.full_name, - 'subject': message.subject, - 'content': message.content, - 'rendered_content': message.rendered_content} - for message in missed_messages] - template_payload = {'name': user_profile.full_name, - 'messages': messages_to_render, + 'messages': build_message_list(user_profile, missed_messages), + 'message_count': len(missed_messages), 'url': 'https://humbughq.com', 'reply_warning': False}