This is an automated email from the ASF dual-hosted git repository. graceguo pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
The following commit(s) were added to refs/heads/master by this push: new ede5c71 [annotation] Only allow override whole time_range (#6286) ede5c71 is described below commit ede5c710edc28026ec0b1d5b421aa49a4761cdc5 Author: Grace Guo <grace....@airbnb.com> AuthorDate: Wed Nov 7 19:26:06 2018 -0800 [annotation] Only allow override whole time_range (#6286) --- superset/assets/src/chart/chartAction.js | 11 ++++--- .../components/controls/AnnotationLayer.jsx | 38 +++++++++------------- superset/assets/src/utils/common.js | 3 -- superset/views/core.py | 10 +----- 4 files changed, 23 insertions(+), 39 deletions(-) diff --git a/superset/assets/src/chart/chartAction.js b/superset/assets/src/chart/chartAction.js index 771f159..fb4ffd6 100644 --- a/superset/assets/src/chart/chartAction.js +++ b/superset/assets/src/chart/chartAction.js @@ -1,12 +1,12 @@ /* global window, AbortController */ /* eslint no-undef: 'error' */ +/* eslint no-param-reassign: ["error", { "props": false }] */ import { t } from '@superset-ui/translation'; import { SupersetClient } from '@superset-ui/connection'; import { getExploreUrlAndPayload, getAnnotationJsonUrl } from '../explore/exploreUtils'; import { requiresQuery, ANNOTATION_SOURCE_TYPES } from '../modules/AnnotationTypes'; import { addDangerToast } from '../messageToasts/actions'; import { Logger, LOG_ACTIONS_LOAD_CHART } from '../logger'; -import { TIME_RANGE_SEPARATOR } from '../utils/common'; import getClientErrorObject from '../utils/getClientErrorObject'; export const CHART_UPDATE_STARTED = 'CHART_UPDATE_STARTED'; @@ -77,10 +77,13 @@ export function runAnnotationQuery(annotation, timeout = 60, formData = null, ke const granularity = fd.time_grain_sqla || fd.granularity; fd.time_grain_sqla = granularity; fd.granularity = granularity; - if (fd.time_range) { - [fd.since, fd.until] = fd.time_range.split(TIME_RANGE_SEPARATOR); + const overridesKeys = Object.keys(annotation.overrides); + if (overridesKeys.includes('since') || overridesKeys.includes('until')) { + annotation.overrides = { + ...annotation.overrides, + time_range: null, + }; } - const sliceFormData = Object.keys(annotation.overrides).reduce( (d, k) => ({ ...d, diff --git a/superset/assets/src/explore/components/controls/AnnotationLayer.jsx b/superset/assets/src/explore/components/controls/AnnotationLayer.jsx index a878345..28ddbbe 100644 --- a/superset/assets/src/explore/components/controls/AnnotationLayer.jsx +++ b/superset/assets/src/explore/components/controls/AnnotationLayer.jsx @@ -97,6 +97,14 @@ export default class AnnotationLayer extends React.PureComponent { timeColumn, intervalEndColumn, } = props; + + const overridesKeys = Object.keys(overrides); + if (overridesKeys.includes('since') || overridesKeys.includes('until')) { + overrides.time_range = null; + delete overrides.since; + delete overrides.until; + } + this.state = { // base name, @@ -215,7 +223,7 @@ export default class AnnotationLayer extends React.PureComponent { intervalEndColumn: null, timeColumn: null, titleColumn: null, - overrides: { since: null, until: null }, + overrides: { time_range: null }, }); } @@ -427,31 +435,15 @@ export default class AnnotationLayer extends React.PureComponent { <div style={{ marginTop: '1rem' }}> <CheckboxControl hovered - name="annotation-override-since" - label="Override 'Since'" - description={`This controls whether the "Since" field from the current - view should be passed down to the chart containing the annotation data.`} - value={!!Object.keys(overrides).find(x => x === 'since')} - onChange={(v) => { - delete overrides.since; - if (v) { - this.setState({ overrides: { ...overrides, since: null } }); - } else { - this.setState({ overrides: { ...overrides } }); - } - }} - /> - <CheckboxControl - hovered - name="annotation-override-until" - label="Override 'Until'" - description={`This controls whether the "Until" field from the current + name="annotation-override-time_range" + label="Override time range" + description={`This controls whether the "time_range" field from the current view should be passed down to the chart containing the annotation data.`} - value={!!Object.keys(overrides).find(x => x === 'until')} + value={!!Object.keys(overrides).find(x => x === 'time_range')} onChange={(v) => { - delete overrides.until; + delete overrides.time_range; if (v) { - this.setState({ overrides: { ...overrides, until: null } }); + this.setState({ overrides: { ...overrides, time_range: null } }); } else { this.setState({ overrides: { ...overrides } }); } diff --git a/superset/assets/src/utils/common.js b/superset/assets/src/utils/common.js index 4d8574d..282518f 100644 --- a/superset/assets/src/utils/common.js +++ b/superset/assets/src/utils/common.js @@ -114,6 +114,3 @@ export function optionFromValue(opt) { // From a list of options, handles special values & labels return { value: optionValue(opt), label: optionLabel(opt) }; } - -// time_range separator -export const TIME_RANGE_SEPARATOR = ' : '; diff --git a/superset/views/core.py b/superset/views/core.py index eb1d8d3..ef4c4ec 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -1030,15 +1030,7 @@ class Superset(BaseSupersetView): if slice_id and (use_slice_data or contains_only_slc_id): slc = db.session.query(models.Slice).filter_by(id=slice_id).first() slice_form_data = slc.form_data.copy() - # allow form_data in request override slice from_data - # special treat for since/until and time_range parameter: - # we need to breakdown time_range into since/until so request parameters - # has precedence over slice parameters for time fields. - if 'since' in form_data or 'until' in form_data: - form_data['since'], form_data['until'] = \ - utils.get_since_until(form_data) - slice_form_data['since'], slice_form_data['until'] = \ - utils.get_since_until(slice_form_data) + slice_form_data.update(form_data) form_data = slice_form_data