[FIX] mass_mailing: fix mail related values of statistics emails

When mailings have no responsible, KPIs emails are broken as there is no
from and to on the mail. This leads to mails being invalid and set in
exception.

Moreover currently author and from / to of those D+1 emails are not coherent
as author is current user (generally odoobot as this is generated through
a cron) while from and to are based on mailing responsible.

In this commit we make statistics emails more coherent
  * when a responsible is set on the mailing: author, from and to are linked
    to the responsible;
  * when there is no responsible, current user is set as it may be sent by
    regular people;
  * reply-to is set to company email as it is often the case with 'marketing'
    emails;

Task-2686586 (Repair mailing statistics email)

X-original-commit: 95a21ca16f560cf4341c547f6bc909d3261acd1b
Part-of: odoo/odoo#79877
This commit is contained in:
Thibault Delavallée
2021-11-16 16:58:36 +00:00
parent 8df08eac57
commit 73672cfc9f
3 changed files with 24 additions and 18 deletions
+15 -9
View File
@@ -933,9 +933,13 @@ class MassMailing(models.Model):
mails_sudo = self.env['mail.mail'].sudo()
for mailing in self:
user = mailing.user_id
mailing = mailing.with_context(lang=user.lang or self._context.get('lang'))
if mailing.user_id:
mailing = mailing.with_user(mailing.user_id).with_context(
lang=mailing.user_id.lang or self._context.get('lang')
)
mailing_type = mailing._get_pretty_mailing_type()
mail_user = mailing.user_id or self.env.user
mail_company = mail_user.company_id
link_trackers = self.env['link.tracker'].search(
[('mass_mailing_id', '=', mailing.id)]
@@ -953,8 +957,8 @@ class MassMailing(models.Model):
'digest.digest_mail_main',
{
'body': tools.html_sanitize(link_trackers_body),
'company': user.company_id,
'user': user,
'company': mail_company,
'user': mail_user,
'display_mobile_banner': True,
** mailing._prepare_statistics_email_values()
},
@@ -966,15 +970,17 @@ class MassMailing(models.Model):
)
mail_values = {
'auto_delete': True,
'author_id': mail_user.partner_id.id,
'email_from': mail_user.email_formatted,
'email_to': mail_user.email_formatted,
'body_html': full_mail,
'reply_to': mail_company.email_formatted or mail_user.email_formatted,
'state': 'outgoing',
'subject': _('24H Stats of %(mailing_type)s "%(mailing_name)s"',
mailing_type=mailing._get_pretty_mailing_type(),
mailing_name=mailing.subject
),
'email_from': user.email_formatted,
'email_to': user.email_formatted,
'body_html': full_mail,
'auto_delete': True,
'state': 'outgoing',
}
mails_sudo += self.env['mail.mail'].sudo().create(mail_values)
return mails_sudo
@@ -7,7 +7,7 @@ from odoo.addons.mail.tests.common import mail_new_test_user
from odoo.addons.test_mail_full.tests.test_mass_sms import TestMassSMSCommon
from odoo.tests.common import users
from odoo.tests import tagged
from odoo.tools import formataddr, mute_logger
from odoo.tools import mute_logger
@tagged('digest', 'mass_mailing')
@@ -53,10 +53,10 @@ class TestMailingStatistics(TestMassSMSCommon):
self.assertEqual(len(self._new_mails), 1, "Mailing: a mail should have been created for statistics")
mail = self._new_mails[0]
# test email values
self.assertEqual(mail.author_id, self.user_marketing.partner_id)
self.assertEqual(mail.author_id, self.user_marketing_2.partner_id)
self.assertEqual(mail.email_from, self.user_marketing_2.email_formatted)
self.assertEqual(mail.email_to, self.user_marketing_2.email_formatted)
self.assertEqual(mail.reply_to, formataddr((self.company_admin.name, '%s@%s' % (self.alias_catchall, self.alias_domain))))
self.assertEqual(mail.reply_to, self.company_admin.partner_id.email_formatted)
self.assertEqual(mail.state, 'outgoing')
# test body content: KPIs
body_html = html.fromstring(mail.body_html)
@@ -8,7 +8,7 @@ from odoo.addons.test_mass_mailing.data.mail_test_data import MAIL_TEMPLATE
from odoo.addons.test_mass_mailing.tests.common import TestMassMailCommon
from odoo.tests.common import users
from odoo.tests import tagged
from odoo.tools import formataddr, mute_logger
from odoo.tools import mute_logger
@tagged('digest')
@@ -59,10 +59,10 @@ class TestMailingStatistics(TestMassMailCommon):
self.assertEqual(len(self._new_mails), 1, "Mailing: a mail should have been created for statistics")
mail = self._new_mails[0]
# test email values
self.assertEqual(mail.author_id, self.user_marketing.partner_id)
self.assertEqual(mail.author_id, self.user_marketing_2.partner_id)
self.assertEqual(mail.email_from, self.user_marketing_2.email_formatted)
self.assertEqual(mail.email_to, self.user_marketing_2.email_formatted)
self.assertEqual(mail.reply_to, formataddr((self.company_admin.name, '%s@%s' % (self.alias_catchall, self.alias_domain))))
self.assertEqual(mail.reply_to, self.company_admin.partner_id.email_formatted)
self.assertEqual(mail.state, 'outgoing')
# test body content: KPIs
body_html = html.fromstring(mail.body_html)
@@ -93,7 +93,7 @@ class TestMailingStatistics(TestMassMailCommon):
mail = self._new_mails[0]
# test email values
self.assertEqual(mail.author_id, self.user_marketing.partner_id)
self.assertFalse(mail.email_from)
self.assertFalse(mail.email_to)
self.assertEqual(mail.reply_to, formataddr((self.company_admin.name, '%s@%s' % (self.alias_catchall, self.alias_domain))))
self.assertEqual(mail.email_from, self.user_marketing.email_formatted)
self.assertEqual(mail.email_to, self.user_marketing.email_formatted)
self.assertEqual(mail.reply_to, self.company_admin.partner_id.email_formatted)
self.assertEqual(mail.state, 'outgoing')