diff --git a/addons/mass_mailing/data/mass_mailing_data.xml b/addons/mass_mailing/data/mass_mailing_data.xml
index bffbe7ec97a..128eb9a48dc 100644
--- a/addons/mass_mailing/data/mass_mailing_data.xml
+++ b/addons/mass_mailing/data/mass_mailing_data.xml
@@ -8,8 +8,8 @@
code
model._process_mass_mailing_queue()
- 60
- minutes
+ 1
+ days
-1
diff --git a/addons/mass_mailing/models/mailing.py b/addons/mass_mailing/models/mailing.py
index e44d80ac1e5..8cb1a2411a3 100644
--- a/addons/mass_mailing/models/mailing.py
+++ b/addons/mass_mailing/models/mailing.py
@@ -358,6 +358,11 @@ class MassMailing(models.Model):
def action_put_in_queue(self):
self.write({'state': 'in_queue'})
+ cron = self.env.ref('mass_mailing.ir_cron_mass_mailing_queue')
+ cron._trigger(
+ schedule_date or fields.Datetime.now()
+ for schedule_date in self.mapped('schedule_date')
+ )
def action_cancel(self):
self.write({'state': 'draft', 'schedule_date': False, 'schedule_type': 'now', 'next_departure': False})
diff --git a/addons/mass_mailing/tests/test_mailing_internals.py b/addons/mass_mailing/tests/test_mailing_internals.py
index 115736e987d..ed0a83522cf 100644
--- a/addons/mass_mailing/tests/test_mailing_internals.py
+++ b/addons/mass_mailing/tests/test_mailing_internals.py
@@ -2,6 +2,9 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from ast import literal_eval
+from datetime import datetime
+
+from freezegun import freeze_time
from odoo.addons.mass_mailing.tests.common import MassMailCommon
from odoo.tests.common import users, Form
@@ -173,6 +176,44 @@ class TestMassMailFeatures(MassMailCommon):
'email_to incorrect. Should be equal to "%s"' % (
formataddr((test_partner.name, test_partner.email))))
+ @users('user_marketing')
+ @mute_logger('odoo.addons.mail.models.mail_mail')
+ def test_mailing_cron_trigger(self):
+ """ Technical test to ensure the cron is triggered at the correct
+ time """
+
+ ir_cron_triggers = self.env['ir.cron.trigger'].sudo()
+ partner = self.env['res.partner'].create({
+ 'name': 'Jean-Alphonce',
+ 'email': 'jeanalph@example.com',
+ })
+ common_mailing_values = {
+ 'name': 'Knock knock',
+ 'subject': "Who's there?",
+ 'mailing_model_id': self.env['ir.model']._get('res.partner').id,
+ 'mailing_domain': [('id', '=', partner.id)],
+ 'body_html': 'The marketing mailing test.',
+ 'schedule_type': 'scheduled',
+ }
+
+ now = datetime(2021, 2, 5, 16, 43, 20)
+ then = datetime(2021, 2, 7, 12, 0, 0)
+
+ with freeze_time(now):
+ for (test, truth) in [(False, now), (then, then)]:
+ with self.subTest(schedule_date=test):
+ triggers_before = ir_cron_triggers.search([])
+ mailing = self.env['mailing.mailing'].create({
+ **common_mailing_values,
+ 'schedule_date': test,
+ })
+ mailing.action_put_in_queue()
+
+ triggers_after = ir_cron_triggers.search([])
+ new_triggers = triggers_after - triggers_before
+ new_triggers.ensure_one()
+ self.assertLessEqual(new_triggers.call_at, truth)
+
@users('user_marketing')
@mute_logger('odoo.addons.mail.models.mail_mail')
def test_mailing_on_res_partner(self):