From 8df08eac57a0fa7e6e70293431cdae660d19caca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 8 Nov 2021 17:04:39 +0000 Subject: [PATCH] [FIX] mass_mailing: use queue to send statistics emails When there is an issue updating mailing state (concurrent access, or some other error that may happen), mailing statistics emails may be sent in loop. As we do not think timing is so important, we now use the email queue to send statistics emails. Task-2686586 (Repair mailing statistics) X-original-commit: f78ac45c2eafc3cf6b213e1f1608e76e243bd8d2 Part-of: odoo/odoo#79877 --- addons/mass_mailing/models/mailing.py | 6 ++++-- .../test_mail_full/tests/test_mass_mailing_statistics.py | 4 ++-- addons/test_mass_mailing/tests/test_mailing_statistics.py | 7 +++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/addons/mass_mailing/models/mailing.py b/addons/mass_mailing/models/mailing.py index 67cbcfafe95..e88fb9e6fad 100644 --- a/addons/mass_mailing/models/mailing.py +++ b/addons/mass_mailing/models/mailing.py @@ -931,6 +931,7 @@ class MassMailing(models.Model): """Send an email to the responsible of each finished mailing with the statistics.""" self.kpi_mail_required = False + 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')) @@ -973,9 +974,10 @@ class MassMailing(models.Model): 'email_to': user.email_formatted, 'body_html': full_mail, 'auto_delete': True, + 'state': 'outgoing', } - mail = self.env['mail.mail'].sudo().create(mail_values) - mail.send(raise_exception=False) + mails_sudo += self.env['mail.mail'].sudo().create(mail_values) + return mails_sudo def _prepare_statistics_email_values(self): """Return some statistics that will be displayed in the mailing statistics email. 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 b9d552a717a..8a3f67ae0eb 100644 --- a/addons/test_mail_full/tests/test_mass_mailing_statistics.py +++ b/addons/test_mail_full/tests/test_mass_mailing_statistics.py @@ -47,7 +47,7 @@ class TestMailingStatistics(TestMassSMSCommon): self.assertEqual(mailing.opened_ratio, 30) self.assertEqual(mailing.sent, 10) - with self.mock_mail_gateway(mail_unlink_sent=False): + with self.mock_mail_gateway(mail_unlink_sent=True): mailing._action_send_statistics() self.assertEqual(len(self._new_mails), 1, "Mailing: a mail should have been created for statistics") @@ -57,7 +57,7 @@ class TestMailingStatistics(TestMassSMSCommon): 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.state, 'sent') + self.assertEqual(mail.state, 'outgoing') # test body content: KPIs body_html = html.fromstring(mail.body_html) kpi_values = body_html.xpath('//div[@data-field="sms"]//*[hasclass("kpi_value")]/text()') diff --git a/addons/test_mass_mailing/tests/test_mailing_statistics.py b/addons/test_mass_mailing/tests/test_mailing_statistics.py index be4b193f09e..629b14658ef 100644 --- a/addons/test_mass_mailing/tests/test_mailing_statistics.py +++ b/addons/test_mass_mailing/tests/test_mailing_statistics.py @@ -53,7 +53,7 @@ class TestMailingStatistics(TestMassMailCommon): self.assertEqual(mailing.replied_ratio, 30) self.assertEqual(mailing.sent, 10) - with self.mock_mail_gateway(mail_unlink_sent=False): + with self.mock_mail_gateway(mail_unlink_sent=True): mailing._action_send_statistics() self.assertEqual(len(self._new_mails), 1, "Mailing: a mail should have been created for statistics") @@ -63,7 +63,7 @@ class TestMailingStatistics(TestMassMailCommon): 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.state, 'sent') + self.assertEqual(mail.state, 'outgoing') # test body content: KPIs body_html = html.fromstring(mail.body_html) kpi_values = body_html.xpath('//div[@data-field="mail"]//*[hasclass("kpi_value")]/text()') @@ -95,6 +95,5 @@ class TestMailingStatistics(TestMassMailCommon): self.assertEqual(mail.author_id, self.user_marketing.partner_id) self.assertFalse(mail.email_from) self.assertFalse(mail.email_to) - self.assertTrue(mail.failure_reason) self.assertEqual(mail.reply_to, formataddr((self.company_admin.name, '%s@%s' % (self.alias_catchall, self.alias_domain)))) - self.assertEqual(mail.state, 'exception') + self.assertEqual(mail.state, 'outgoing')