diff --git a/superset/connectors/base/__init__.py b/superset/connectors/base/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/superset/connectors/base.py b/superset/connectors/base/models.py similarity index 100% rename from superset/connectors/base.py rename to superset/connectors/base/models.py diff --git a/superset/connectors/base/views.py b/superset/connectors/base/views.py new file mode 100644 index 0000000000..36cfe45076 --- /dev/null +++ b/superset/connectors/base/views.py @@ -0,0 +1,12 @@ +from superset.views.base import SupersetModelView +from superset.utils import SupersetException +from flask import Markup + + +class DatasourceModelView(SupersetModelView): + def pre_delete(self, obj): + if obj.slices: + raise SupersetException(Markup( + "Cannot delete a datasource that has slices attached to it." + "Here's the list of associated slices: " + + "".join([o.slice_link for o in obj.slices]))) diff --git a/superset/connectors/druid/models.py b/superset/connectors/druid/models.py index dc037264a1..b4e1556a9e 100644 --- a/superset/connectors/druid/models.py +++ b/superset/connectors/druid/models.py @@ -33,7 +33,7 @@ from superset import conf, db, import_util, utils, sm, get_session from superset.utils import ( flasher, MetricPermException, DimSelector, DTTM_ALIAS ) -from superset.connectors.base import BaseDatasource, BaseColumn, BaseMetric +from superset.connectors.base.models import BaseDatasource, BaseColumn, BaseMetric from superset.models.helpers import AuditMixinNullable, QueryResult, set_perm DRUID_TZ = conf.get("DRUID_TZ") diff --git a/superset/connectors/druid/views.py b/superset/connectors/druid/views.py index e12321755b..7ae3fb3709 100644 --- a/superset/connectors/druid/views.py +++ b/superset/connectors/druid/views.py @@ -3,19 +3,19 @@ import logging import sqlalchemy as sqla -from flask import Markup, flash, redirect, abort +from flask import Markup, flash, redirect from flask_appbuilder import CompactCRUDMixin, expose from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_babel import lazy_gettext as _ from flask_babel import gettext as __ -import superset from superset import db, utils, appbuilder, sm, security from superset.connectors.connector_registry import ConnectorRegistry from superset.utils import has_access -from superset.views.base import BaseSupersetView +from superset.connectors.base.views import DatasourceModelView from superset.views.base import ( + BaseSupersetView, SupersetModelView, validate_json, DeleteMixin, ListWidgetWithCheckboxes, DatasourceFilter, get_datasource_exist_error_mgs) @@ -149,7 +149,7 @@ appbuilder.add_view( category_icon='fa-database',) -class DruidDatasourceModelView(SupersetModelView, DeleteMixin): # noqa +class DruidDatasourceModelView(DatasourceModelView, DeleteMixin): # noqa datamodel = SQLAInterface(models.DruidDatasource) list_widget = ListWidgetWithCheckboxes list_columns = [ diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 1cd0818d07..147c667df0 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -11,8 +11,7 @@ from sqlalchemy import ( ) import sqlalchemy as sa from sqlalchemy import asc, and_, desc, select -from sqlalchemy.ext.compiler import compiles -from sqlalchemy.sql.expression import ColumnClause, TextAsFrom +from sqlalchemy.sql.expression import TextAsFrom from sqlalchemy.orm import backref, relationship from sqlalchemy.sql import table, literal_column, text, column @@ -21,7 +20,7 @@ from flask_appbuilder import Model from flask_babel import lazy_gettext as _ from superset import db, utils, import_util, sm -from superset.connectors.base import BaseDatasource, BaseColumn, BaseMetric +from superset.connectors.base.models import BaseDatasource, BaseColumn, BaseMetric from superset.utils import DTTM_ALIAS, QueryStatus from superset.models.helpers import QueryResult from superset.models.core import Database diff --git a/superset/connectors/sqla/views.py b/superset/connectors/sqla/views.py index 5ba10dac54..cddd859dac 100644 --- a/superset/connectors/sqla/views.py +++ b/superset/connectors/sqla/views.py @@ -3,7 +3,7 @@ import logging from past.builtins import basestring -from flask import Markup, flash, redirect, abort +from flask import Markup, flash, redirect from flask_appbuilder import CompactCRUDMixin, expose from flask_appbuilder.models.sqla.interface import SQLAInterface import sqlalchemy as sa @@ -13,6 +13,7 @@ from flask_babel import gettext as __ from superset import appbuilder, db, utils, security, sm from superset.utils import has_access +from superset.connectors.base.views import DatasourceModelView from superset.views.base import ( SupersetModelView, ListWidgetWithCheckboxes, DeleteMixin, DatasourceFilter, get_datasource_exist_error_mgs, @@ -133,7 +134,7 @@ class SqlMetricInlineView(CompactCRUDMixin, SupersetModelView): # noqa appbuilder.add_view_no_menu(SqlMetricInlineView) -class TableModelView(SupersetModelView, DeleteMixin): # noqa +class TableModelView(DatasourceModelView, DeleteMixin): # noqa datamodel = SQLAInterface(models.SqlaTable) list_columns = [ 'link', 'database',