mirror of https://github.com/OCA/social.git
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
parent
c631f91b52
commit
3d5a82e771
|
@ -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.
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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…
Reference in New Issue