From a81665571597dd9943610529bf471d5face4e26f Mon Sep 17 00:00:00 2001 From: Erik Ritter Date: Tue, 4 May 2021 15:34:38 -0700 Subject: [PATCH] fix: dashboard datasources filter None (#14471) --- superset/models/dashboard.py | 2 +- superset/models/slice.py | 7 ++++--- superset/views/core.py | 7 +++++++ superset/views/utils.py | 4 ++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/superset/models/dashboard.py b/superset/models/dashboard.py index 6f1e6bf16f..6203cb400b 100644 --- a/superset/models/dashboard.py +++ b/superset/models/dashboard.py @@ -171,7 +171,7 @@ class Dashboard( # pylint: disable=too-many-instance-attributes @property def datasources(self) -> Set[BaseDatasource]: - return {slc.datasource for slc in self.slices} + return {slc.datasource for slc in self.slices if slc.datasource} @property def charts(self) -> List[BaseDatasource]: diff --git a/superset/models/slice.py b/superset/models/slice.py index 9efd07d8e1..c80e1fba78 100644 --- a/superset/models/slice.py +++ b/superset/models/slice.py @@ -100,7 +100,7 @@ class Slice( return ConnectorRegistry.sources[self.datasource_type] @property - def datasource(self) -> "BaseDatasource": + def datasource(self) -> Optional["BaseDatasource"]: return self.get_datasource def clone(self) -> "Slice": @@ -160,8 +160,9 @@ class Slice( def viz(self) -> Optional[BaseViz]: form_data = json.loads(self.params) viz_class = viz_types.get(self.viz_type) - if viz_class: - return viz_class(datasource=self.datasource, form_data=form_data) + datasource = self.datasource + if viz_class and datasource: + return viz_class(datasource=datasource, form_data=form_data) return None @property diff --git a/superset/views/core.py b/superset/views/core.py index e9cdff19ef..aff0990d47 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -462,6 +462,10 @@ class Superset(BaseSupersetView): # pylint: disable=too-many-public-methods form_data, slc = get_form_data(slice_id, use_slice_data=True) if not slc: return json_error_response("The slice does not exist") + + if not slc.datasource: + return json_error_response("The slice's datasource does not exist") + try: viz_obj = get_viz( datasource_type=slc.datasource.type, @@ -1709,6 +1713,9 @@ class Superset(BaseSupersetView): # pylint: disable=too-many-public-methods else get_dashboard_extra_filters(slc.id, dashboard_id) ) + if not slc.datasource: + raise Exception("Slice's datasource does not exist") + obj = get_viz( datasource_type=slc.datasource.type, datasource_id=slc.datasource.id, diff --git a/superset/views/utils.py b/superset/views/utils.py index 9c4ec7364f..b0fea97030 100644 --- a/superset/views/utils.py +++ b/superset/views/utils.py @@ -290,7 +290,7 @@ def get_time_range_endpoints( if not slc: slc = db.session.query(Slice).filter_by(id=slice_id).one_or_none() - if slc: + if slc and slc.datasource: endpoints = slc.datasource.database.get_extra().get( "time_range_endpoints" ) @@ -533,7 +533,7 @@ def check_slice_perms(_self: Any, slice_id: int) -> None: form_data, slc = get_form_data(slice_id, use_slice_data=True) - if slc: + if slc and slc.datasource: try: viz_obj = get_viz( datasource_type=slc.datasource.type,