查找project.task置为completed时创建rating.rating记录的方法及扩展需求
问题分析与解决方案
一、定位rating记录的创建逻辑
Odoo中project.task改为completed时自动创建rating.rating记录,按以下优先级排查触发源:
- 自动化动作(Automated Action)
进入「设置 > 技术 > 自动化 > 自动化动作」,搜索project.task相关动作,查看是否存在当state变为completed时调用创建rating的规则。标准模块常通过这种无代码方式触发关联操作。 - 模型代码钩子
检查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 resrating模块是否通过继承扩展了project.task的方法,比如rating/models/rating_project.py这类文件。 - 调试追踪
开启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
相关产品推荐
相关产品推荐

