When you send a mass mailing to muiltiple partner, if some of them have no email adresse, it can lead to errors because of the variable 'recips' is not set if the first occurence in the 'for loop' has no email. To fix this, we always set the variable 'recips' by replacing the 'elif' close by a 'else' one introduced in rev: https://github.com/odoo/odoo/commit/65ed4553a50fdbefc986b7d21f87a81c42b743c7
88 lines
4.4 KiB
Python
88 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
from odoo import api, fields, models, tools
|
|
|
|
|
|
class MailComposeMessage(models.TransientModel):
|
|
"""Add concept of mass mailing campaign to the mail.compose.message wizard
|
|
"""
|
|
_inherit = 'mail.compose.message'
|
|
|
|
mass_mailing_campaign_id = fields.Many2one('mail.mass_mailing.campaign', string='Mass Mailing Campaign')
|
|
mass_mailing_id = fields.Many2one('mail.mass_mailing', string='Mass Mailing', ondelete='cascade')
|
|
mass_mailing_name = fields.Char(string='Mass Mailing')
|
|
mailing_list_ids = fields.Many2many('mail.mass_mailing.list', string='Mailing List')
|
|
|
|
@api.multi
|
|
def get_mail_values(self, res_ids):
|
|
""" Override method that generated the mail content by creating the
|
|
mail.mail.statistics values in the o2m of mail_mail, when doing pure
|
|
email mass mailing. """
|
|
self.ensure_one()
|
|
res = super(MailComposeMessage, self).get_mail_values(res_ids)
|
|
# use only for allowed models in mass mailing
|
|
if self.composition_mode == 'mass_mail' and \
|
|
(self.mass_mailing_name or self.mass_mailing_id) and \
|
|
self.model in [item[0] for item in self.env['mail.mass_mailing']._get_mailing_model()]:
|
|
mass_mailing = self.mass_mailing_id
|
|
if not mass_mailing:
|
|
reply_to_mode = 'email' if self.no_auto_thread else 'thread'
|
|
reply_to = self.reply_to if self.no_auto_thread else False
|
|
mass_mailing = self.env['mail.mass_mailing'].create({
|
|
'mass_mailing_campaign_id': self.mass_mailing_campaign_id.id,
|
|
'name': self.mass_mailing_name,
|
|
'template_id': self.template_id.id,
|
|
'state': 'done',
|
|
'reply_to_mode': reply_to_mode,
|
|
'reply_to': reply_to,
|
|
'sent_date': fields.Datetime.now(),
|
|
'body_html': self.body,
|
|
'mailing_model': self.model,
|
|
'mailing_domain': self.active_domain,
|
|
})
|
|
|
|
# Preprocess res.partners to batch-fetch from db
|
|
# if recipient_ids is present, it means they are partners
|
|
# (the only object to fill get_default_recipient this way)
|
|
recipient_partners_ids = []
|
|
read_partners = {}
|
|
for res_id in res_ids:
|
|
mail_values = res[res_id]
|
|
if mail_values.get('recipient_ids'):
|
|
# recipient_ids is a list of x2m command tuples at this point
|
|
recipient_partners_ids.append(mail_values.get('recipient_ids')[0][1])
|
|
read_partners = self.env['res.partner'].browse(recipient_partners_ids)
|
|
|
|
partners_email = {p.id: p.email for p in read_partners}
|
|
|
|
blacklist = self._context.get('mass_mailing_blacklist')
|
|
seen_list = self._context.get('mass_mailing_seen_list')
|
|
for res_id in res_ids:
|
|
mail_values = res[res_id]
|
|
if mail_values.get('email_to'):
|
|
recips = tools.email_split(mail_values['email_to'])
|
|
else:
|
|
recips = tools.email_split(partners_email.get(res_id))
|
|
mail_to = recips[0].lower() if recips else False
|
|
if (blacklist and mail_to in blacklist) or (seen_list and mail_to in seen_list):
|
|
# prevent sending to blocked addresses that were included by mistake
|
|
mail_values['state'] = 'cancel'
|
|
elif seen_list is not None:
|
|
seen_list.add(mail_to)
|
|
stat_vals = {
|
|
'model': self.model,
|
|
'res_id': res_id,
|
|
'mass_mailing_id': mass_mailing.id
|
|
}
|
|
# propagate exception state to stat when still-born
|
|
if mail_values.get('state') == 'cancel':
|
|
stat_vals['exception'] = fields.Datetime.now()
|
|
mail_values.update({
|
|
'mailing_id': mass_mailing.id,
|
|
'statistics_ids': [(0, 0, stat_vals)],
|
|
# email-mode: keep original message for routing
|
|
'notification': mass_mailing.reply_to_mode == 'thread',
|
|
'auto_delete': not mass_mailing.keep_archives,
|
|
})
|
|
return res
|