如何让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
相关产品推荐
相关产品推荐

