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