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

Odoo自定义用户无tracking_value_ids访问权限问题求助

问题描述

我自行开发了一个Odoo应用并配置了自定义用户组,相关XML配置如下:

<odoo>
    <!-- Module -->
    <record model="ir.module.category" id="inw">
        <field name="name">INW Portal App</field>
    </record>

    <record model="ir.module.category" id="inw_asset">
        <field name="name">INW Asset</field>
        <field name="parent_id" ref="inw"></field>
    </record>

    <!-- Groups -->
    <record id="asset_user" model="res.groups">
        <field name="name">Asset User</field>
        <field name="category_id" ref="inw_asset" />
        <field name="implied_ids" eval="[(4, ref('base.group_user'))]" />
    </record>

    <record id="asset_maintainer" model="res.groups">
        <field name="name">Asset Maintainer</field>
        <field name="category_id" ref="inw_asset" />
        <field name="implied_ids" eval="[(4, ref('asset_user'))]" />
    </record>

    <record id="asset_administrator" model="res.groups">
        <field name="name">Asset Administrator</field>
        <field name="category_id" ref="inw_asset" />
        <field name="implied_ids" eval="[(4, ref('asset_maintainer'))]" />
    </record>
</odoo>

所有自定义用户都遇到权限错误:Do not have enough right to access "tracking_value_ids" on Message (mail.message)。我试过复制Administration/Settings的记录规则、手动添加字段访问权限,但错误依然存在。只有让用户继承Administration/Settings权限才能消除错误,但这个组包含太多敏感权限,不想开放给普通用户。

错误触发自以下Python计算方法:

@api.depends('owner_id')
def _compute_status(self):
    for record in self:
        tracking_ids = record.message_ids.tracking_value_ids
        record.owner_history = tracking_ids

我需要向维护人员展示资产的所有权历史,对应的视图配置:

<field name="owner_history">
    <list>
        <field name="create_date" string="Date" />
        <field name="new_value_char" string="New Owner" />
    </list>
</field>
解决方案

方向一:调整权限配置

1. 给自定义组添加mail.tracking.value的读权限

tracking_value_ids是mail.message关联到mail.tracking.value的字段,首先需要让用户拥有读取跟踪值的权限。在模块的XML中添加以下配置:

<!-- 给Asset User组添加mail.tracking.value的读权限 -->
<record id="access_mail_tracking_value_asset_user" model="ir.model.access">
    <field name="name">mail.tracking.value.asset.user</field>
    <field name="model_id" ref="mail.model_mail_tracking_value"/>
    <field name="group_id" ref="asset_user"/>
    <field name="perm_read" eval="1"/>
    <field name="perm_write" eval="0"/>
    <field name="perm_create" eval="0"/>
    <field name="perm_unlink" eval="0"/>
</record>

2. 为mail.message添加针对性记录规则

默认的mail.message权限控制比较严格,需要创建一条规则,让自定义组能读取关联到他们有权限访问的资产的消息。添加以下XML配置:

<!-- 允许资产用户读取关联到资产的消息 -->
<record id="rule_mail_message_asset" model="ir.rule">
    <field name="name">Mail Message: Asset Access</field>
    <field name="model_id" ref="mail.model_mail_message"/>
    <field name="group_id" ref="asset_user"/>
    <field name="domain_force">[
        ('model', '=', 'your.asset.model.name'),  <!-- 替换成你的资产模型名称 -->
        ('res_id', 'in', user.env['your.asset.model.name'].search([]).ids)
    ]</field>
    <field name="perm_read" eval="1"/>
    <field name="perm_write" eval="0"/>
    <field name="perm_create" eval="0"/>
    <field name="perm_unlink" eval="0"/>
</record>

注意替换your.asset.model.name为你实际的资产模型名称(比如inw.asset)。

方向二:优化代码逻辑(更安全且精准)

如果不想调整全局的消息权限,可以直接在计算方法中通过sudo()或者精准查询来获取跟踪值,避免触发用户权限检查。

方法1:使用sudo读取跟踪值(简单直接)

修改计算方法,临时提升权限读取跟踪值,同时过滤出仅所有权变更的记录:

@api.depends('owner_id')
def _compute_status(self):
    for record in self:
        # 使用sudo绕过权限检查,只过滤owner_id的变更记录
        tracking_ids = record.message_ids.sudo().tracking_value_ids.filtered(
            lambda tv: tv.field == 'owner_id'
        )
        record.owner_history = tracking_ids

方法2:直接查询mail.tracking.value(更可控)

直接查询跟踪值模型,精准过滤出当前资产的所有权变更记录:

@api.depends('owner_id')
def _compute_status(self):
    TrackingValue = self.env['mail.tracking.value'].sudo()
    for record in self:
        tracking_ids = TrackingValue.search([
            ('mail_message_id.res_id', '=', record.id),
            ('mail_message_id.model', '=', self._name),
            ('field', '=', 'owner_id')
        ])
        record.owner_history = tracking_ids

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:07:06