From 8e0ba8dbdc3e4dbeaba1e221d6ca2b90c775605b Mon Sep 17 00:00:00 2001 From: Grace Guo Date: Wed, 28 Feb 2018 07:50:18 -0800 Subject: [PATCH] [Explore] Save url parameters when user save slices --- .../explore/components/ExploreViewContainer.jsx | 7 +++++++ superset/assets/javascripts/explore/index.jsx | 2 ++ .../assets/javascripts/explore/stores/store.js | 7 +++++++ superset/jinja_context.py | 16 ++++++++++++---- superset/views/core.py | 8 ++++++++ 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx b/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx index e1b7acbee0..a254ded44b 100644 --- a/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx +++ b/superset/assets/javascripts/explore/components/ExploreViewContainer.jsx @@ -293,6 +293,13 @@ ExploreViewContainer.propTypes = propTypes; function mapStateToProps({ explore, charts, impressionId }) { const form_data = getFormDataFromControls(explore.controls); + // fill in additional params stored in form_data but not used by control + Object.keys(explore.rawFormData) + .forEach((key) => { + if (form_data[key] === undefined) { + form_data[key] = explore.rawFormData[key]; + } + }); const chartKey = Object.keys(charts)[0]; const chart = charts[chartKey]; return { diff --git a/superset/assets/javascripts/explore/index.jsx b/superset/assets/javascripts/explore/index.jsx index 35eb68db97..74f5a0bb68 100644 --- a/superset/assets/javascripts/explore/index.jsx +++ b/superset/assets/javascripts/explore/index.jsx @@ -25,6 +25,7 @@ initJQueryAjax(); const exploreViewContainer = document.getElementById('app'); const bootstrapData = JSON.parse(exploreViewContainer.getAttribute('data-bootstrap')); const controls = getControlsState(bootstrapData, bootstrapData.form_data); +const rawFormData = { ...bootstrapData.form_data }; delete bootstrapData.form_data; delete bootstrapData.common.locale; delete bootstrapData.common.language_pack; @@ -32,6 +33,7 @@ delete bootstrapData.common.language_pack; // Initial state const bootstrappedState = Object.assign( bootstrapData, { + rawFormData, controls, filterColumnOpts: [], isDatasourceMetaLoading: false, diff --git a/superset/assets/javascripts/explore/stores/store.js b/superset/assets/javascripts/explore/stores/store.js index 02bd121e65..4f1e7b5612 100644 --- a/superset/assets/javascripts/explore/stores/store.js +++ b/superset/assets/javascripts/explore/stores/store.js @@ -109,6 +109,13 @@ export function applyDefaultFormData(form_data) { formData[k] = form_data[k]; } }); + // fill in additional params stored in form_data but not used by control + Object.keys(form_data) + .forEach((key) => { + if (formData[key] === undefined) { + formData[key] = form_data[key]; + } + }); return formData; } diff --git a/superset/jinja_context.py b/superset/jinja_context.py index fe93594fce..fb19611d92 100644 --- a/superset/jinja_context.py +++ b/superset/jinja_context.py @@ -7,6 +7,7 @@ from __future__ import unicode_literals from datetime import datetime, timedelta import inspect +import json import random import time import uuid @@ -30,15 +31,22 @@ BASE_CONTEXT.update(config.get('JINJA_CONTEXT_ADDONS', {})) def url_param(param, default=None): - """Get a url paramater + """Get a url or post data parameter - :param param: the url parameter to lookup + :param param: the parameter to lookup :type param: str :param default: the value to return in the absence of the parameter :type default: str """ - print(request.args) - return request.args.get(param, default) + print('request args', request.args) + print('request form', request.form) + if request.args.get(param): + return request.args.get(param, default) + # Supporting POST as well as get + if request.form.get('form_data'): + form_data = json.loads(request.form.get('form_data')) + return form_data.get(param, default) + return default def current_user_id(): diff --git a/superset/views/core.py b/superset/views/core.py index d5cd1689c5..9e0aa358b5 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -1255,6 +1255,14 @@ class Superset(BaseSupersetView): # On explore, merge extra filters into the form data merge_extra_filters(form_data) + # merge request url params + if request.method == 'GET': + url_params = request.args + for key, value in url_params.items(): + if key == 'form_data': + continue + form_data[key] = value + # handle save or overwrite action = request.args.get('action')