From b7ea0d5caf9171d83d39e0fe6b33c61dad09906b Mon Sep 17 00:00:00 2001 From: "Octavian R. Corlade" Date: Fri, 3 Aug 2018 15:35:14 +0200 Subject: [PATCH 1/2] migrate dashboard date filters to time range format --- .../388242a6da7e_dash_json_add_time_range.py | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 superset/migrations/versions/388242a6da7e_dash_json_add_time_range.py diff --git a/superset/migrations/versions/388242a6da7e_dash_json_add_time_range.py b/superset/migrations/versions/388242a6da7e_dash_json_add_time_range.py new file mode 100644 index 0000000000000..b25031bf0ad14 --- /dev/null +++ b/superset/migrations/versions/388242a6da7e_dash_json_add_time_range.py @@ -0,0 +1,89 @@ +"""dash json add time_range + +Revision ID: 388242a6da7e +Revises: c18bd4186f15 +Create Date: 2018-08-03 15:26:58.524367 + +""" + +import json + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.ext.declarative import declarative_base + +from superset import db + +# revision identifiers, used by Alembic. +revision = '388242a6da7e' +down_revision = 'c18bd4186f15' + +Base = declarative_base() + + +class Dashboard(Base): + """Declarative class to do query in upgrade""" + __tablename__ = 'dashboards' + id = sa.Column(sa.Integer, primary_key=True) + json_metadata = sa.Column(sa.Text) + + +def upgrade(): + + bind = op.get_bind() + session = db.Session(bind=bind) + + dashboards = session.query(Dashboard).all() + for i, dashboard in enumerate(dashboards): + print('Upgrading ({}/{}): {}'.format( + i + 1, len(dashboards), dashboard.id)) + metadata = json.loads(dashboard.json_metadata or '{}') + default_filters = json.loads(metadata.get('default_filters') or '{}') + + for filter_id in default_filters: + filter = default_filters[filter_id] + if '__from' in filter or '__to' in filter: + time_range = '{} : {}'.format( + filter.get('__from', ''), filter.get('__to', '')) + default_filters[filter_id] = {'__time_range': time_range} + + metadata['default_filters'] = json.dumps(default_filters, indent=2) + dashboard.json_metadata = json.dumps(metadata, indent=2) + session.merge(dashboard) + session.commit() + + session.close() + + +def downgrade(): + bind = op.get_bind() + session = db.Session(bind=bind) + + dashboards = session.query(Dashboard).all() + for i, dashboard in enumerate(dashboards): + print('Downgrading ({}/{}): {}'.format( + i + 1, len(dashboards), dashboard.id)) + metadata = json.loads(dashboard.json_metadata or '{}') + default_filters = json.loads(metadata.get('default_filters') or '{}') + + for filter_id in default_filters: + filter = default_filters[filter_id] + if '__time_range' in filter: + time_range_array = filter['__time_range'].split(' : ') + try: + date_from = time_range_array[0] + date_to = time_range_array[1] + default_filters[filter_id] = { + '__from': date_from, + '__to': date_to, + } + except IndexError: + print("Can't downgrade filter") + + metadata['default_filters'] = json.dumps(default_filters, indent=2) + dashboard.json_metadata = json.dumps(metadata, indent=2) + session.merge(dashboard) + session.commit() + + session.close() + From 681cb38087c5341f3c2495f7c30d8bf325c35222 Mon Sep 17 00:00:00 2001 From: "Octavian R. Corlade" Date: Wed, 8 Aug 2018 09:24:34 +0200 Subject: [PATCH 2/2] migration commit outside of loop, no merge --- .../versions/388242a6da7e_dash_json_add_time_range.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/superset/migrations/versions/388242a6da7e_dash_json_add_time_range.py b/superset/migrations/versions/388242a6da7e_dash_json_add_time_range.py index b25031bf0ad14..b3a53afaeae5a 100644 --- a/superset/migrations/versions/388242a6da7e_dash_json_add_time_range.py +++ b/superset/migrations/versions/388242a6da7e_dash_json_add_time_range.py @@ -49,9 +49,8 @@ def upgrade(): metadata['default_filters'] = json.dumps(default_filters, indent=2) dashboard.json_metadata = json.dumps(metadata, indent=2) - session.merge(dashboard) - session.commit() + session.commit() session.close() @@ -82,8 +81,7 @@ def downgrade(): metadata['default_filters'] = json.dumps(default_filters, indent=2) dashboard.json_metadata = json.dumps(metadata, indent=2) - session.merge(dashboard) - session.commit() + session.commit() session.close()