From 4d5f70c69401228836176602202d30ca3310d953 Mon Sep 17 00:00:00 2001 From: Elizabeth Thompson Date: Mon, 21 Oct 2024 15:40:20 -0700 Subject: [PATCH] chore: add link to Superset when report error (#30576) --- superset/commands/report/execute.py | 4 +++- superset/reports/notifications/email.py | 15 +++++++++++---- tests/integration_tests/reports/commands_tests.py | 6 ++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/superset/commands/report/execute.py b/superset/commands/report/execute.py index eadf193bf4ec0..afc488df5640f 100644 --- a/superset/commands/report/execute.py +++ b/superset/commands/report/execute.py @@ -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 ( @@ -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 diff --git a/superset/reports/notifications/email.py b/superset/reports/notifications/email.py index f5943f53927da..b4514d43aa815 100644 --- a/superset/reports/notifications/email.py +++ b/superset/reports/notifications/email.py @@ -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 +

Your report/alert was unable to be generated because of the following error: %(text)s

+

Please check your dashboard/chart for errors.

+

%(call_to_action)s

""", text=text, + url=self._content.url, + call_to_action=call_to_action, ) def _get_content(self) -> EmailContent: @@ -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( @@ -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""" @@ -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"] diff --git a/tests/integration_tests/reports/commands_tests.py b/tests/integration_tests/reports/commands_tests.py index 575c8a02b9d46..f18d454bb578f 100644 --- a/tests/integration_tests/reports/commands_tests.py +++ b/tests/integration_tests/reports/commands_tests.py @@ -1760,6 +1760,7 @@ 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( @@ -1767,6 +1768,11 @@ def test_email_dashboard_report_fails_uncaught_exception( ).run() assert_log(ReportState.ERROR, error_message="Uncaught exception") + assert ( + 'Call to action' in email_mock.call_args[0][2] + ) @pytest.mark.usefixtures(