| """Code related with dealing with legacy / change management""" |
| from __future__ import absolute_import |
| from __future__ import division |
| from __future__ import print_function |
| from __future__ import unicode_literals |
| |
| import re |
| |
| from superset import frontend_config |
| |
| FORM_DATA_KEY_WHITELIST = list(frontend_config.get('controls').keys()) + ['slice_id'] |
| |
| |
| def cast_filter_data(form_data): |
| """Used by cast_form_data to parse the filters""" |
| flts = [] |
| having_flts = [] |
| fd = form_data |
| filter_pattern = re.compile(r"""((?:[^,"']|"[^"]*"|'[^']*')+)""") |
| for i in range(0, 10): |
| for prefix in ['flt', 'having']: |
| col_str = '{}_col_{}'.format(prefix, i) |
| op_str = '{}_op_{}'.format(prefix, i) |
| val_str = '{}_eq_{}'.format(prefix, i) |
| if col_str in fd and op_str in fd and val_str in fd \ |
| and len(fd[val_str]) > 0: |
| f = {} |
| f['col'] = fd[col_str] |
| f['op'] = fd[op_str] |
| if prefix == 'flt': |
| # transfer old strings in filter value to list |
| splitted = filter_pattern.split(fd[val_str])[1::2] |
| values = [types.replace("'", '').strip() for types in splitted] |
| f['val'] = values |
| flts.append(f) |
| if prefix == 'having': |
| f['val'] = fd[val_str] |
| having_flts.append(f) |
| if col_str in fd: |
| del fd[col_str] |
| if op_str in fd: |
| del fd[op_str] |
| if val_str in fd: |
| del fd[val_str] |
| fd['filters'] = flts |
| fd['having_filters'] = having_flts |
| return fd |
| |
| |
| def cast_form_data(form_data): |
| """Translates old to new form_data""" |
| d = {} |
| fields = frontend_config.get('controls', {}) |
| for k, v in form_data.items(): |
| field_config = fields.get(k, {}) |
| ft = field_config.get('type') |
| if ft == 'CheckboxControl': |
| # bug in some urls with dups on bools |
| if isinstance(v, list): |
| v = 'y' in v |
| else: |
| v = True if v in ('true', 'y') or v is True else False |
| elif v and ft == 'TextControl' and field_config.get('isInt'): |
| v = int(v) if v != '' else None |
| elif v and ft == 'TextControl' and field_config.get('isFloat'): |
| v = float(v) if v != '' else None |
| elif v and ft == 'SelectControl': |
| if field_config.get('multi'): |
| if type(form_data).__name__ == 'ImmutableMultiDict': |
| v = form_data.getlist(k) |
| elif not isinstance(v, list): |
| v = [v] |
| if d.get('slice_id'): |
| d['slice_id'] = int(d['slice_id']) |
| |
| d[k] = v |
| if 'filters' not in d: |
| d = cast_filter_data(d) |
| for k in list(d.keys()): |
| if k not in FORM_DATA_KEY_WHITELIST: |
| del d[k] |
| return d |