您的位置:首页 > 其它

caravel 控制某角色只能看到自己的表

2016-11-05 11:03 429 查看
背景:

      每个用户应该只能看到自己有权限的表,但是我拿到这个版本的时候 caravel还没做限制,即用户可以看到所有表。

     然后我就用自己的方法 限制了,如下:

    #views.py

class FilterTables(CaravelFilter):
def apply(self, query, func): # noqa
if any([r.name in ('Admin', 'Alpha') for r in get_user_roles()]):
return query
sql="""
select * from ab_view_menu where id in
(select view_menu_id from ab_permission_view where id in
(select permission_view_id from ab_permission_view_role where role_id=5)
and permission_id=31
)
"""
logging.info(sql)
result=db.session.execute(sql)
idsinfo=result.fetchall()
ids=[]
for item in idsinfo:
ids.append(item[1].split(':')[1].split(')')[0])
qry = query.filter(self.model.id.in_(ids))
return qry
增加了一个内部类之后,调用:

#views TableModelView 代码段中调用
base_filters = [['id', FilterTables, lambda: []]]
#post_add(self, table)函数前

当当当当,完毕。

回到GitHub上看了一眼,呀,版本升级,已经实现了呀。

看了下代码,人家风格更统一呢,

你看人家是这样写的:

#views.py

class TableSlice(CaravelFilter):
def apply(self, query, func): # noqa
if any([r.name in ('Admin', 'Alpha') for r in get_user_roles()]):
return query
perms = self.get_perms()
tables = []
for perm in perms:
match = re.search(r'\(id:(\d+)\)', perm)
tables.append(match.group(1))
qry = query.filter(self.model.id.in_(tables))
return qry

#views.py 调用
base_filters = [['id', TableSlice, lambda: []]]

都可以哦~ 你可以自己看情况来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: