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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:57:40