Skip to content

Commit

Permalink
fix: Supports form_data param in old Explore endpoint (apache#21469)
Browse files Browse the repository at this point in the history
(cherry picked from commit 2c7323a)
  • Loading branch information
michael-s-molina authored and jinghua-qa committed Sep 20, 2022
1 parent a5d2834 commit 33ec349
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 1 deletion.
37 changes: 36 additions & 1 deletion superset/views/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@
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
Expand Down Expand Up @@ -164,6 +165,7 @@
get_datasource_info,
get_form_data,
get_viz,
loads_request_json,
sanitize_datasource_data,
)
from superset.viz import BaseViz
Expand Down Expand Up @@ -737,6 +739,39 @@ def import_dashboards(self) -> FlaskResponse:
"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"])
Expand All @@ -754,7 +789,7 @@ def explore(
self.__class__.__name__,
)
if request.method == "GET":
return redirect(request.url.replace("/superset/explore", "/explore"))
return redirect(Superset.get_redirect_url())

initial_form_data = {}

Expand Down
14 changes: 14 additions & 0 deletions tests/integration_tests/core_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1715,6 +1715,20 @@ def test_stop_query_not_implemented(

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()

0 comments on commit 33ec349

Please sign in to comment.