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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:45:19