Odoo16:自定义模型创建已完成活动记录的技术方案咨询
实现已完成日程活动的留存与后续日程生成
一、基础实现方案
1. 自定义留存记录模型
首先创建mail_activity_done模型,用于存储已完成活动的关键数据:
from odoo import models, fields class MailActivityDone(models.Model): _name = 'mail.activity_done' _description = 'Completed Mail Activity Archive' ma_id = fields.Integer(string='Original Activity ID') ma_res_id = fields.Integer(string='Related Record ID') ma_res_model = fields.Char(string='Related Model') ma_summary = fields.Char(string='Activity Summary') ma_write_date = fields.Datetime(string='Completion Date')
2. 重写活动完成方法
继承mail.activity模型,在标记完成的方法中插入留存记录的创建逻辑:
from odoo import models, api class MailActivity(models.Model): _inherit = 'mail.activity' @api.multi def action_done(self): # 先创建留存记录再执行原逻辑 self._archive_done_activity() return super(MailActivity, self).action_done() @api.multi def action_done_schedule_next(self): self._archive_done_activity() return super(MailActivity, self).action_done_schedule_next() def _archive_done_activity(self): """封装留存逻辑,避免代码重复""" for activity in self: self.env['mail.activity_done'].create({ 'ma_id': activity.id, 'ma_res_id': activity.res_id, 'ma_res_model': activity.res_model, 'ma_summary': activity.summary, 'ma_write_date': activity.write_date, })
二、优化实现建议
改用删除事件触发留存:Odoo标记活动完成后会执行删除操作,直接监听
unlink方法可以覆盖所有完成场景(包括批量操作),避免因官方方法逻辑变更导致的兼容问题:@api.multi def unlink(self): # 仅留存状态为已完成的活动记录 done_activities = self.filtered(lambda act: act.state == 'done') if done_activities: done_activities._archive_done_activity() return super(MailActivity, self).unlink()添加数据库索引:针对后续查询频繁的字段添加索引,提升关联查询效率:
ma_res_id = fields.Integer(string='Related Record ID', index=True) ma_res_model = fields.Char(string='Related Model', index=True)整合后续日程生成逻辑:在留存记录的同时直接触发下一个默认日程的创建,减少后续单独查询的成本:
def _archive_done_activity(self): for activity in self: # 创建留存记录 self.env['mail.activity_done'].create({ 'ma_id': activity.id, 'ma_res_id': activity.res_id, 'ma_res_model': activity.res_model, 'ma_summary': activity.summary, 'ma_write_date': activity.write_date, }) # 生成默认后续日程 related_record = self.env[activity.res_model].browse(activity.res_id) related_record.activity_schedule( activity_type_id=activity.activity_type_id.id, summary=f"Follow-up: {activity.summary}", date_deadline=fields.Date.today() + relativedelta(days=7) # 示例:7天后跟进 )添加异常处理:避免留存记录创建失败导致原完成操作中断,同时记录错误日志:
def _archive_done_activity(self): for activity in self: try: self.env['mail.activity_done'].create({ 'ma_id': activity.id, 'ma_res_id': activity.res_id, 'ma_res_model': activity.res_model, 'ma_summary': activity.summary, 'ma_write_date': activity.write_date, }) except Exception as e: self.env['ir.logging'].create({ 'name': 'mail_activity_archive', 'type': 'server', 'message': f"Failed to archive activity {activity.id}: {str(e)}", 'level': 'error', })配置权限控制:给
mail_activity_done模型添加对应权限组,限制仅授权用户可查看或管理留存记录,保障数据安全。
内容的提问来源于stack exchange,提问作者Ahmed Haroon
相关产品推荐
相关产品推荐

