From d758684ca9d3fbc18ad417c183a7b366dea7fff7 Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Thu, 31 May 2018 21:18:36 -0700 Subject: [PATCH] Allow multiple time shifts (#5067) * Allow multiple time shifts * Handle old form data (cherry picked from commit 1d3e96b) --- superset/assets/src/explore/controls.jsx | 17 +++++++++++++---- superset/assets/src/explore/visTypes.js | 2 +- superset/viz.py | 18 ++++++++++++------ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/superset/assets/src/explore/controls.jsx b/superset/assets/src/explore/controls.jsx index 1aca3f7d1be6a..46ece7041d6aa 100644 --- a/superset/assets/src/explore/controls.jsx +++ b/superset/assets/src/explore/controls.jsx @@ -1577,11 +1577,20 @@ export const controls = { }, time_compare: { - type: 'TextControl', + type: 'SelectControl', + multi: true, + freeForm: true, label: t('Time Shift'), - default: null, - description: t('Overlay a timeseries from a ' + - 'relative time period. Expects relative time delta ' + + default: [], + choices: formatSelectOptions([ + '1 day', + '1 week', + '28 days', + '30 days', + '1 year', + ]), + description: t('Overlay one or more timeseries from a ' + + 'relative time period. Expects relative time deltas ' + 'in natural language (example: 24 hours, 7 days, ' + '56 weeks, 365 days)'), }, diff --git a/superset/assets/src/explore/visTypes.js b/superset/assets/src/explore/visTypes.js index 5fb541ab959bd..f771c38ad7817 100644 --- a/superset/assets/src/explore/visTypes.js +++ b/superset/assets/src/explore/visTypes.js @@ -74,7 +74,7 @@ export const sections = { 'of query results'), controlSetRows: [ ['rolling_type', 'rolling_periods', 'min_periods'], - ['time_compare', null], + ['time_compare'], ['num_period_compare', 'period_ratio_type'], ['resample_how', 'resample_rule', 'resample_fillmethod'], ], diff --git a/superset/viz.py b/superset/viz.py index a52fe8be095b7..b0ac9f31d5747 100644 --- a/superset/viz.py +++ b/superset/viz.py @@ -87,7 +87,7 @@ def __init__(self, datasource, form_data, force=False): self._some_from_cache = False self._any_cache_key = None self._any_cached_dttm = None - self._extra_chart_data = None + self._extra_chart_data = [] self.process_metrics() @@ -1201,10 +1201,15 @@ def process_data(self, df, aggregate=False): def run_extra_queries(self): fd = self.form_data - time_compare = fd.get('time_compare') - if time_compare: + + time_compare = fd.get('time_compare') or [] + # backwards compatibility + if not isinstance(time_compare, list): + time_compare = [time_compare] + + for option in time_compare: query_object = self.query_obj() - delta = utils.parse_human_timedelta(time_compare) + delta = utils.parse_human_timedelta(option) query_object['inner_from_dttm'] = query_object['from_dttm'] query_object['inner_to_dttm'] = query_object['to_dttm'] @@ -1217,10 +1222,11 @@ def run_extra_queries(self): df2 = self.get_df_payload(query_object).get('df') if df2 is not None: + label = '{} offset'. format(option) df2[DTTM_ALIAS] += delta df2 = self.process_data(df2) - self._extra_chart_data = self.to_series( - df2, classed='superset', title_suffix='---') + self._extra_chart_data.extend(self.to_series( + df2, classed='superset', title_suffix=label)) def get_data(self, df): df = self.process_data(df)