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

