From b2fdf12f626925093160eb36cbe3af042660f919 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 24 Sep 2020 10:29:44 -0700 Subject: [PATCH] Support jinja templates (#11008) Co-authored-by: bogdan kyryliuk --- superset/tasks/alerts/observer.py | 8 ++++---- tests/alerts_tests.py | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/superset/tasks/alerts/observer.py b/superset/tasks/alerts/observer.py index 482faedd80..b6805cf65e 100644 --- a/superset/tasks/alerts/observer.py +++ b/superset/tasks/alerts/observer.py @@ -22,8 +22,8 @@ from typing import Optional import pandas as pd from sqlalchemy.orm import Session +from superset import jinja_context from superset.models.alerts import Alert, SQLObservation -from superset.sql_parse import ParsedQuery logger = logging.getLogger("tasks.email_reports") @@ -42,9 +42,9 @@ def observe(alert_id: int, session: Session) -> Optional[str]: value = None - parsed_query = ParsedQuery(sql_observer.sql) - sql = parsed_query.stripped() - df = sql_observer.database.get_df(sql) + tp = jinja_context.get_template_processor(database=sql_observer.database) + rendered_sql = tp.process_template(sql_observer.sql) + df = sql_observer.database.get_df(rendered_sql) error_msg = validate_observer_result(df, alert.id, alert.label) diff --git a/tests/alerts_tests.py b/tests/alerts_tests.py index b09ac930e7..53245e69cb 100644 --- a/tests/alerts_tests.py +++ b/tests/alerts_tests.py @@ -154,6 +154,27 @@ def test_alert_observer(setup_database): assert alert7.sql_observer[0].observations[-1].value is None assert alert7.sql_observer[0].observations[-1].error_msg is not None + # Test multiline SQLObserver + alert8 = create_alert( + dbsession, + """ + -- comment + SELECT + 1 -- comment + FROM test_table + WHERE first = 1 + """, + ) + observe(alert8.id, dbsession) + assert alert8.sql_observer[0].observations[-1].value == 1.0 + assert alert8.sql_observer[0].observations[-1].error_msg is None + + # Test jinja + alert9 = create_alert(dbsession, "SELECT {{ 2 }}") + observe(alert9.id, dbsession) + assert alert9.sql_observer[0].observations[-1].value == 2.0 + assert alert9.sql_observer[0].observations[-1].error_msg is None + @patch("superset.tasks.schedules.deliver_alert") def test_evaluate_alert(mock_deliver_alert, setup_database):