Odoo 15项目权限规则配置:访问含自有任务项目报错
Odoo项目权限规则问题解决办法
问题背景
需要为project.project模型创建全局权限规则,要求用户仅能查看两类项目:
- 自己负责的项目(
user_id等于当前用户ID) - 包含自己任务的项目(任务的
user_ids包含当前用户ID)
单独使用“查看自身负责项目”的规则时功能正常,但添加“查看含自有任务项目”的规则后,部分用户(如Marc Demo)访问项目菜单或表单时出现权限错误。排查发现移除视图中的message_follower_ids和activity_ids字段后可正常访问,但需要保留这两个字段。
原规则代码:
<record model="ir.rule" id="project_project_all_rule"> <field name="name">Project: global rule: see own projects and projects with own tasks</field> <field name="model_id" ref="project.model_project_project"/> <field name="domain_force">[ '|', ('user_id', '=', user.id), ('task_ids.user_ids', 'in', [user.id]), ]</field> </record>
问题原因
直接使用('task_ids.user_ids', 'in', [user.id])的关联查询时,Odoo会连带检查关联字段的权限。message_follower_ids(对应mail.follower模型)和activity_ids(对应mail.activity模型)的默认权限规则未覆盖“用户通过任务关联访问项目”的场景,导致加载这两个字段时触发权限校验失败。
解决方案
有两种可行方案,可根据实际场景选择:
方案1:优化项目权限规则的查询逻辑
将直接关联任务的查询改为子查询方式,先获取用户有任务的项目ID列表,再用该列表过滤项目,避免深层关联触发的权限检查。
修改后的规则代码:
<record model="ir.rule" id="project_project_all_rule"> <field name="name">Project: global rule: see own projects and projects with own tasks</field> <field name="model_id" ref="project.model_project_project"/> <field name="domain_force">[ '|', ('user_id', '=', user.id), ('id', 'in', env['project.task'].search([('user_ids', '=', user.id)]).mapped('project_id').ids), ]</field> </record>
方案2:为关联模型添加权限规则
给mail.follower和mail.activity添加对应权限规则,允许用户查看关联到自身有权限项目的记录。
1. 为mail.follower添加规则
<record model="ir.rule" id="mail_follower_project_rule"> <field name="name">Mail Follower: see followers of accessible projects</field> <field name="model_id" ref="mail.model_mail_follower"/> <field name="domain_force">[ ('res_model', '=', 'project.project'), ('res_id', 'in', env['project.project'].search([ '|', ('user_id', '=', user.id), ('id', 'in', env['project.task'].search([('user_ids', '=', user.id)]).mapped('project_id').ids) ]).ids) ]</field> </record>
2. 为mail.activity添加规则
<record model="ir.rule" id="mail_activity_project_rule"> <field name="name">Mail Activity: see activities of accessible projects</field> <field name="model_id" ref="mail.model_mail_activity"/> <field name="domain_force">[ ('res_model', '=', 'project.project'), ('res_id', 'in', env['project.project'].search([ '|', ('user_id', '=', user.id), ('id', 'in', env['project.task'].search([('user_ids', '=', user.id)]).mapped('project_id').ids) ]).ids) ]</field> </record>
说明
方案1更简洁,通过调整项目规则的查询逻辑避免关联权限问题;方案2则是补全关联模型的权限覆盖范围,适合需要精细控制关注者和活动权限的场景。两种方案均可解决保留message_follower_ids和activity_ids字段时的权限报错问题。
内容的提问来源于stack exchange,提问作者forvas
相关产品推荐
相关产品推荐

