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

Odoo V14记录规则限制Chatter留言问题求助

Odoo V14:解决Chatter留言被记录规则阻止的问题

问题分析

你当前的记录规则限制了group_tg_data_prd_report组的用户仅能在tg_quart记录处于draft状态时执行写入操作,但Chatter留言需要更新记录的消息关联字段(如message_ids),非draft状态下的写入权限被规则拦截,导致无法留言。

同时原记录规则的perm_read=False设置存在逻辑矛盾:用户需要先读取记录才能执行写入或留言操作,该规则会阻止用户查看draft状态的记录,需先修正。

解决方案

我们需要分两步处理:确保用户能查看所有状态的记录,同时允许用户在非draft状态下仅能执行留言操作(限制修改其他字段)。

1. 修正记录规则的读取权限

添加一条记录规则,允许目标组用户读取所有状态的tg_quart记录:

<record id="exploitation_rule_read_all_tg_quart" model="ir.rule">
    <field name="name">允许读取所有状态的tg_quart记录</field>
    <field name="model_id" ref="model_tg_quart"/>
    <field name="domain_force">[()]</field>
    <field name="groups" eval="[(4, ref ('exploitation.group_tg_data_prd_report'))]"/>
    <field name="perm_read" eval="True"/>
    <field name="perm_write" eval="False"/>
    <field name="perm_create" eval="False"/>
    <field name="perm_unlink" eval="False"/>
</record>

2. 允许非draft状态下的留言操作(限制其他字段修改)

保留原有的draft状态写入规则,新增一条允许非draft状态写入的规则,同时通过模型的write方法拦截非消息字段的修改:

2.1 添加非draft状态写入规则

<record id="exploitation_rule_write_tg_quart_message" model="ir.rule">
    <field name="name">允许在非draft状态下添加留言</field>
    <field name="model_id" ref="model_tg_quart"/>
    <field name="domain_force">[('state', '!=', 'draft')]</field>
    <field name="groups" eval="[(4, ref ('exploitation.group_tg_data_prd_report'))]"/>
    <field name="perm_write" eval="True"/>
    <field name="perm_read" eval="False"/>
    <field name="perm_create" eval="False"/>
    <field name="perm_unlink" eval="False"/>
</record>

2.2 重写模型的write方法限制字段修改

在tg_quart模型的Python文件中添加以下代码,拦截非消息字段的修改:

from odoo import models, fields, api, exceptions

class TGQuart(models.Model):
    _inherit = 'tg_quart'  # 或直接定义模型,根据你的现有代码调整

    @api.multi
    def write(self, vals):
        target_group = self.env.ref('exploitation.group_tg_data_prd_report')
        if target_group in self.env.user.groups_id:
            for record in self:
                if record.state != 'draft':
                    # 仅允许修改Chatter相关字段
                    allowed_fields = ['message_ids', 'last_message_id', 'message_unread', 'message_has_error', 'message_has_error_counter']
                    invalid_fields = [field for field in vals if field not in allowed_fields]
                    if invalid_fields:
                        raise exceptions.UserError("仅允许在非草稿状态下添加留言,无法修改其他字段。")
        return super(TGQuart, self).write(vals)

3. 验证效果

更新模块后,测试目标组用户:

  • 可以查看所有状态的tg_quart记录
  • 仅能在draft状态下修改业务字段
  • 在非draft状态下仅能在Chatter区域留言,无法修改其他字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:43:13