[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
This commit is contained in:
Thibault Delavallée
2021-11-16 16:58:36 +00:00
parent c59039b195
commit 8df08eac57
3 changed files with 9 additions and 8 deletions
+4 -2
View File
@@ -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.
@@ -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()')
@@ -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')