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

查找project.task置为completed时创建rating.rating记录的方法及扩展需求

问题分析与解决方案

一、定位rating记录的创建逻辑

Odoo中project.task改为completed时自动创建rating.rating记录,按以下优先级排查触发源:

  1. 自动化动作(Automated Action)
    进入「设置 > 技术 > 自动化 > 自动化动作」,搜索project.task相关动作,查看是否存在当state变为completed时调用创建rating的规则。标准模块常通过这种无代码方式触发关联操作。
  2. 模型代码钩子
    检查project模块下的task模型(路径:project/models/project_task.py),查找state字段的write方法扩展或onchange逻辑,示例可能存在的代码结构:
    def write(self, vals):
        res = super(ProjectTask, self).write(vals)
        if 'state' in vals and vals['state'] == 'completed':
            # 此处可能存在创建rating的逻辑
            self.env['rating.rating'].create(...)
        return res
    
    若未找到,再查看rating模块是否通过继承扩展了project.task的方法,比如rating/models/rating_project.py这类文件。
  3. 调试追踪
    开启Odoo调试模式,在rating.rating的create方法中添加日志或断点,修改任务状态时即可查看调用栈定位触发源:
    # 在rating/models/rating.py的create方法中临时添加日志
    def create(self, vals):
        import logging
        _logger = logging.getLogger(__name__)
        _logger.info("Rating created by call stack: %s", self.env.context)
        # 或用pdb断点调试
        import pdb; pdb.set_trace()
        return super(Rating, self).create(vals)
    

二、修复无法获取rating记录的问题

你当前的搜索代码缺少res_model条件,rating.rating的res_id是对应模型的ID,但必须指定res_model='project.task'才能准确匹配任务对应的评分记录,修改后的代码:

rating_rec = self.env["rating.rating"].sudo().search(
    [
        ('partner_id', '=', self.partner_id.id),
        ('res_id', '=', self.id),
        ('res_model', '=', 'project.task')  # 必须添加该条件
    ], 
    order='id desc', 
    limit=1
)

若仍无法获取,可能是创建动作异步执行(如使用了延迟任务),此时需等待异步任务完成,或通过监听rating.rating的创建事件触发逻辑。

三、在rating记录创建后添加自定义功能

最可靠的方式是继承rating.rating的create方法,在记录创建后执行自定义逻辑,同时过滤出project.task相关的评分:

from odoo import models, api

class RatingRating(models.Model):
    _inherit = 'rating.rating'

    @api.model
    def create(self, vals):
        rating = super(RatingRating, self).create(vals)
        # 仅处理project.task对应的评分记录
        if rating.res_model == 'project.task':
            task = self.env['project.task'].browse(rating.res_id)
            if task.state == 'completed':
                # 此处添加你的自定义功能代码
                print(f"任务{task.name}的评分记录已创建,执行自定义逻辑")
        return rating

也可使用自动化动作:在「设置 > 技术 > 自动化 > 自动化动作」中新建动作,触发条件设为rating.rating创建,过滤条件为res_model = project.task,随后在动作中执行自定义逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:57:20