From 6bb907ed35c1d6695e1e85128a2e1b91a737eeee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Hennecart?= Date: Fri, 9 Oct 2020 10:19:05 +0000 Subject: [PATCH 1/3] [FIX] test_mass_mailing: add test for the send_mail_test action This test ensures that when using the test sending tool of mass mailing (sms) a wrong jinja content is detected if we have any record available to evaluate it. PR odoo/odoo#55696 Task ID-2312442 X-original-commit: 183a7677616ac36ed06109e22288aacb185ac097 --- addons/test_mail_full/tests/test_mass_sms.py | 30 ++++++++++++++ .../tests/test_mailing_internals.py | 41 +++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/addons/test_mail_full/tests/test_mass_sms.py b/addons/test_mail_full/tests/test_mass_sms.py index 2bc1760cc60..a3e3d35e14a 100644 --- a/addons/test_mail_full/tests/test_mass_sms.py +++ b/addons/test_mail_full/tests/test_mass_sms.py @@ -5,6 +5,7 @@ from odoo.addons.phone_validation.tools import phone_validation from odoo.addons.test_mail_full.tests.common import TestMailFullCommon from odoo.tests import tagged +from odoo.tools import mute_logger @tagged('mass_mailing') @@ -147,3 +148,32 @@ class TestMassSMS(TestMailFullCommon): [{'partner': record.customer_id, 'number': self.records_numbers[i+5], 'content': 'Dear %s this is a mass SMS.' % record.display_name} for i, record in enumerate(self.records[5:])], self.mailing, self.records[5:], check_sms=True ) + + @mute_logger('odoo.addons.mail.models.mail_render_mixin') + def test_mass_sms_test_button(self): + mailing = self.env['mailing.mailing'].create({ + 'name': 'TestButton', + 'subject': 'Subject ${object.name}', + 'preview': 'Preview ${object.name}', + 'state': 'draft', + 'mailing_type': 'sms', + 'body_plaintext': 'Hello ${object.name}', + 'mailing_model_id': self.env['ir.model']._get('res.partner').id, + }) + mailing_test = self.env['mailing.sms.test'].with_user(self.user_marketing).create({ + 'numbers': '+32456001122', + 'mailing_id': mailing.id, + }) + + with self.with_user('user_marketing'): + with self.mockSMSGateway(): + mailing_test.action_send_sms() + + # Test if bad jinja in the body raises an error + mailing.write({ + 'body_plaintext': 'Hello ${object.name_id.id}', + }) + + with self.with_user('user_marketing'): + with self.mock_mail_gateway(), self.assertRaises(Exception): + mailing_test.action_send_sms() diff --git a/addons/test_mass_mailing/tests/test_mailing_internals.py b/addons/test_mass_mailing/tests/test_mailing_internals.py index 48eab1853bb..5d284ef6d09 100644 --- a/addons/test_mass_mailing/tests/test_mailing_internals.py +++ b/addons/test_mass_mailing/tests/test_mailing_internals.py @@ -4,6 +4,7 @@ from odoo.addons.test_mass_mailing.tests.common import TestMassMailCommon from odoo.addons.test_mass_mailing.data.mail_test_data import MAIL_TEMPLATE from odoo.tests.common import users +from odoo.tools import mute_logger class TestMailingInternals(TestMassMailCommon): @@ -22,6 +23,46 @@ class TestMailingInternals(TestMassMailCommon): 'alias_contact': 'everyone' }) + @mute_logger('odoo.addons.mail.models.mail_render_mixin') + def test_mailing_test_button(self): + mailing = self.env['mailing.mailing'].create({ + 'name': 'TestButton', + 'subject': 'Subject ${object.name}', + 'preview': 'Preview ${object.name}', + 'state': 'draft', + 'mailing_type': 'mail', + 'body_html': '

Hello ${object.name}

', + 'mailing_model_id': self.env['ir.model']._get('res.partner').id, + }) + mailing_test = self.env['mailing.mailing.test'].create({ + 'email_to': 'test@test.com', + 'mass_mailing_id': mailing.id, + }) + + with self.mock_mail_gateway(): + mailing_test.send_mail_test() + + # Test if bad jinja in the subject raises an error + mailing.write({'subject': 'Subject ${object.name_id.id}'}) + with self.mock_mail_gateway(), self.assertRaises(Exception): + mailing_test.send_mail_test() + + # Test if bad jinja in the body raises an error + mailing.write({ + 'subject': 'Subject ${object.name}', + 'body_html': '

Hello ${object.name_id.id}

', + }) + with self.mock_mail_gateway(), self.assertRaises(Exception): + mailing_test.send_mail_test() + + # Test if bad jinja in the preview raises an error + mailing.write({ + 'body_html': '

Hello ${object.name}

', + 'preview': 'Preview ${object.name_id.id}', + }) + with self.mock_mail_gateway(), self.assertRaises(Exception): + mailing_test.send_mail_test() + def test_mailing_trace_update(self): customers = self.env['res.partner'] for x in range(0, 3): From eafbc90df802424c4c58c092249d3183bc7ab98b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Hennecart?= Date: Fri, 7 Aug 2020 15:29:09 +0000 Subject: [PATCH 2/3] [FIX] mass_mailing: try to render jinja content when using test wizards Before when a user clicked on the button "Test", jinja syntax was not taken into account for the test mail sent. If an error was present clicking on the button did not raise an error before the cron was executed. Now, if there is at least one record in the mailing model, the template is correctly rendered and throws an error if there is a syntax error. If we don't have any record to render the template, we fallback on the raw content like before. PR odoo/odoo#55696 Task ID-2312442 X-original-commit: 92aef67cc8cd1f3ac1ac28803f69aeab1d14ca97 --- .../wizard/mailing_mailing_test.py | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/addons/mass_mailing/wizard/mailing_mailing_test.py b/addons/mass_mailing/wizard/mailing_mailing_test.py index 2ffba12ebf5..e3c1970afae 100644 --- a/addons/mass_mailing/wizard/mailing_mailing_test.py +++ b/addons/mass_mailing/wizard/mailing_mailing_test.py @@ -22,16 +22,28 @@ class TestMassMailing(models.TransientModel): mailing = self.mass_mailing_id test_emails = tools.email_split(self.email_to) mass_mail_layout = self.env.ref('mass_mailing.mass_mailing_mail_layout') + + record = self.env[mailing.mailing_model_real].search([], limit=1) + body = mailing._prepend_preview(mailing.body_html, mailing.preview) + subject = mailing.subject + + # If there is atleast 1 record for the model used in this mailing, then we use this one to render the template + # Downside: Jinja syntax is only tested when there is atleast one record of the mailing's model + if record: + # Returns a proper error if there is a syntax error with jinja + body = self.env['mail.render.mixin']._render_template(body, mailing.mailing_model_real, record.ids, post_process=True)[record.id] + subject = self.env['mail.render.mixin']._render_template(subject, mailing.mailing_model_real, record.ids)[record.id] + + # Convert links in absolute URLs before the application of the shortener + body = self.env['mail.render.mixin']._replace_local_links(body) + body = tools.html_sanitize(body, sanitize_attributes=True, sanitize_style=True) + for test_mail in test_emails: - # Convert links in absolute URLs before the application of the shortener - body = mailing._prepend_preview(mailing.body_html, mailing.preview) - body = self.env['mail.render.mixin']._replace_local_links(body) - body = tools.html_sanitize(body, sanitize_attributes=True, sanitize_style=True) mail_values = { 'email_from': mailing.email_from, 'reply_to': mailing.reply_to, 'email_to': test_mail, - 'subject': mailing.subject, + 'subject': subject, 'body_html': mass_mail_layout._render({'body': body}, engine='ir.qweb', minimal_qcontext=True), 'notification': True, 'mailing_id': mailing.id, From 95705a4ef2994f8e7b8e64412c76a9f00eeafcbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Hennecart?= Date: Tue, 11 Aug 2020 11:23:42 +0000 Subject: [PATCH 3/3] [FIX] mass_mailing_sms: try to render jinja content when using test wizards Like the mass_mailing app we want to raise an error in case there is a syntax error with jinja when we test the mailing and if there is at least one record in the mailing model. PR odoo/odoo#55696 Task ID-2312442 X-original-commit: 7370d573ae91cf442d045aec2b49332061f6c0ee --- addons/mass_mailing_sms/wizard/mailing_sms_test.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/addons/mass_mailing_sms/wizard/mailing_sms_test.py b/addons/mass_mailing_sms/wizard/mailing_sms_test.py index 198304dc2c6..1ea9f8718eb 100644 --- a/addons/mass_mailing_sms/wizard/mailing_sms_test.py +++ b/addons/mass_mailing_sms/wizard/mailing_sms_test.py @@ -24,9 +24,16 @@ class MassSMSTest(models.TransientModel): invalid_numbers = [number for number, info in sanitize_res.items() if info['code']] if invalid_numbers: raise exceptions.UserError(_('Following numbers are not correctly encoded: %s, example : "+32 495 85 85 77, +33 545 55 55 55"', repr(invalid_numbers))) + + record = self.env[self.mailing_id.mailing_model_real].search([], limit=1) + body = self.mailing_id.body_plaintext + if record: + # Returns a proper error if there is a syntax error with jinja + body = self.env['mail.render.mixin']._render_template(body, self.mailing_id.mailing_model_real, record.ids)[record.id] + self.env['sms.api']._send_sms_batch([{ 'res_id': 0, 'number': number, - 'content': self.mailing_id.body_plaintext, + 'content': body, } for number in sanitized_numbers]) return True