Odoo中为项目经理设置供应商账单只读权限的问题排查
我在Odoo中开发了一个发票模块,允许项目经理审批或拒绝发票。尝试为项目经理组创建新的访问权限和记录规则,要求:
- 项目经理登录后表单视图字段为只读(不可编辑)
- 仍可访问“awaiting_approval”状态的账单页面并操作按钮
配置的记录规则代码如下:
<record id="record_rule_project_manager_readonly" model="ir.rule"> <field name="name">Project Manager Readonly</field> <field name="model_id" ref="model_vendor_bill"/> <field name="groups" eval="[(4, ref('group_project_manager'))]"/> <field name="perm_read" eval="1"/> <field name="perm_write" eval="0"/> <field name="perm_create" eval="0"/> <field name="perm_unlink" eval="0"/> <field name="domain_force">[('state', '!=', 'awaiting_approval')]</field> </record>
但以项目经理身份登录后无法访问页面,报错:
Due to security restrictions, you are not allowed to access 'Vendor Bill' (vendor.bill) records. Records: vendor.bill,2 (id=2) User: Boris Veselov (id=41) This restriction is due to the following rules: - Project Manager Readonly Contact your administrator to request access if necessary.
我知道可以为每个字段添加attrs="{'readonly': [('state', '=', 'awaiting_approval')]}"属性,但想了解针对特定用户组实现该需求的正确方法。
正确实现方法
1. 修复记录规则逻辑
当前记录规则的domain_force限制了项目经理只能访问非awaiting_approval状态的账单,这和需求完全相反。需要拆分两条规则实现权限控制:
- 第一条:允许项目经理读取所有状态的账单(确保页面可访问)
- 第二条:仅允许项目经理对
awaiting_approval状态的账单执行写操作(用于触发审批/拒绝按钮)
示例代码:
<!-- 允许项目经理读取所有供应商账单 --> <record id="record_rule_project_manager_read_all" model="ir.rule"> <field name="name">Project Manager Read All Vendor Bills</field> <field name="model_id" ref="model_vendor_bill"/> <field name="groups" eval="[(4, ref('group_project_manager'))]"/> <field name="perm_read" eval="1"/> <field name="perm_write" eval="0"/> <field name="perm_create" eval="0"/> <field name="perm_unlink" eval="0"/> <field name="domain_force">[(1, '=', 1)]</field> </record> <!-- 允许项目经理对待审批账单执行写操作 --> <record id="record_rule_project_manager_write_approval" model="ir.rule"> <field name="name">Project Manager Write on Awaiting Approval Bills</field> <field name="model_id" ref="model_vendor_bill"/> <field name="groups" eval="[(4, ref('group_project_manager'))]"/> <field name="perm_read" eval="1"/> <field name="perm_write" eval="1"/> <field name="perm_create" eval="0"/> <field name="perm_unlink" eval="0"/> <field name="domain_force">[('state', '=', 'awaiting_approval')]</field> </record>
2. 视图层面控制字段只读
在表单视图中针对项目经理组设置字段只读,同时保留审批/拒绝按钮的可操作性:
<!-- 针对项目经理组设置字段只读 --> <field name="amount_total" readonly="1" groups="your_module.group_project_manager"/> <field name="partner_id" readonly="1" groups="your_module.group_project_manager"/> <!-- 或者结合状态和用户组的灵活判断 --> <field name="invoice_date" attrs="{'readonly': [('state', '=', 'awaiting_approval'), ('user_has_group', 'your_module.group_project_manager')]}"/> <!-- 确保审批按钮仅对项目经理可见且可操作 --> <button name="action_approve" string="Approve" states="awaiting_approval" groups="your_module.group_project_manager"/> <button name="action_reject" string="Reject" states="awaiting_approval" groups="your_module.group_project_manager"/>
3. 检查基础访问权限
确保项目经理组已通过ir.model.access配置获得vendor.bill模型的读权限,记录规则是在基础权限之上的细分限制,没有基础读权限的话,记录规则无法生效。
内容的提问来源于stack exchange,提问作者Boris Veselov

