* remove email verification related code * remove email verification related code * remove sendgrid callback * remove sendgrid related code * remove sendgrid related code * rename sendgrid app to email * remove email from built-in channels * remove email from built-in channels * remove email from built-in channels * add email backend: https://github.com/grafana/oncall/pull/50 * add email templater * add email templater * convert md to html * add email settings to live settings * use task to send email, handle some exceptions to create logs * remove ERROR_NOTIFICATION_MAIL_DELIVERY_FAILED usage * add email limit logic * fix tests * add docs * remove old email templates * remove old email templates * add template_fields to messaging backend * add messaging backends templates to public api * add comment for deprecated fields * fix test * fix tests * disable email by default * don't retry on SMTPException and TimeoutError * add tests * bring email back to public api docs * return ERROR_NOTIFICATION_MAIL_LIMIT_EXCEEDED * make template_fields tuple * build_subject_and_title -> build_subject_and_message * add one more comment about template deprecation * use 8 as backend id * add comment about gaierror and BadHeaderError * add comment on importing in notify_user_async * edit oss docs
55 lines
2.1 KiB
Python
55 lines
2.1 KiB
Python
from django.template.loader import render_to_string
|
|
from emoji.core import emojize
|
|
|
|
from apps.alerts.incident_appearance.renderers.constants import DEFAULT_BACKUP_TITLE
|
|
from apps.alerts.incident_appearance.templaters.alert_templater import AlertTemplater
|
|
from common.utils import convert_md_to_html, str_or_backup
|
|
|
|
|
|
class AlertEmailTemplater(AlertTemplater):
|
|
RENDER_FOR_EMAIL = "email"
|
|
|
|
def _render_for(self):
|
|
return self.RENDER_FOR_EMAIL
|
|
|
|
def _postformat(self, templated_alert):
|
|
templated_alert.title = self._slack_format_for_email(templated_alert.title)
|
|
templated_alert.message = self._slack_format_for_email(templated_alert.message)
|
|
return templated_alert
|
|
|
|
def _slack_format_for_email(self, data):
|
|
sf = self.slack_formatter
|
|
sf.hyperlink_mention_format = "{title} - {url}"
|
|
return sf.format(data)
|
|
|
|
|
|
def build_subject_and_message(alert_group, emails_left):
|
|
alert = alert_group.alerts.first()
|
|
templated_alert = AlertEmailTemplater(alert).render()
|
|
|
|
title_fallback = (
|
|
f"#{alert_group.inside_organization_number} " f"{DEFAULT_BACKUP_TITLE} via {alert_group.channel.verbal_name}"
|
|
)
|
|
|
|
# default templates are the same as web templates, which are in Markdown format
|
|
message = templated_alert.message
|
|
if message:
|
|
message = convert_md_to_html(templated_alert.message) if templated_alert.message else ""
|
|
|
|
content = render_to_string(
|
|
"email_notification.html",
|
|
{
|
|
"url": alert_group.slack_permalink or alert_group.web_link,
|
|
"title": str_or_backup(templated_alert.title, title_fallback),
|
|
"message": str_or_backup(message, ""), # not render message at all if smth goes wrong
|
|
"organization": alert_group.channel.organization.org_title,
|
|
"integration": emojize(alert_group.channel.short_name, use_aliases=True),
|
|
"limit_notification": emails_left <= 20,
|
|
"emails_left": emails_left,
|
|
},
|
|
)
|
|
|
|
title = str_or_backup(templated_alert.title, title_fallback)
|
|
subject = f"[{title}] You are invited to check an alert group"
|
|
|
|
return subject, content
|