legacy.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. # pylint: disable=C,R,W
  2. """Code related with dealing with legacy / change management"""
  3. import re
  4. from superset import frontend_config
  5. FORM_DATA_KEY_WHITELIST = list(frontend_config.get('controls').keys()) + ['slice_id']
  6. def cast_filter_data(form_data):
  7. """Used by cast_form_data to parse the filters"""
  8. flts = []
  9. having_flts = []
  10. fd = form_data
  11. filter_pattern = re.compile(r"""((?:[^,"']|"[^"]*"|'[^']*')+)""")
  12. for i in range(0, 10):
  13. for prefix in ['flt', 'having']:
  14. col_str = '{}_col_{}'.format(prefix, i)
  15. op_str = '{}_op_{}'.format(prefix, i)
  16. val_str = '{}_eq_{}'.format(prefix, i)
  17. if col_str in fd and op_str in fd and val_str in fd \
  18. and len(fd[val_str]) > 0:
  19. f = {}
  20. f['col'] = fd[col_str]
  21. f['op'] = fd[op_str]
  22. if prefix == 'flt':
  23. # transfer old strings in filter value to list
  24. splitted = filter_pattern.split(fd[val_str])[1::2]
  25. values = [types.replace("'", '').strip() for types in splitted]
  26. f['val'] = values
  27. flts.append(f)
  28. if prefix == 'having':
  29. f['val'] = fd[val_str]
  30. having_flts.append(f)
  31. if col_str in fd:
  32. del fd[col_str]
  33. if op_str in fd:
  34. del fd[op_str]
  35. if val_str in fd:
  36. del fd[val_str]
  37. fd['filters'] = flts
  38. fd['having_filters'] = having_flts
  39. return fd
  40. def cast_form_data(form_data):
  41. """Translates old to new form_data"""
  42. d = {}
  43. fields = frontend_config.get('controls', {})
  44. for k, v in form_data.items():
  45. field_config = fields.get(k, {})
  46. ft = field_config.get('type')
  47. if ft == 'CheckboxControl':
  48. # bug in some urls with dups on bools
  49. if isinstance(v, list):
  50. v = 'y' in v
  51. else:
  52. v = True if v in ('true', 'y') or v is True else False
  53. elif v and ft == 'TextControl' and field_config.get('isInt'):
  54. v = int(v) if v != '' else None
  55. elif v and ft == 'TextControl' and field_config.get('isFloat'):
  56. v = float(v) if v != '' else None
  57. elif v and ft == 'SelectControl':
  58. if field_config.get('multi'):
  59. if type(form_data).__name__ == 'ImmutableMultiDict':
  60. v = form_data.getlist(k)
  61. elif not isinstance(v, list):
  62. v = [v]
  63. if d.get('slice_id'):
  64. d['slice_id'] = int(d['slice_id'])
  65. d[k] = v
  66. if 'filters' not in d:
  67. d = cast_filter_data(d)
  68. for k in list(d.keys()):
  69. if k not in FORM_DATA_KEY_WHITELIST:
  70. del d[k]
  71. return d
  72. def update_time_range(form_data):
  73. """Move since and until to time_range."""
  74. if 'since' in form_data or 'until' in form_data:
  75. form_data['time_range'] = '{} : {}'.format(
  76. form_data.pop('since', '') or '',
  77. form_data.pop('until', '') or '',
  78. )