Odoo多公司场景下按用户授权公司过滤联系人记录实现方法
Odoo联系人模块按用户授权公司过滤数据的实现方案
原有规则的问题
你之前写的记录规则存在3个核心问题,导致过滤逻辑不生效:
- 域逻辑完全错误:你配置的
domain_force为['|',('company_id','!=', False),('company_id','=', user.company_id.id)],该逻辑的含义是「联系人有归属公司,或者联系人归属公司等于用户当前主公司」,第一个条件会把所有绑定了任意公司的联系人全部放行,完全起不到按权限过滤的作用。 - 多公司取值错误:
user.company_id.id仅取用户当前切换选中的单个主公司,不会读取用户被授权可访问的全部公司列表,无法满足多公司同时授权的需求。 - 配置存在笔误+权限设置不合理:代码里的模块名
mymdule存在拼写错误,升级时会报外部ID找不到的错误;默认将写、新建、删除权限全部设为False,会导致组内用户无法对可见范围内的联系人做常规操作,除非业务明确要求该组用户只有只读权限,否则不需要这么配置。
正确实现代码
Odoo的用户模型原生提供了user.company_ids字段,存储当前用户被授权访问的所有公司列表,直接用该字段做过滤即可,不需要额外开发自定义逻辑。修正后的记录规则代码如下:
<record id="rule_custom_user_contacts" model="ir.rule"> <field name="name">Custom User Contact Access Rule</field> <field name="model_id" ref="base.model_res_partner" /> <field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'in', user.company_ids.ids)]</field> <field name="perm_read" eval="True" /> <field name="perm_write" eval="True" /> <field name="perm_create" eval="True" /> <field name="perm_unlink" eval="True" /> <field name="groups" eval="[(4, ref('mymodule.group_custom_user'))]" /> </record>
配置说明
- 上述域逻辑的含义是:用户可见无归属公司的公共联系人,以及归属公司在自己授权访问公司列表内的联系人。如果业务不需要展示公共联系人,直接将
domain_force修改为[('company_id', 'in', user.company_ids.ids)]即可。 - 四个权限开关(perm_read/perm_write/perm_create/perm_unlink)可以根据实际业务需求调整,如果该自定义用户组仅需要查看联系人权限,再将写、新建、删除的权限值改为False即可。
- 代码里的
mymodule.group_custom_user请替换为你实际自定义模块的技术名和用户组外部ID,避免拼写错误。
验证方式
模块升级完成后,用测试账号登录做校验:
- 给测试账号分配A、B两家公司的访问权限,登录后确认联系人列表仅展示这两家公司归属的联系人、以及配置允许展示的公共联系人。
- 给测试账号新增C公司的访问权限,刷新页面后C公司归属的联系人会自动展示;移除某公司权限后,对应公司的联系人会自动从列表隐藏,不需要额外开发。
内容的提问来源于stack exchange,提问作者Kai Ning
相关产品推荐
相关产品推荐

