graceguo-supercat closed pull request #4578: [Explore] Save custom url parameters when user save slices URL: https://github.com/apache/incubator-superset/pull/4578
This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): 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..ce8795acf2 100644 --- a/superset/jinja_context.py +++ b/superset/jinja_context.py @@ -7,6 +7,7 @@ from datetime import datetime, timedelta import inspect +import json import random import time import uuid @@ -30,15 +31,21 @@ 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) + 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')) + url_params = form_data['url_params'] or {} + return url_params.get(param, default) + return default def current_user_id(): diff --git a/superset/utils.py b/superset/utils.py index c60f128d0e..ab3cef8a22 100644 --- a/superset/utils.py +++ b/superset/utils.py @@ -835,6 +835,15 @@ def get_filter_key(f): del form_data['extra_filters'] +def merge_request_params(form_data, params): + url_params = {} + for key, value in params.items(): + if key in ('form_data', 'r'): + continue + url_params[key] = value + form_data['url_params'] = url_params + + def get_update_perms_flag(): val = os.environ.get('SUPERSET_UPDATE_PERMS') return val.lower() not in ('0', 'false', 'no') if val else True diff --git a/superset/views/core.py b/superset/views/core.py index d5cd1689c5..4330e7d7ee 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -43,7 +43,9 @@ import superset.models.core as models from superset.models.sql_lab import Query from superset.sql_parse import SupersetQuery -from superset.utils import has_access, merge_extra_filters, QueryStatus +from superset.utils import ( + has_access, merge_extra_filters, merge_request_params, QueryStatus, +) from .base import ( api, BaseSupersetView, CsvResponse, DeleteMixin, generate_download_headers, get_error_msg, get_user_roles, @@ -1255,6 +1257,10 @@ def explore(self, datasource_type=None, datasource_id=None): # On explore, merge extra filters into the form data merge_extra_filters(form_data) + # merge request url params + if request.method == 'GET': + merge_request_params(form_data, request.args) + # handle save or overwrite action = request.args.get('action') diff --git a/tests/utils_tests.py b/tests/utils_tests.py index 172818964f..674c6f4a67 100644 --- a/tests/utils_tests.py +++ b/tests/utils_tests.py @@ -14,7 +14,8 @@ from superset.utils import ( base_json_conv, datetime_f, json_int_dttm_ser, json_iso_dttm_ser, - JSONEncodedDict, memoized, merge_extra_filters, parse_human_timedelta, + JSONEncodedDict, memoized, merge_extra_filters, merge_request_params, + parse_human_timedelta, SupersetException, validate_json, zlib_compress, zlib_decompress_to_string, ) @@ -216,6 +217,20 @@ def test_merge_extra_filters_adds_unequal_lists(self): merge_extra_filters(form_data) self.assertEquals(form_data, expected) + def test_merge_request_params(self): + form_data = { + 'since': '2000', + 'until': 'now', + } + url_params = { + 'form_data': form_data, + 'dashboard_ids': '(1,2,3,4,5)', + } + merge_request_params(form_data, url_params) + self.assertIn('url_params', form_data.keys()) + self.assertIn('dashboard_ids', form_data['url_params']) + self.assertNotIn('form_data', form_data.keys()) + def test_datetime_f(self): self.assertEquals( datetime_f(datetime(1990, 9, 21, 19, 11, 19, 626096)), ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services