You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:48:27