diff --git a/mail_digest/models/mail_digest.py b/mail_digest/models/mail_digest.py index 9d8570ac..5d4c4342 100644 --- a/mail_digest/models/mail_digest.py +++ b/mail_digest/models/mail_digest.py @@ -2,8 +2,7 @@ # Copyright 2017 Simone Orsi # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -from odoo import fields, models, api, exceptions, _ - +from odoo import fields, models, api, exceptions, tools, _ import logging logger = logging.getLogger('[mail_digest]') @@ -54,6 +53,14 @@ class MailDigest(models.Model): domain=[('type', '=', 'qweb')], oldname='template_id', ) + sanitize_msg_body = fields.Boolean( + string='Sanitize message body', + help='Collected messages can have different styles applied ' + 'on each element. If this flag is enabled (default) ' + 'each message content will be sanitized ' + 'before generating the email.', + default=True, + ) def _default_digest_template_id(self): """Retrieve default template to render digest.""" @@ -129,6 +136,19 @@ class MailDigest(models.Model): grouped.setdefault(self._message_group_by_key(msg), []).append(msg) return grouped + @api.model + def message_body(self, msg, strip_style=True): + """Return body message prepared for email content. + + Message's body can contains styles and other stuff + that can screw the look and feel of digests' mails. + + Here we sanitize it if `sanitize_msg_body` is set on the digest. + """ + if not self.sanitize_msg_body: + return msg.body + return tools.html_sanitize(msg.body or '', strip_style=strip_style) + def _get_site_name(self): """Retrieve site name for meaningful mail subject. diff --git a/mail_digest/templates/digest_default.xml b/mail_digest/templates/digest_default.xml index 6c98e4b8..8e40c7b9 100644 --- a/mail_digest/templates/digest_default.xml +++ b/mail_digest/templates/digest_default.xml @@ -31,7 +31,7 @@

- +

diff --git a/mail_digest/tests/test_digest.py b/mail_digest/tests/test_digest.py index 880aa3f9..9c4c7403 100644 --- a/mail_digest/tests/test_digest.py +++ b/mail_digest/tests/test_digest.py @@ -191,3 +191,28 @@ class DigestCase(SavepointCase): # raise error if no template found with self.assertRaises(exceptions.UserError): dig._get_email_values() + + def test_digest_message_body_sanitize(self): + dig = self._create_for_partner(self.partner1) + message = self.message_model.create({ + 'body': '

Body!

', + 'subtype_id': self.subtype1.id, + 'res_id': self.partner3.id, + 'model': 'res.partner', + 'partner_ids': [(4, self.partner1.id)] + }) + body = dig.message_body(message) + self.assertEqual(body, '

Body!

') + + def test_digest_message_body_no_sanitize(self): + dig = self._create_for_partner(self.partner1) + dig.sanitize_msg_body = False + message = self.message_model.create({ + 'body': '

Body!

', + 'subtype_id': self.subtype1.id, + 'res_id': self.partner3.id, + 'model': 'res.partner', + 'partner_ids': [(4, self.partner1.id)] + }) + body = dig.message_body(message) + self.assertEqual(body, '

Body!

')