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):