Browse Source

mail_digest: improve message body rendering

Message's body can contains styles and other stuff
that can screw the look and feel of digests' mails.

Now we sanitize it if `sanitize_msg_body` is set on the digest (default on).
pull/273/head
Simone Orsi 6 years ago
parent
commit
3d5a82e771
  1. 24
      mail_digest/models/mail_digest.py
  2. 2
      mail_digest/templates/digest_default.xml
  3. 29
      mail_digest/tests/test_digest.py

24
mail_digest/models/mail_digest.py

@ -1,8 +1,7 @@
# Copyright 2017-2018 Camptocamp - 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]')
@ -52,6 +51,14 @@ class MailDigest(models.Model):
default=lambda self: self._default_digest_template_id(),
domain=[('type', '=', 'qweb')],
)
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."""
@ -121,6 +128,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.

2
mail_digest/templates/digest_default.xml

@ -31,7 +31,7 @@
<t t-foreach="messages" t-as="msg">
<div style="margin:20px">
<h3 t-esc="msg.subject" />
<t t-raw="msg.body" />
<t t-raw="digest.message_body(msg)" />
</div>
</t>
</t>

29
mail_digest/tests/test_digest.py

@ -192,3 +192,32 @@ 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': '<p style="font-weight:bold">Body!</p>',
'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, '<p>Body!</p>')
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': '<p style="font-weight:bold">Body!</p>',
'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(
# prevent fail on weird behavior:
# sometimes you get a space, sometimes not :(
body.replace('font-weight: bold', 'font-weight:bold'),
'<p style="font-weight:bold">Body!</p>')
Loading…
Cancel
Save