From b1bf25e98ceb1a2d52f102d22ebc3631b5278e71 Mon Sep 17 00:00:00 2001 From: John Bodley <4567245+john-bodley@users.noreply.github.com> Date: Thu, 13 Oct 2022 14:25:46 -0700 Subject: [PATCH] fix(explore): Persist URL params to form-data (#21792) --- superset/explore/commands/get.py | 7 ++++--- tests/integration_tests/explore/api_tests.py | 12 ++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/superset/explore/commands/get.py b/superset/explore/commands/get.py index 1c56e5540..331f66276 100644 --- a/superset/explore/commands/get.py +++ b/superset/explore/commands/get.py @@ -19,7 +19,7 @@ from abc import ABC from typing import Any, cast, Dict, Optional import simplejson as json -from flask import current_app as app +from flask import current_app, request from flask_babel import gettext as __, lazy_gettext as _ from sqlalchemy.exc import SQLAlchemyError @@ -121,7 +121,7 @@ class GetExploreCommand(BaseCommand, ABC): dataset_name = dataset.name if dataset else _("[Missing Dataset]") if dataset: - if app.config["ENABLE_ACCESS_REQUEST"] and ( + if current_app.config["ENABLE_ACCESS_REQUEST"] and ( not security_manager.can_access_datasource(dataset) ): message = __(security_manager.get_datasource_access_error_msg(dataset)) @@ -139,9 +139,10 @@ class GetExploreCommand(BaseCommand, ABC): str(self._dataset_id) + "__" + cast(str, self._dataset_type) ) - # On explore, merge legacy and extra filters into the form data + # On explore, merge legacy/extra filters and URL params into the form data utils.convert_legacy_filters_into_adhoc(form_data) utils.merge_extra_filters(form_data) + utils.merge_request_params(form_data, request.args) dummy_dataset_data: Dict[str, Any] = { "type": self._dataset_type, diff --git a/tests/integration_tests/explore/api_tests.py b/tests/integration_tests/explore/api_tests.py index 8fb642286..dee7424a0 100644 --- a/tests/integration_tests/explore/api_tests.py +++ b/tests/integration_tests/explore/api_tests.py @@ -226,3 +226,15 @@ def test_wrong_endpoint(mock_get_datasource, test_client, login_as_admin, datase data = json.loads(resp.data.decode("utf-8")) assert resp.status_code == 302 assert data["redirect"] == dataset.default_endpoint + + +def test_get_url_params(test_client, login_as_admin, chart_id): + resp = test_client.get(f"api/v1/explore/?slice_id={chart_id}&foo=bar") + assert resp.status_code == 200 + data = json.loads(resp.data.decode("utf-8")) + result = data.get("result") + + assert result["form_data"]["url_params"] == { + "foo": "bar", + "slice_id": str(chart_id), + }