diff --git a/caravel/models.py b/caravel/models.py index 105de89495..e61468f5a4 100644 --- a/caravel/models.py +++ b/caravel/models.py @@ -1180,6 +1180,9 @@ class DruidCluster(Model, AuditMixinNullable): for datasource in self.get_datasources(): if datasource not in config.get('DRUID_DATA_SOURCE_BLACKLIST'): DruidDatasource.sync_to_db(datasource, self) + @property + def perm(self): + return "[{obj.cluster_name}].(id:{obj.id})".format(obj=self) class DruidDatasource(Model, AuditMixinNullable, Queryable): diff --git a/caravel/views.py b/caravel/views.py index cdcec757fc..a3f510580d 100755 --- a/caravel/views.py +++ b/caravel/views.py @@ -628,6 +628,11 @@ class DruidClusterModelView(CaravelModelView, DeleteMixin): # noqa 'broker_port': _("Broker Port"), 'broker_endpoint': _("Broker Endpoint"), } + def pre_add(self, db): + utils.merge_perm(sm, 'database_access', db.perm) + + def pre_update(self, db): + self.pre_add(db) if config['DRUID_IS_ACTIVE']: @@ -1613,7 +1618,7 @@ class Caravel(BaseCaravelView): if not self.database_access(query.database): flash(get_database_access_error_msg(query.database.database_name)) - redirect('/') + return redirect('/') sql = query.select_sql or query.sql df = query.database.get_df(sql, query.schema)