From f64e135029e8500d8ae39bf3c349411b987e22eb Mon Sep 17 00:00:00 2001 From: Colleen O'Rourke Date: Mon, 6 Nov 2023 14:16:49 -0800 Subject: [PATCH 1/3] fix(note email): Fix user avatar in note emails --- .../notifications/notifications/activity/note.py | 16 ++++++++++++++++ src/sentry/notifications/utils/avatar.py | 11 +++++++---- .../templates/sentry/emails/activity/note.html | 8 +------- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/sentry/notifications/notifications/activity/note.py b/src/sentry/notifications/notifications/activity/note.py index 03105e53eb68d3..9925576248dd87 100644 --- a/src/sentry/notifications/notifications/activity/note.py +++ b/src/sentry/notifications/notifications/activity/note.py @@ -2,6 +2,10 @@ from typing import Any, Mapping, Optional +from django.utils.html import format_html +from django.utils.safestring import SafeString + +from sentry.notifications.utils.avatar import avatar_as_html from sentry.services.hybrid_cloud.actor import RpcActor from sentry.types.integrations import ExternalProviders @@ -33,3 +37,15 @@ def get_notification_title( def get_message_description(self, recipient: RpcActor, provider: ExternalProviders) -> Any: return self.get_context()["text_description"] + + def description_as_html(self, description: str, params: Mapping[str, Any]) -> SafeString: + """Note emails are formatted differently from almost all other activity emails. + Rather than passing the `description` as a string to be formatted into HTML with + `author` and `an_issue` (see base definition and resolved.py's `get_description` + as an example) we are simply passed the comment as a string that needs no formatting, + and want the avatar on it's own rather than bundled with the author's display name + because the display name is already shown in the notification title.""" + fmt = '{}' + author = format_html(fmt, avatar_as_html(self.user, 48)) + context = {"author": author} + return context diff --git a/src/sentry/notifications/utils/avatar.py b/src/sentry/notifications/utils/avatar.py index ea62e42adaacdb..40e040cf238261 100644 --- a/src/sentry/notifications/utils/avatar.py +++ b/src/sentry/notifications/utils/avatar.py @@ -38,15 +38,18 @@ def get_sentry_avatar_url() -> str: return str(absolute_uri(get_asset_url("sentry", url))) -def avatar_as_html(user: User | RpcUser) -> SafeString: +def avatar_as_html(user: User | RpcUser, size: int = 20) -> SafeString: if not user: return format_html( - '', get_sentry_avatar_url() + '', + get_sentry_avatar_url(), + size, + size, ) avatar_type = user.get_avatar_type() if avatar_type == "upload": return format_html('', get_user_avatar_url(user)) elif avatar_type == "letter_avatar": - return get_email_avatar(user.get_display_name(), user.get_label(), 20, False) + return get_email_avatar(user.get_display_name(), user.get_label(), size, False) else: - return get_email_avatar(user.get_display_name(), user.get_label(), 20, True) + return get_email_avatar(user.get_display_name(), user.get_label(), size, True) diff --git a/src/sentry/templates/sentry/emails/activity/note.html b/src/sentry/templates/sentry/emails/activity/note.html index 27a413de6d8e78..d1e1b57aff21a9 100644 --- a/src/sentry/templates/sentry/emails/activity/note.html +++ b/src/sentry/templates/sentry/emails/activity/note.html @@ -15,13 +15,7 @@

{{ title }}

- {% if author.get_avatar_type == 'upload' %} - - {% elif author.get_avatar_type == 'letter_avatar' %} - {% email_avatar author.get_display_name author.get_label 48 False %} - {% else %} - {% email_avatar author.get_display_name author.get_label 48 %} - {% endif %} + {{ html_description.author }} From 0872180ae5a3863d065e87b3191ee64b88c08f20 Mon Sep 17 00:00:00 2001 From: Colleen O'Rourke Date: Mon, 6 Nov 2023 14:24:53 -0800 Subject: [PATCH 2/3] scooch a quote --- src/sentry/notifications/utils/avatar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sentry/notifications/utils/avatar.py b/src/sentry/notifications/utils/avatar.py index 40e040cf238261..e6fa427278ac12 100644 --- a/src/sentry/notifications/utils/avatar.py +++ b/src/sentry/notifications/utils/avatar.py @@ -41,7 +41,7 @@ def get_sentry_avatar_url() -> str: def avatar_as_html(user: User | RpcUser, size: int = 20) -> SafeString: if not user: return format_html( - '', + '', get_sentry_avatar_url(), size, size, From 08d42cd05aceb69a86d328129f911a7cc9f84b31 Mon Sep 17 00:00:00 2001 From: Colleen O'Rourke Date: Mon, 6 Nov 2023 14:50:24 -0800 Subject: [PATCH 3/3] silly things to making typing happy --- src/sentry/notifications/notifications/activity/note.py | 6 +++--- src/sentry/templates/sentry/emails/activity/note.html | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sentry/notifications/notifications/activity/note.py b/src/sentry/notifications/notifications/activity/note.py index 9925576248dd87..034a4c14346bc3 100644 --- a/src/sentry/notifications/notifications/activity/note.py +++ b/src/sentry/notifications/notifications/activity/note.py @@ -46,6 +46,6 @@ def description_as_html(self, description: str, params: Mapping[str, Any]) -> Sa and want the avatar on it's own rather than bundled with the author's display name because the display name is already shown in the notification title.""" fmt = '{}' - author = format_html(fmt, avatar_as_html(self.user, 48)) - context = {"author": author} - return context + if self.user: + return format_html(fmt, avatar_as_html(self.user, 48)) + return format_html(description) diff --git a/src/sentry/templates/sentry/emails/activity/note.html b/src/sentry/templates/sentry/emails/activity/note.html index d1e1b57aff21a9..2c2f89e546ae70 100644 --- a/src/sentry/templates/sentry/emails/activity/note.html +++ b/src/sentry/templates/sentry/emails/activity/note.html @@ -15,7 +15,7 @@

{{ title }}

- {{ html_description.author }} + {{ html_description }}