[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:
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user