Odoo按字段值与用户组条件控制按钮可见性实现方法
Odoo 按采购类型+用户组控制审批按钮可见性方案
实现逻辑说明
Odoo原生按钮的groups属性只能做粗粒度的组权限控制,无法同时叠加字段值判断,因此需要通过计算字段控制前端可见性+后端逻辑兜底校验的方式实现需求。
具体操作步骤
1. 模型层新增可见性计算字段
在对应Python模型中新增布尔型计算字段,统一判断按钮显示的两个必要条件:
- 单据
purchase_type字段值为import - 当前登录用户属于
ts_addons_tbk.group_tbk_director或ts_addons_tbk.group_tbk_exim组
示例代码(替换模型名为你实际使用的业务模型即可):
from odoo import models, fields, api, _ from odoo.exceptions import UserError class YourPurchaseModel(models.Model): _inherit = 'your.purchase.model' # 替换为实际模型名,如purchase.order # 原有字段保留 purchase_type = fields.Selection([ ('import', 'Import'), ('local', 'Local'), ], string='Purchase Type') # 新增按钮可见性控制字段 approve_btn_visible = fields.Boolean( compute='_compute_approve_btn_visible', store=False ) @api.depends('purchase_type') def _compute_approve_btn_visible(self): for rec in self: # 判断用户是否在允许的组内 is_allowed_user = self.env.user.has_group('ts_addons_tbk.group_tbk_director') \ or self.env.user.has_group('ts_addons_tbk.group_tbk_exim') # 两个条件同时满足才可见 rec.approve_btn_visible = rec.purchase_type == 'import' and is_allowed_user
2. 修改表单视图按钮定义
移除按钮原有groups属性(避免manager组无限制看到按钮),新增invisible属性绑定计算字段,保留原有states状态限制:
<button name="action_approve" string="Approve" type="object" states="confirm" invisible="not approve_btn_visible" />
3. 新增后端权限兜底校验
前端隐藏仅为界面展示控制,必须在按钮对应的后端方法中增加权限校验,防止用户通过RPC接口越权调用:
def action_approve(self): for rec in self: is_allowed_user = self.env.user.has_group('ts_addons_tbk.group_tbk_director') \ or self.env.user.has_group('ts_addons_tbk.group_tbk_exim') if rec.purchase_type == 'import' and not is_allowed_user: raise UserError(_('您无权审批进口类型采购单据')) # 原有审批逻辑保留 return super().action_approve()
注意事项
- 禁止直接在按钮
invisible属性中写用户组判断逻辑,Odoo视图域表达式不支持直接解析当前用户的组关联关系,通过计算字段实现兼容性、可维护性最高 - 原按钮上的
groups属性必须删除,否则配置的group_tbk_manager组用户会无视采购类型限制看到按钮 - 不要省略后端校验步骤,所有前端可见性控制都可以被技术手段绕过,后端校验是权限安全的唯一可靠兜底
内容的提问来源于stack exchange,提问作者Nur Faiz
相关产品推荐
相关产品推荐

