diff --git a/superset/migrations/versions/80669c0097a6_add_parent_ids_in_dashboard_layout.py b/superset/migrations/versions/80669c0097a6_add_parent_ids_in_dashboard_layout.py new file mode 100644 index 000000000..534cecda6 --- /dev/null +++ b/superset/migrations/versions/80669c0097a6_add_parent_ids_in_dashboard_layout.py @@ -0,0 +1,120 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""Add Parent ids in dashboard layout metadata + +Revision ID: 80669c0097a6 +Revises: c82ee8a39623 +Create Date: 2019-02-25 15:43:02.488328 + +""" +import json +import logging + +from alembic import op +from sqlalchemy import ( + Column, + Integer, + Text, +) +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import relationship +from alembic import op +import sqlalchemy as sa + +from superset import db + +# revision identifiers, used by Alembic. +revision = '80669c0097a6' +down_revision = 'c82ee8a39623' + +Base = declarative_base() + + +class Dashboard(Base): + """Declarative class to do query in upgrade""" + __tablename__ = 'dashboards' + id = Column(Integer, primary_key=True) + position_json = Column(Text) + + +def add_parent_ids(node, layout): + if node: + current_id = node.get('id') + parents = list(node.get('parents') or []) + child_ids = node.get('children') + + if child_ids and len(child_ids) > 0: + parents.append(current_id) + for child_id in child_ids: + child_node = layout.get(child_id) + child_node['parents'] = parents + add_parent_ids(child_node, layout) + + +def upgrade(): + bind = op.get_bind() + session = db.Session(bind=bind) + + dashboards = session.query(Dashboard).all() + for i, dashboard in enumerate(dashboards): + print('adding parents for dashboard layout, id = {} ({}/{}) >>>>'.format( + dashboard.id, + i + 1, + len(dashboards), + )) + try: + layout = json.loads(dashboard.position_json or '{}') + if layout and layout['ROOT_ID']: + add_parent_ids(layout['ROOT_ID'], layout) + + dashboard.position_json = json.dumps( + layout, indent=None, separators=(',', ':'), sort_keys=True) + session.merge(dashboard) + except Exception as e: + logging.exception(e) + + 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('remove parents from dashboard layout, id = {} ({}/{}) >>>>'.format( + dashboard.id, + i + 1, + len(dashboards), + )) + try: + layout = json.loads(dashboard.position_json or '{}') + for key, item in layout.items(): + if not isinstance(item, dict): + continue + item.pop('parents', None) + layout[key] = item + + dashboard.position_json = json.dumps( + layout, indent=None, separators=(',', ':'), sort_keys=True) + session.merge(dashboard) + except Exception as e: + logging.exception(e) + + session.commit() + session.close() diff --git a/superset/migrations/versions/c8beba38d316_.py b/superset/migrations/versions/c8beba38d316_.py new file mode 100644 index 000000000..056dd494f --- /dev/null +++ b/superset/migrations/versions/c8beba38d316_.py @@ -0,0 +1,38 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""empty message + +Revision ID: c8beba38d316 +Revises: ('80669c0097a6', '45e7da7cfeba') +Create Date: 2019-04-04 13:17:34.790917 + +""" + +# revision identifiers, used by Alembic. +revision = 'c8beba38d316' +down_revision = ('80669c0097a6', '45e7da7cfeba') + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + pass + + +def downgrade(): + pass