This is an automated email from the ASF dual-hosted git repository. villebro pushed a commit to branch 0.37 in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
commit 4d73490fa395c4c6f74cfd3dd50216ff4466254d Author: Ville Brofeldt <[email protected]> AuthorDate: Fri Aug 28 21:26:07 2020 +0300 fix(jinja): extract form_data from json body (#10684) * fix(jinja): extract form_data from json body * add test * disable test for presto --- superset/views/utils.py | 8 ++++++++ tests/charts/api_tests.py | 22 +++++++++++++++++++++- tests/datasource_tests.py | 2 -- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/superset/views/utils.py b/superset/views/utils.py index 2a8b2cc..7e50800 100644 --- a/superset/views/utils.py +++ b/superset/views/utils.py @@ -116,8 +116,16 @@ def get_form_data( slice_id: Optional[int] = None, use_slice_data: bool = False ) -> Tuple[Dict[str, Any], Optional[Slice]]: form_data = {} + # chart data API requests are JSON + request_json_data = ( + request.json["queries"][0] + if request.is_json and "queries" in request.json + else None + ) request_form_data = request.form.get("form_data") request_args_data = request.args.get("form_data") + if request_json_data: + form_data.update(request_json_data) if request_form_data: form_data.update(json.loads(request_form_data)) # request params can overwrite the body diff --git a/tests/charts/api_tests.py b/tests/charts/api_tests.py index c115b1d..51ea4bc 100644 --- a/tests/charts/api_tests.py +++ b/tests/charts/api_tests.py @@ -767,7 +767,7 @@ class TestChartApi(SupersetTestCase, ApiOwnersTestCaseMixin): self.login(username="admin") table = self.get_table_by_name("birth_names") request_payload = get_query_context(table.name, table.id, table.type) - request_payload["result_type"] = "query" + request_payload["result_type"] = utils.ChartDataResultType.QUERY rv = self.post_assert_metric(CHART_DATA_URI, request_payload, "data") self.assertEqual(rv.status_code, 200) @@ -869,3 +869,23 @@ class TestChartApi(SupersetTestCase, ApiOwnersTestCaseMixin): self.assertEqual(rv.status_code, 200) data = json.loads(rv.data.decode("utf-8")) self.assertEqual(data["count"], 6) + + def test_chart_data_jinja_filter_request(self): + """ + Chart data API: Ensure request referencing filters via jinja renders a correct query + """ + self.login(username="admin") + table = self.get_table_by_name("birth_names") + request_payload = get_query_context(table.name, table.id, table.type) + request_payload["result_type"] = utils.ChartDataResultType.QUERY + request_payload["queries"][0]["filters"] = [ + {"col": "gender", "op": "==", "val": "boy"} + ] + request_payload["queries"][0]["extras"][ + "where" + ] = "('boy' = '{{ filter_values('gender', 'xyz' )[0] }}')" + rv = self.post_assert_metric(CHART_DATA_URI, request_payload, "data") + response_payload = json.loads(rv.data.decode("utf-8")) + result = response_payload["result"][0]["query"] + if get_example_database().backend != "presto": + assert "('boy' = 'boy')" in result diff --git a/tests/datasource_tests.py b/tests/datasource_tests.py index b0bae9d..5fd81c0 100644 --- a/tests/datasource_tests.py +++ b/tests/datasource_tests.py @@ -18,8 +18,6 @@ import json from copy import deepcopy -from superset.utils.core import get_or_create_db - from .base_tests import SupersetTestCase from .fixtures.datasource import datasource_post
