fix: Supports form_data param in old Explore endpoint (#21469)
This commit is contained in:
parent
2285ebe72e
commit
2c7323a87d
|
|
@ -90,6 +90,7 @@ from superset.exceptions import (
|
|||
SupersetSecurityException,
|
||||
SupersetTimeoutException,
|
||||
)
|
||||
from superset.explore.form_data.commands.create import CreateFormDataCommand
|
||||
from superset.explore.form_data.commands.get import GetFormDataCommand
|
||||
from superset.explore.form_data.commands.parameters import CommandParameters
|
||||
from superset.explore.permalink.commands.get import GetExplorePermalinkCommand
|
||||
|
|
@ -164,6 +165,7 @@ from superset.views.utils import (
|
|||
get_datasource_info,
|
||||
get_form_data,
|
||||
get_viz,
|
||||
loads_request_json,
|
||||
sanitize_datasource_data,
|
||||
)
|
||||
from superset.viz import BaseViz
|
||||
|
|
@ -736,6 +738,39 @@ class Superset(BaseSupersetView): # pylint: disable=too-many-public-methods
|
|||
"superset/import_dashboards.html", databases=databases
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_redirect_url() -> str:
|
||||
"""Assembles the redirect URL to the new endpoint. It also replaces
|
||||
the form_data param with a form_data_key by saving the original content
|
||||
to the cache layer.
|
||||
"""
|
||||
redirect_url = request.url.replace("/superset/explore", "/explore")
|
||||
form_data_key = None
|
||||
request_form_data = request.args.get("form_data")
|
||||
if request_form_data:
|
||||
parsed_form_data = loads_request_json(request_form_data)
|
||||
slice_id = parsed_form_data.get(
|
||||
"slice_id", int(request.args.get("slice_id", 0))
|
||||
)
|
||||
datasource = parsed_form_data.get("datasource")
|
||||
if datasource:
|
||||
datasource_id, datasource_type = datasource.split("__")
|
||||
parameters = CommandParameters(
|
||||
datasource_id=datasource_id,
|
||||
datasource_type=datasource_type,
|
||||
chart_id=slice_id,
|
||||
form_data=request_form_data,
|
||||
)
|
||||
form_data_key = CreateFormDataCommand(parameters).run()
|
||||
if form_data_key:
|
||||
url = parse.urlparse(redirect_url)
|
||||
query = parse.parse_qs(url.query)
|
||||
query.pop("form_data")
|
||||
query["form_data_key"] = [form_data_key]
|
||||
url = url._replace(query=parse.urlencode(query, True))
|
||||
redirect_url = parse.urlunparse(url)
|
||||
return redirect_url
|
||||
|
||||
@has_access
|
||||
@event_logger.log_this
|
||||
@expose("/explore/<datasource_type>/<int:datasource_id>/", methods=["GET", "POST"])
|
||||
|
|
@ -753,7 +788,7 @@ class Superset(BaseSupersetView): # pylint: disable=too-many-public-methods
|
|||
self.__class__.__name__,
|
||||
)
|
||||
if request.method == "GET":
|
||||
return redirect(request.url.replace("/superset/explore", "/explore"))
|
||||
return redirect(Superset.get_redirect_url())
|
||||
|
||||
initial_form_data = {}
|
||||
|
||||
|
|
|
|||
|
|
@ -1694,6 +1694,20 @@ class TestCore(SupersetTestCase):
|
|||
|
||||
assert rv.status_code == 422
|
||||
|
||||
@pytest.mark.usefixtures("load_energy_table_with_slice")
|
||||
@mock.patch("superset.explore.form_data.commands.create.CreateFormDataCommand.run")
|
||||
def test_explore_redirect(self, mock_command: mock.Mock):
|
||||
self.login(username="admin")
|
||||
random_key = "random_key"
|
||||
mock_command.return_value = random_key
|
||||
slice_name = f"Energy Sankey"
|
||||
slice_id = self.get_slice(slice_name, db.session).id
|
||||
form_data = {"slice_id": slice_id, "viz_type": "line", "datasource": "1__table"}
|
||||
rv = self.client.get(
|
||||
f"/superset/explore/?form_data={quote(json.dumps(form_data))}"
|
||||
)
|
||||
self.assertRedirects(rv, f"/explore/?form_data_key={random_key}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
|
|||
Loading…
Reference in New Issue