Odoo 16如何为特定用户展示指定审批类型的审批看板
在Odoo 16中实现审批类型的用户级可见权限
这个需求完全可以通过系统设置或自定义编码两种方式实现,具体方案如下:
一、无需编码:通过权限组+记录规则实现
Odoo自带的权限体系足够实现这类精细化的可见控制,步骤如下:
标记跨审批类型
先确保审批类型(approval.category模型)有区分“跨审批类型”的标识,比如新增布尔字段is_cross_approval,用来标记哪些属于跨审批类型。创建专属权限组
进入设置 > 用户与公司 > 权限组,新建两个组:- 组1:
仅可见内部审批类型,关联approval.category模型的对应权限(只读/读写按需选择) - 组2:
可见全部审批类型,关联approval.category模型的完整权限
- 组1:
添加限制型记录规则
进入设置 > 用户与公司 > 记录规则,针对approval.category模型创建规则:- 规则名称:
隐藏跨审批类型 - 应用到组:选择
仅可见内部审批类型 - 域:
[('is_cross_approval', '=', False)](过滤掉标记为跨审批的类型) - 权限:勾选
读取(确保该组用户只能看到符合条件的记录)
- 规则名称:
分配用户权限
- 将用户A添加到
仅可见内部审批类型组,同时移除该用户在可见全部审批类型组的权限(如有) - 将用户B添加到
可见全部审批类型组,确保该用户不受上述限制规则影响
- 将用户A添加到
二、自定义编码:适配复杂逻辑场景
如果跨审批类型的判断逻辑复杂(比如基于用户部门、审批流程关联等动态条件),可以通过编码实现更灵活的控制:
方案1:动态过滤读取域
from odoo import models, api class ApprovalCategory(models.Model): _inherit = 'approval.category' @api.model def _get_domain_for_read(self): domain = super()._get_domain_for_read() # 替换为用户A的实际ID或登录名判断 if self.env.user.id == 10: domain += [('is_cross_approval', '=', False)] return domain
方案2:重写搜索方法
from odoo import models, api class ApprovalCategory(models.Model): _inherit = 'approval.category' @api.model def search(self, args, offset=0, limit=None, order=None, count=False): if self.env.user.login == 'user_a': args += [('is_cross_approval', '=', False)] return super().search(args, offset=offset, limit=limit, order=order, count=count)
方案3:视图层面动态过滤
<record id="view_approval_category_tree_custom" model="ir.ui.view"> <field name="name">approval.category.tree.custom</field> <field name="model">approval.category</field> <field name="inherit_id" ref="approval.view_approval_category_tree"/> <field name="arch" type="xml"> <xpath expr="//tree" position="attributes"> <attribute name="domain">[('is_cross_approval', '=', False) if user.id == 10 else []]</attribute> </xpath> </field> </record>
系统设置方案更易维护,适合逻辑固定的场景;编码方案灵活性更高,可应对复杂的动态判断需求。
内容的提问来源于stack exchange,提问作者Krakalien
相关产品推荐
相关产品推荐

