From 73672cfc9ff517604238339a5bf80fae98fda14f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 10 Nov 2021 14:20:20 +0000 Subject: [PATCH] [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 --- addons/mass_mailing/models/mailing.py | 24 ++++++++++++------- .../tests/test_mass_mailing_statistics.py | 6 ++--- .../tests/test_mailing_statistics.py | 12 +++++----- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/addons/mass_mailing/models/mailing.py b/addons/mass_mailing/models/mailing.py index e88fb9e6fad..526c52b5a10 100644 --- a/addons/mass_mailing/models/mailing.py +++ b/addons/mass_mailing/models/mailing.py @@ -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 diff --git a/addons/test_mail_full/tests/test_mass_mailing_statistics.py b/addons/test_mail_full/tests/test_mass_mailing_statistics.py index 8a3f67ae0eb..45f0dc134bc 100644 --- a/addons/test_mail_full/tests/test_mass_mailing_statistics.py +++ b/addons/test_mail_full/tests/test_mass_mailing_statistics.py @@ -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) diff --git a/addons/test_mass_mailing/tests/test_mailing_statistics.py b/addons/test_mass_mailing/tests/test_mailing_statistics.py index 629b14658ef..fdc5b866b2e 100644 --- a/addons/test_mass_mailing/tests/test_mailing_statistics.py +++ b/addons/test_mass_mailing/tests/test_mailing_statistics.py @@ -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')