summaryrefslogtreecommitdiff
path: root/addons/mail/wizard/mail_resend_message.py
diff options
context:
space:
mode:
authorXavierDo <xdo@odoo.com>2018-04-27 16:50:03 +0200
committerXavierDo <xdo@odoo.com>2018-06-07 11:46:28 +0200
commit133eeb1bbf52e9a9ee58f83be8e7f0aba3c6d1ad (patch)
treecd7c6b0a3c931705158c9af590206130480426f6 /addons/mail/wizard/mail_resend_message.py
parentaa7fb8c72317e330bbeb6ce29b4aace8627ef1d7 (diff)
[ADD] mail, mass_mailing: allow a user to resend a mail with failures
When a mail is in failure state, a red envelope appears next to the message in a thread but it was difficult to send the mail again. This tasks will allow users to send mail again easily, or mark notification as cancelled if the user want to ignore this failure. A notification will appear in sender systray while mail are in failure. Task: #46158 PR: #24628
Diffstat (limited to 'addons/mail/wizard/mail_resend_message.py')
-rw-r--r--addons/mail/wizard/mail_resend_message.py84
1 files changed, 84 insertions, 0 deletions
diff --git a/addons/mail/wizard/mail_resend_message.py b/addons/mail/wizard/mail_resend_message.py
new file mode 100644
index 00000000000..b4480220e4f
--- /dev/null
+++ b/addons/mail/wizard/mail_resend_message.py
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import _, api, fields, models
+from ast import literal_eval
+from odoo.exceptions import UserError
+
+class MailResendMessage(models.TransientModel):
+ _name = 'mail.resend.message'
+ _description = 'Email resend wizard'
+
+ mail_message_id = fields.Many2one('mail.message', 'Message', readonly=True)
+ partner_ids = fields.One2many('mail.resend.partner', 'resend_wizard_id', string='Recipients')
+ notification_ids = fields.Many2many('mail.notification', string='Notifications', readonly=True)
+ has_cancel = fields.Boolean(compute='_compute_has_cancel')
+ partner_readonly = fields.Boolean(compute='_compute_partner_readonly')
+
+ @api.depends("partner_ids")
+ def _compute_has_cancel(self):
+ self.has_cancel = self.partner_ids.filtered(lambda p: not p.resend)
+
+ def _compute_partner_readonly(self):
+ self.partner_readonly = not self.env['res.partner'].check_access_rights('write', raise_exception=False)
+
+ @api.model
+ def default_get(self, fields):
+ rec = super(MailResendMessage, self).default_get(fields)
+ message_id = self._context.get('mail_message_to_resend')
+ if message_id:
+ mail_message_id = self.env['mail.message'].browse(message_id)
+ notification_ids = mail_message_id.notification_ids.filtered(lambda notif: notif.email_status in ('exception', 'bounce'))
+ partner_readonly = not self.env['res.partner'].check_access_rights('write', raise_exception=False)
+ partner_ids = [(0, 0,
+ {
+ "partner_id": notif.res_partner_id.id,
+ "name": notif.res_partner_id.name,
+ "email": notif.res_partner_id.email,
+ "resend": True,
+ "message": notif.format_failure_reason(),
+ }
+ ) for notif in notification_ids]
+ rec['partner_readonly'] = partner_readonly
+ rec['notification_ids'] = [(6, 0, notification_ids.ids)]
+ rec['mail_message_id'] = mail_message_id.id
+ rec['partner_ids'] = partner_ids
+ else:
+ raise UserError('No message_id found in context')
+ return rec
+
+ @api.multi
+ def resend_mail_action(self):
+ """ Process the wizard content and proceed with sending the related
+ email(s), rendering any template patterns on the fly if needed. """
+ for wizard in self:
+ "If a partner disappeared from partner list, we cancel the notification"
+ to_cancel = wizard.partner_ids.filtered(lambda p: not p.resend).mapped("partner_id")
+ to_send = wizard.partner_ids.filtered(lambda p: p.resend).mapped("partner_id")
+ notif_to_cancel = wizard.notification_ids.filtered(lambda notif: notif.res_partner_id in to_cancel and notif.email_status in ('exception', 'bounce'))
+ notif_to_cancel.sudo().write({'email_status': 'canceled'})
+ to_send.sudo()._notify(self.mail_message_id, self.mail_message_id.layout, force_send=True, send_after_commit=False, values=literal_eval(self.mail_message_id.layout_values))
+ self.mail_message_id._notify_failure_update()
+ return {'type': 'ir.actions.act_window_close'}
+
+ @api.multi
+ def cancel_mail_action(self):
+ for wizard in self:
+ for notif in wizard.notification_ids:
+ notif.filtered(lambda notif: notif.email_status in ('exception', 'bounce')).sudo().write({'email_status': 'canceled'})
+ wizard.mail_message_id._notify_failure_update()
+ return {'type': 'ir.actions.act_window_close'}
+
+
+
+class PartnerResend(models.TransientModel):
+ _name = 'mail.resend.partner'
+ _description = 'Partner with additionnal information for mail resend'
+
+ partner_id = fields.Many2one('res.partner', string='Partner', required=True, ondelete='cascade')
+ name = fields.Char(related="partner_id.name")
+ email = fields.Char(related="partner_id.email")
+ resend = fields.Boolean(string="Send Again", default=True)
+ resend_wizard_id = fields.Many2one('mail.resend.message', string="Resend wizard")
+ message = fields.Char(string="Help message")
+