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

如何让Odoo15中「仅查看自有文档」安全组仅查看自有联系人?

需求
  • 给安全组「User: Own Documents Only」(标识sales_team.group_sale_salesman)的用户设置仅查看自有联系人,即res.partner模型中user_id匹配当前用户ID的记录
  • 额外允许用户查看:自身关联的联系人、OdooBot、所属公司关联的联系人
问题分析
  • 添加域[('user_id', '=', user.id)]的res.partner新规则无效:用户同时属于base.group_user,该组的base.res_partner_rule_private_employee规则允许查看所有非私密(type != 'private')或无类型(type = False)的联系人,Odoo中不同组的规则为OR关系,导致用户仍能看到所有非私密联系人
  • 修改base.res_partner_rule_private_employee的域为[('user_id', '=', user.id), '|', ('type', '!=', 'private'), ('type', '=', False)]后,登录出现res.users模型访问权限错误
  • 创建rule_own_users规则后,仍出现相同权限错误且指向该规则:
<record id="rule_own_users" model="ir.rule">
    <field name="name">res.users.own.users</field>
    <field name="model_id" ref="base.model_res_users"/>
    <field name="domain_force">
        ['|', ('id', '=', user.id), ('partner_id.user_id', '=', user.id)]
    </field>
    <field name="groups" eval="[
        Command.link(ref('base.group_user')),
    ]"/>
    <field name="perm_read" eval="True"/>
    <field name="perm_write" eval="True"/>
    <field name="perm_create" eval="True"/>
    <field name="perm_unlink" eval="True"/>
</record>
解决方案

步骤1:移除销售组对base宽松联系人规则的继承

通过继承修改base模块的规则,让base.res_partner_rule_private_employee不再对sales_team.group_sale_salesman组用户生效:

<record id="base.res_partner_rule_private_employee" model="ir.rule">
    <field name="groups" eval="[
        Command.link(ref('base.group_user')),
        Command.unlink(ref('sales_team.group_sale_salesman')),
    ]"/>
</record>

步骤2:添加销售组专属的res.partner规则

创建包含所需访问范围的规则,覆盖自有联系人、自身、OdooBot、同公司联系人:

<record id="res_partner_rule_salesman_own" model="ir.rule">
    <field name="name">Salesman Own Contacts</field>
    <field name="model_id" ref="base.model_res_partner"/>
    <field name="domain_force">
        [
            '|', '|', '|',
            ('user_id', '=', user.id),  <!-- 自有联系人 -->
            ('id', '=', user.partner_id.id),  <!-- 自身关联的联系人 -->
            ('id', '=', ref('base.partner_root')),  <!-- OdooBot的联系人 -->
            ('company_id', '=', user.company_id.id)  <!-- 所属公司关联的联系人 -->
        ]
    </field>
    <field name="groups" eval="[Command.link(ref('sales_team.group_sale_salesman'))]"/>
    <field name="perm_read" eval="True"/>
    <field name="perm_write" eval="True"/>
    <field name="perm_create" eval="True"/>
    <field name="perm_unlink" eval="False"/>
</record>

步骤3:修复res.users的权限规则

创建销售组专属的res.users规则,确保用户能访问必要的用户记录,避免登录错误:

<record id="res_users_rule_salesman_own" model="ir.rule">
    <field name="name">Salesman Own Users</field>
    <field name="model_id" ref="base.model_res_users"/>
    <field name="domain_force">
        [
            '|', '|',
            ('id', '=', user.id),  <!-- 自身用户记录 -->
            ('id', '=', ref('base.user_root')),  <!-- OdooBot用户 -->
            ('company_id', '=', user.company_id.id)  <!-- 同公司用户 -->
        ]
    </field>
    <field name="groups" eval="[Command.link(ref('sales_team.group_sale_salesman'))]"/>
    <field name="perm_read" eval="True"/>
    <field name="perm_write" eval="True"/>
    <field name="perm_create" eval="False"/>
    <field name="perm_unlink" eval="False"/>
</record>

关键说明

  • Odoo中用户的访问权限是所属所有组规则的OR集合,因此需要移除销售组对base组宽松规则的继承,确保仅应用专属规则
  • base.partner_root和base.user_root是OdooBot对应的联系人和用户内置ID,若环境中ID不同需自行调整
  • 权限规则的perm_*字段可根据实际业务需求调整(如是否允许删除联系人)

内容的提问来源于stack exchange,提问作者forvas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:05:24