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

来源:互联网 发布:纵向科研经费知乎 编辑:程序博客网 时间:2024/05/16 08:59

背景:

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

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

    

#views.pyclass 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.pyclass 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: []]]



都可以哦~ 你可以自己看情况来。

0 0
原创粉丝点击