Skip to content

Commit

Permalink
feat: allow assets to be managed externally (apache#18093)
Browse files Browse the repository at this point in the history
* feat: allow assets to be managed externally

* Use server_default
  • Loading branch information
betodealmeida authored and bwang221 committed Feb 10, 2022
1 parent 613e832 commit ff84a9c
Show file tree
Hide file tree
Showing 6 changed files with 125 additions and 2 deletions.
2 changes: 2 additions & 0 deletions superset/connectors/base/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,8 @@ def name(self) -> str:
params = Column(String(1000))
perm = Column(String(1000))
schema_perm = Column(String(1000))
is_managed_externally = Column(Boolean, nullable=False, default=False)
external_url = Column(Text, nullable=True)

sql: Optional[str] = None
owners: List[User]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# 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 columns for external management
Revision ID: 5fd49410a97a
Revises: c53bae8f08dd
Create Date: 2022-01-19 07:34:20.594786
"""

# revision identifiers, used by Alembic.
revision = "5fd49410a97a"
down_revision = "c53bae8f08dd"

import sqlalchemy as sa
from alembic import op


def upgrade():
with op.batch_alter_table("dashboards") as batch_op:
batch_op.add_column(
sa.Column(
"is_managed_externally",
sa.Boolean(),
nullable=False,
server_default=sa.false(),
)
)
batch_op.add_column(sa.Column("external_url", sa.Text(), nullable=True))

with op.batch_alter_table("datasources") as batch_op:
batch_op.add_column(
sa.Column(
"is_managed_externally",
sa.Boolean(),
nullable=False,
server_default=sa.false(),
)
)
batch_op.add_column(sa.Column("external_url", sa.Text(), nullable=True))

with op.batch_alter_table("dbs") as batch_op:
batch_op.add_column(
sa.Column(
"is_managed_externally",
sa.Boolean(),
nullable=False,
server_default=sa.false(),
)
)
batch_op.add_column(sa.Column("external_url", sa.Text(), nullable=True))

with op.batch_alter_table("slices") as batch_op:
batch_op.add_column(
sa.Column(
"is_managed_externally",
sa.Boolean(),
nullable=False,
server_default=sa.false(),
)
)
batch_op.add_column(sa.Column("external_url", sa.Text(), nullable=True))

with op.batch_alter_table("tables") as batch_op:
batch_op.add_column(
sa.Column(
"is_managed_externally",
sa.Boolean(),
nullable=False,
server_default=sa.false(),
)
)
batch_op.add_column(sa.Column("external_url", sa.Text(), nullable=True))


def downgrade():
with op.batch_alter_table("tables") as batch_op:
batch_op.drop_column("external_url")
batch_op.drop_column("is_managed_externally")
with op.batch_alter_table("slices") as batch_op:
batch_op.drop_column("external_url")
batch_op.drop_column("is_managed_externally")
with op.batch_alter_table("dbs") as batch_op:
batch_op.drop_column("external_url")
batch_op.drop_column("is_managed_externally")
with op.batch_alter_table("datasources") as batch_op:
batch_op.drop_column("external_url")
batch_op.drop_column("is_managed_externally")
with op.batch_alter_table("dashboards") as batch_op:
batch_op.drop_column("external_url")
batch_op.drop_column("is_managed_externally")
3 changes: 3 additions & 0 deletions superset/models/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,9 @@ class Database(
encrypted_extra = Column(encrypted_field_factory.create(Text), nullable=True)
impersonate_user = Column(Boolean, default=False)
server_cert = Column(encrypted_field_factory.create(Text), nullable=True)
is_managed_externally = Column(Boolean, nullable=False, default=False)
external_url = Column(Text, nullable=True)

export_fields = [
"database_name",
"sqlalchemy_uri",
Expand Down
2 changes: 2 additions & 0 deletions superset/models/dashboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ class Dashboard(Model, AuditMixinNullable, ImportExportMixin):
slices = relationship(Slice, secondary=dashboard_slices, backref="dashboards")
owners = relationship(security_manager.user_model, secondary=dashboard_user)
published = Column(Boolean, default=False)
is_managed_externally = Column(Boolean, nullable=False, default=False)
external_url = Column(Text, nullable=True)
roles = relationship(security_manager.role_model, secondary=DashboardRoles)
_filter_sets = relationship(
"FilterSet", back_populates="dashboard", cascade="all, delete"
Expand Down
2 changes: 1 addition & 1 deletion superset/models/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@ def remove_params(self, param_to_remove: str) -> None:
self.params = json.dumps(params)

def reset_ownership(self) -> None:
""" object will belong to the user the current user """
"""object will belong to the user the current user"""
# make sure the object doesn't have relations to a user
# it will be filled by appbuilder on save
self.created_by = None
Expand Down
13 changes: 12 additions & 1 deletion superset/models/slice.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,16 @@
from flask_appbuilder import Model
from flask_appbuilder.models.decorators import renders
from markupsafe import escape, Markup
from sqlalchemy import Column, DateTime, ForeignKey, Integer, String, Table, Text
from sqlalchemy import (
Boolean,
Column,
DateTime,
ForeignKey,
Integer,
String,
Table,
Text,
)
from sqlalchemy.engine.base import Connection
from sqlalchemy.orm import relationship
from sqlalchemy.orm.mapper import Mapper
Expand Down Expand Up @@ -83,6 +92,8 @@ class Slice( # pylint: disable=too-many-public-methods
last_saved_by_fk = Column(Integer, ForeignKey("ab_user.id"), nullable=True)
certified_by = Column(Text)
certification_details = Column(Text)
is_managed_externally = Column(Boolean, nullable=False, default=False)
external_url = Column(Text, nullable=True)
last_saved_by = relationship(
security_manager.user_model, foreign_keys=[last_saved_by_fk]
)
Expand Down

0 comments on commit ff84a9c

Please sign in to comment.