[FW][FIX] mass_mailing_sms: try to render jinja content when using test wizards

# Purpose

The wizard to test a mailing does not compute the jinja part. It does
not detect syntax errors that would make cron crash

# Specifications

If there is at least one record in the mailing model then render template
completely. Thow an error if rendering cannot be done.

The downside is that we cannot test the jinja part if there is not yet any
record in the mailing's model.

Do it for mass_mailing and mass_mailing_sms.

Add tests to ensure error detection in test wizard effectively works.

Task ID-2312442
PR #55696

closes odoo/odoo#60370

Forward-port-of: odoo/odoo#55696
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
Odoo's Mergebot
2020-10-20 15:31:38 +02:00
committed by GitHub
4 changed files with 96 additions and 6 deletions
@@ -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,
@@ -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
@@ -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()
@@ -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': '<p>Hello ${object.name}</p>',
'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': '<p>Hello ${object.name_id.id}</p>',
})
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': '<p>Hello ${object.name}</p>',
'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):