Skip to content

Commit c20ee0c

Browse files
authored
Filter Druid Datasources by user permissions. (#1090)
1 parent 6aadc6e commit c20ee0c

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

Diff for: caravel/views.py

+14
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,19 @@ def apply(self, query, value): # noqa
230230
return qry
231231

232232

233+
class FilterDruidDatasource(CaravelFilter):
234+
def apply(self, query, func): # noqa
235+
if any([r.name in ('Admin', 'Alpha') for r in get_user_roles()]):
236+
return query
237+
perms = self.get_perms()
238+
druid_datasources = []
239+
for perm in perms:
240+
match = re.search(r'\(id:(\d+)\)', perm)
241+
druid_datasources.append(match.group(1))
242+
qry = query.filter(self.model.id.in_(druid_datasources))
243+
return qry
244+
245+
233246
def validate_json(form, field): # noqa
234247
try:
235248
json.loads(field.data)
@@ -857,6 +870,7 @@ class DruidDatasourceModelView(CaravelModelView, DeleteMixin): # noqa
857870
"Supports <a href='"
858871
"https://daringfireball.net/projects/markdown/'>markdown</a>"),
859872
}
873+
base_filters = [['id', FilterDruidDatasource, lambda: []]]
860874
label_columns = {
861875
'datasource_link': _("Data Source"),
862876
'cluster': _("Cluster"),

Diff for: tests/core_tests.py

+28
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,34 @@ def test_druid_sync_from_config(self):
280280
["longSum", "sum", "unique"])
281281
assert resp.status_code == 201
282282

283+
def test_filter_druid_datasource(self):
284+
gamma_ds = DruidDatasource(
285+
datasource_name="datasource_for_gamma",
286+
)
287+
db.session.add(gamma_ds)
288+
no_gamma_ds = DruidDatasource(
289+
datasource_name="datasource_not_for_gamma",
290+
)
291+
db.session.add(no_gamma_ds)
292+
db.session.commit()
293+
utils.merge_perm(sm, 'datasource_access', gamma_ds.perm)
294+
utils.merge_perm(sm, 'datasource_access', no_gamma_ds.perm)
295+
db.session.commit()
296+
297+
gamma_ds_permission_view = (
298+
db.session.query(ab_models.PermissionView)
299+
.join(ab_models.ViewMenu)
300+
.filter(ab_models.ViewMenu.name == gamma_ds.perm)
301+
.first()
302+
)
303+
sm.add_permission_role(sm.find_role('Gamma'), gamma_ds_permission_view)
304+
305+
self.login(username='gamma')
306+
url = '/druiddatasourcemodelview/list/'
307+
resp = self.client.get(url, follow_redirects=True)
308+
assert 'datasource_for_gamma' in resp.data.decode('utf-8')
309+
assert 'datasource_not_for_gamma' not in resp.data.decode('utf-8')
310+
283311
def test_gamma(self):
284312
self.login(username='gamma')
285313
resp = self.client.get('/slicemodelview/list/')

0 commit comments

Comments
 (0)