From 58b075bc1756268292b31887dc76122e9d651026 Mon Sep 17 00:00:00 2001 From: Ville Brofeldt <33317356+villebro@users.noreply.github.com> Date: Fri, 28 Aug 2020 21:26:07 +0300 Subject: [PATCH] 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 2a8b2ccc0..7e5080020 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 48e929d66..75485e3f4 100644 --- a/tests/charts/api_tests.py +++ b/tests/charts/api_tests.py @@ -774,7 +774,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) @@ -901,3 +901,23 @@ class TestChartApi(SupersetTestCase, ApiOwnersTestCaseMixin): payload = get_query_context(table.name, table.id, table.type) rv = self.post_assert_metric(CHART_DATA_URI, payload, "data") self.assertEqual(rv.status_code, 401) + + 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 b0bae9d56..5fd81c0e1 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