diff --git a/addons/mail/models/mail_template.py b/addons/mail/models/mail_template.py index e149c1271f3..e647dfcf122 100644 --- a/addons/mail/models/mail_template.py +++ b/addons/mail/models/mail_template.py @@ -204,6 +204,12 @@ class MailTemplate(models.Model): values = results[res_id] if values.get('body_html'): values['body'] = tools.html_sanitize(values['body_html']) + # if asked in fields to return, parse generated date into tz agnostic UTC as expected by ORM + scheduled_date = values.pop('scheduled_date', None) + if 'scheduled_date' in fields and scheduled_date: + parsed_datetime = self.env['mail.mail']._parse_scheduled_datetime(scheduled_date) + values['scheduled_date'] = parsed_datetime.replace(tzinfo=None) if parsed_datetime else False + # technical settings values.update( mail_server_id=template.mail_server_id.id or False, diff --git a/addons/test_mail/tests/test_mail_template.py b/addons/test_mail/tests/test_mail_template.py index d9614c7b7f1..1518222fe3f 100644 --- a/addons/test_mail/tests/test_mail_template.py +++ b/addons/test_mail/tests/test_mail_template.py @@ -2,18 +2,21 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import base64 +import datetime + +from freezegun import freeze_time from odoo.addons.test_mail.tests.common import TestMailCommon, TestRecipients -from odoo.tests import tagged +from odoo.tests import tagged, users from odoo.tools import mute_logger @tagged('mail_template', 'multi_lang') -class TestMailTemplate(TestMailCommon, TestRecipients): +class TestMailTemplateCommon(TestMailCommon, TestRecipients): @classmethod def setUpClass(cls): - super(TestMailTemplate, cls).setUpClass() + super(TestMailTemplateCommon, cls).setUpClass() cls.test_record = cls.env['mail.test.lang'].with_context(cls._test_context).create({ 'email_from': 'ignasse@example.com', 'name': 'Test', @@ -61,6 +64,36 @@ class TestMailTemplate(TestMailCommon, TestRecipients): # Force the attachments of the template to be in the natural order. cls.test_template.invalidate_recordset(['attachment_ids']) + +@tagged('mail_template', 'multi_lang') +class TestMailTemplate(TestMailTemplateCommon): + + @mute_logger('odoo.addons.mail.models.mail_mail') + @users('employee') + def test_template_schedule_email(self): + """ Test scheduling email sending from template. """ + now = datetime.datetime.now() + test_template = self.test_template.with_env(self.env) + + # schedule the mail in 3 days + test_template.scheduled_date = '{{datetime.datetime.now() + datetime.timedelta(days=3)}}' + with freeze_time(now): + mail_id = test_template.send_mail(self.test_record.id) + mail = self.env['mail.mail'].sudo().browse(mail_id) + self.assertEqual( + mail.scheduled_date.replace(second=0, microsecond=0), + (now + datetime.timedelta(days=3)).replace(second=0, microsecond=0), + ) + self.assertEqual(mail.state, 'outgoing') + + # check a wrong format + test_template.scheduled_date = '{{"test " * 5}}' + with freeze_time(now): + mail_id = test_template.send_mail(self.test_record.id) + mail = self.env['mail.mail'].sudo().browse(mail_id) + self.assertFalse(mail.scheduled_date) + self.assertEqual(mail.state, 'outgoing') + @mute_logger('odoo.addons.mail.models.mail_mail') def test_template_send_email(self): mail_id = self.test_template.send_mail(self.test_record.id) diff --git a/addons/test_mail/tests/test_mail_template_preview.py b/addons/test_mail/tests/test_mail_template_preview.py index 87becbaaeb1..2442e46a473 100644 --- a/addons/test_mail/tests/test_mail_template_preview.py +++ b/addons/test_mail/tests/test_mail_template_preview.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo.addons.test_mail.tests.test_mail_template import TestMailTemplate +from odoo.addons.test_mail.tests.test_mail_template import TestMailTemplateCommon from odoo.tests import tagged -@tagged('mail_template') -class TestMailTemplateTools(TestMailTemplate): +@tagged('mail_template', 'multi_lang') +class TestMailTemplateTools(TestMailTemplateCommon): def test_mail_template_preview_force_lang(self): test_record = self.env['mail.test.lang'].browse(self.test_record.ids)