Skip to content

Commit

Permalink
chore: add link to Superset when report error (#30576)
Browse files Browse the repository at this point in the history
  • Loading branch information
eschutho authored Oct 21, 2024
1 parent f8fd2ec commit 4d5f70c
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 5 deletions.
4 changes: 3 additions & 1 deletion superset/commands/report/execute.py
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,7 @@ def _get_notification_content(self) -> NotificationContent:
name=self._report_schedule.name,
text=error_text,
header_data=header_data,
url=url,
)

if (
Expand Down Expand Up @@ -533,13 +534,14 @@ def send_error(self, name: str, message: str) -> None:
:raises: CommandException
"""
header_data = self._get_log_data()
url = self._get_url(user_friendly=True)
logger.info(
"header_data in notifications for alerts and reports %s, taskid, %s",
header_data,
self._execution_id,
)
notification_content = NotificationContent(
name=name, text=message, header_data=header_data
name=name, text=message, header_data=header_data, url=url
)

# filter recipients to recipients who are also owners
Expand Down
15 changes: 11 additions & 4 deletions superset/reports/notifications/email.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,17 @@ class EmailNotification(BaseNotification): # pylint: disable=too-few-public-met
def _get_smtp_domain() -> str:
return parseaddr(app.config["SMTP_MAIL_FROM"])[1].split("@")[1]

@staticmethod
def _error_template(text: str) -> str:
def _error_template(self, text: str) -> str:
call_to_action = self._get_call_to_action()
return __(
"""
Error: %(text)s
<p>Your report/alert was unable to be generated because of the following error: %(text)s</p>
<p>Please check your dashboard/chart for errors.</p>
<p><b><a href="%(url)s">%(call_to_action)s</a></b></p>
""",
text=text,
url=self._content.url,
call_to_action=call_to_action,
)

def _get_content(self) -> EmailContent:
Expand Down Expand Up @@ -130,7 +134,6 @@ def _get_content(self) -> EmailContent:
else:
html_table = ""

call_to_action = __(app.config["EMAIL_REPORTS_CTA"])
img_tags = []
for msgid in images.keys():
img_tags.append(
Expand All @@ -140,6 +143,7 @@ def _get_content(self) -> EmailContent:
"""
)
img_tag = "".join(img_tags)
call_to_action = self._get_call_to_action()
body = textwrap.dedent(
f"""
<html>
Expand Down Expand Up @@ -190,6 +194,9 @@ def _get_subject(self) -> str:
title=self._content.name,
)

def _get_call_to_action(self) -> str:
return __(app.config["EMAIL_REPORTS_CTA"])

def _get_to(self) -> str:
return json.loads(self._recipient.recipient_config_json)["target"]

Expand Down
6 changes: 6 additions & 0 deletions tests/integration_tests/reports/commands_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1760,13 +1760,19 @@ def test_email_dashboard_report_fails_uncaught_exception(

screenshot_mock.return_value = SCREENSHOT_FILE
email_mock.side_effect = Exception("Uncaught exception")
app.config["EMAIL_REPORTS_CTA"] = "Call to action"

with pytest.raises(Exception):
AsyncExecuteReportScheduleCommand(
TEST_ID, create_report_email_dashboard.id, datetime.utcnow()
).run()

assert_log(ReportState.ERROR, error_message="Uncaught exception")
assert (
'<a href="http://0.0.0.0:8080/superset/dashboard/'
f"{create_report_email_dashboard.dashboard.uuid}/"
'?force=false">Call to action</a>' in email_mock.call_args[0][2]
)


@pytest.mark.usefixtures(
Expand Down

0 comments on commit 4d5f70c

Please sign in to comment.