From 45cff7905f32045783ee7b903df5bebd8bdae4d4 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Thu, 26 Apr 2018 09:47:40 +0200 Subject: [PATCH 1/4] 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). --- mail_digest/models/mail_digest.py | 24 +++++++++++++++++++++-- mail_digest/templates/digest_default.xml | 2 +- mail_digest/tests/test_digest.py | 25 ++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) 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!

') From 663a06d76630cdae8911675d62426220304e17b8 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Thu, 26 Apr 2018 10:47:53 +0200 Subject: [PATCH 2/4] mail_digest: add layout preview --- mail_digest/README.rst | 8 ++ mail_digest/__init__.py | 1 + mail_digest/__manifest__.py | 1 + mail_digest/controllers/__init__.py | 1 + .../controllers/digest_layout_preview.py | 136 ++++++++++++++++++ mail_digest/images/digest_layout_preview.png | Bin 0 -> 70638 bytes .../templates/digest_layout_preview.xml | 18 +++ mail_digest/tests/__init__.py | 1 + mail_digest/tests/test_preview.py | 57 ++++++++ 9 files changed, 223 insertions(+) create mode 100644 mail_digest/controllers/__init__.py create mode 100644 mail_digest/controllers/digest_layout_preview.py create mode 100644 mail_digest/images/digest_layout_preview.png create mode 100644 mail_digest/templates/digest_layout_preview.xml create mode 100644 mail_digest/tests/test_preview.py diff --git a/mail_digest/README.rst b/mail_digest/README.rst index 5024e223..86ac78ec 100644 --- a/mail_digest/README.rst +++ b/mail_digest/README.rst @@ -60,6 +60,14 @@ You change this with the config param `mail_digest.enabled_message_types` whereas you can specify message types separated by comma. +Digest rendering preview +------------------------ + +You can check how messages are formatted per each mail subtype by going to `/digest/layout-preview` in your browser. + +.. image:: ./images/digest_layout_preview.png + + Known issues / Roadmap ====================== diff --git a/mail_digest/__init__.py b/mail_digest/__init__.py index 0650744f..91c5580f 100644 --- a/mail_digest/__init__.py +++ b/mail_digest/__init__.py @@ -1 +1,2 @@ +from . import controllers from . import models diff --git a/mail_digest/__manifest__.py b/mail_digest/__manifest__.py index e8ae9b38..56df31a7 100644 --- a/mail_digest/__manifest__.py +++ b/mail_digest/__manifest__.py @@ -21,6 +21,7 @@ 'views/partner_views.xml', 'views/user_views.xml', 'templates/digest_default.xml', + 'templates/digest_layout_preview.xml', ], 'images': [ 'static/description/preview.png', diff --git a/mail_digest/controllers/__init__.py b/mail_digest/controllers/__init__.py new file mode 100644 index 00000000..f7b863bf --- /dev/null +++ b/mail_digest/controllers/__init__.py @@ -0,0 +1 @@ +from . import digest_layout_preview diff --git a/mail_digest/controllers/digest_layout_preview.py b/mail_digest/controllers/digest_layout_preview.py new file mode 100644 index 00000000..f3abc871 --- /dev/null +++ b/mail_digest/controllers/digest_layout_preview.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +# Copyright 2018 Simone Orsi +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import http +from odoo.http import request +import random + + +FAKE_NAMES = [ + 'Madison Castillo', + 'Destiny Frost', + 'Dennis Parrish', + 'Christy Moore', + 'Larry James', + 'David Simmons', + 'Dr. Francis Ramos', + 'Michelle Williams', + 'Allison Montgomery', + 'Michelle Rodriguez', + 'Gina Patel', + 'Corey Ray', + 'Brent Myers', + 'Sydney Hicks', + 'Austin Buckley', + 'Patricia Jones DDS', + 'Dylan Davila', + 'Christopher Bolton', + 'James Cline', + 'Gary Johnson', + 'Jennifer Reese', + 'Kevin Davis', + 'Sandra Robinson', + 'Sara Warner', + 'Jaime Dunn', + 'Mark Austin', + 'Kendra Nelson', + 'Matthew White', + 'Rebecca Berger', + 'Amanda Thornton', + 'Lorraine Schultz', + 'Chelsea Daniel', + 'Kayla Jackson', + 'Melanie Grant', + 'Oscar Jones', + 'Jon Sanchez', + 'Kevin Anderson', + 'Yvonne Mullen', + 'Jonathan King', + 'Wendy Hernandez' +] + +FAKE_NUMBERS = range(1, 30) + + +class DigestPreview(http.Controller): + + digest_test_template = 'mail_digest.digest_layout_preview' + + @http.route([ + '/digest/layout-preview', + ], type='http', auth='user') + def digest_test(self): + digest = self._fake_digest() + mail_values = digest._get_email_values() + values = { + 'env': request.env, + 'digest_html': mail_values['body_html'], + } + return request.render(self.digest_test_template, values) + + def _fake_digest(self): + user = request.env.user + digest_model = request.env['mail.digest'].sudo() + digest = digest_model.new() + digest.partner_id = user.partner_id + digest.digest_template_id = digest._default_digest_template_id() + digest.message_ids = self._fake_messages() + digest.sanitize_msg_body = True + return digest + + def _fake_messages(self): + messages = request.env['mail.message'].sudo() + subtype_model = request.env['mail.message.subtype'].sudo() + subtypes = subtype_model.search([]) + records = request.env['res.partner'].sudo().search([]) + # TODO: filter subtypes? + for i, subtype in enumerate(subtypes): + # generate a couple of messages for each type + for x in range(1, 3): + msg = messages.new() + msg.subtype_id = subtype + subject, body = self._fake_content(subtype, i, x) + msg.subject = subject + msg.body = body + msg.message_type = random.choice( + ('email', 'comment', 'notification')) + msg.email_from = 'random@user%d.com' % i + msg.partner_ids = [(6, 0, request.env.user.partner_id.ids)] + if i + x % 2 == 0: + # relate a document + msg.model = records._name + msg.res_id = random.choice(records.ids) + messages += msg + return messages + + def _fake_content(self, subtype, i, x): + subject = 'Lorem ipsum %d / %d' % (i, x) + body = 'Random text here lorem ipsum %d / %d' % (i, x) + if i % 2 == 0 and x > 1: + # simulate also random styles that are goin to be stripped + body = """ +

Lorem ipsum dolor sit amet, cetero menandri mel id.

+ +

Ad modus tantas qui, quo choro facete delicata te. + Epicurei accusata vix eu, prima erant graeci sit te, + vivendum molestiae an mel.

+ +

Sed apeirian atomorum id, no ius possit antiopam molestiae.

+ """ # noqa + return subject, body.strip() + + def _fake_tracking_vals(self): + tracking_model = request.env['mail.tracking.value'].sudo() + track_vals1 = tracking_model.create_tracking_values( + random.choice(FAKE_NAMES), random.choice(FAKE_NAMES), + 'name', {'type': 'char', 'string': 'Name'}, + ) + track_vals2 = tracking_model.create_tracking_values( + random.choice(FAKE_NUMBERS), random.choice(FAKE_NUMBERS), + 'count', {'type': 'integer', 'string': 'Count'}, + ) + return [ + (0, 0, track_vals1), + (0, 0, track_vals2), + ] diff --git a/mail_digest/images/digest_layout_preview.png b/mail_digest/images/digest_layout_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..3c64aa93fbc4f91349de41a059e3cd844286d111 GIT binary patch literal 70638 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 z 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 I$MEfc00j(F&Hw-a literal 0 HcmV?d00001 diff --git a/mail_digest/templates/digest_layout_preview.xml b/mail_digest/templates/digest_layout_preview.xml new file mode 100644 index 00000000..0ca9f8be --- /dev/null +++ b/mail_digest/templates/digest_layout_preview.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/mail_digest/tests/__init__.py b/mail_digest/tests/__init__.py index 1e4552ba..444774b5 100644 --- a/mail_digest/tests/__init__.py +++ b/mail_digest/tests/__init__.py @@ -1,3 +1,4 @@ from . import test_digest from . import test_partner_domains from . import test_subtypes_conf +from . import test_preview \ No newline at end of file diff --git a/mail_digest/tests/test_preview.py b/mail_digest/tests/test_preview.py new file mode 100644 index 00000000..6f2f824a --- /dev/null +++ b/mail_digest/tests/test_preview.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo.tests.common import SavepointCase +import mock +from ..controllers.digest_layout_preview import DigestPreview + +REQUEST_PATH = 'odoo.addons.mail_digest.controllers.digest_layout_preview' + + +class PreviewCase(SavepointCase): + """Easy tests for preview controller to make codecov happy.""" + + @classmethod + def setUpClass(cls): + super(PreviewCase, cls).setUpClass() + cls.ctrl = DigestPreview() + + @mock.patch(REQUEST_PATH + '.request') + def test_fake_digest(self, patched_req): + patched_req.env = self.env + digest = self.ctrl._fake_digest() + self.assertEqual( + digest.partner_id, self.env.user.partner_id, + ) + self.assertEqual( + digest.digest_template_id, digest._default_digest_template_id(), + ) + self.assertTrue(digest.message_ids) + self.assertTrue(digest.sanitize_msg_body) + + @mock.patch(REQUEST_PATH + '.request') + def test_fake_messages(self, patched_req): + patched_req.env = self.env + all_types = self.env['mail.message.subtype'].search([]) + messages = self.ctrl._fake_messages() + self.assertEqual( + len(messages), len(all_types) * 2 + ) + + @mock.patch(REQUEST_PATH + '.request') + def test_fake_content(self, patched_req): + patched_req.env = self.env + subj, body = self.ctrl._fake_content(None, 1, 2) + body = 'Random text here lorem ipsum 1 / 2' + self.assertEqual(subj, 'Lorem ipsum 1 / 2') + self.assertEqual(body, 'Random text here lorem ipsum 1 / 2') + subj, body = self.ctrl._fake_content(None, 2, 2) + self.assertEqual(subj, 'Lorem ipsum 2 / 2') + self.assertTrue(body.startswith('

-

Hello,

+

Hello ,

- + - -
-

- + +
+ +

+ + + + +

+ +
+ +
+
From 81c3afa894b1bdb1bbd410797d676beeab53181b Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Thu, 26 Apr 2018 11:44:16 +0200 Subject: [PATCH 4/4] mail_digest: display mail tracking values Prior to this change we could have digest messages w/ no content. Now we display mail tracking values if any. --- mail_digest/controllers/digest_layout_preview.py | 6 +++++- mail_digest/templates/digest_default.xml | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/mail_digest/controllers/digest_layout_preview.py b/mail_digest/controllers/digest_layout_preview.py index f3abc871..2766a52b 100644 --- a/mail_digest/controllers/digest_layout_preview.py +++ b/mail_digest/controllers/digest_layout_preview.py @@ -92,7 +92,6 @@ class DigestPreview(http.Controller): msg.subtype_id = subtype subject, body = self._fake_content(subtype, i, x) msg.subject = subject - msg.body = body msg.message_type = random.choice( ('email', 'comment', 'notification')) msg.email_from = 'random@user%d.com' % i @@ -101,6 +100,11 @@ class DigestPreview(http.Controller): # relate a document msg.model = records._name msg.res_id = random.choice(records.ids) + # simulate messages w/ no body but tracking values + if x == random.choice([1, 2]): + msg.tracking_value_ids = self._fake_tracking_vals() + else: + msg.body = body messages += msg return messages diff --git a/mail_digest/templates/digest_default.xml b/mail_digest/templates/digest_default.xml index 4343b975..66c10f66 100644 --- a/mail_digest/templates/digest_default.xml +++ b/mail_digest/templates/digest_default.xml @@ -43,6 +43,18 @@
+ +

Changed values

+
    + +
  • + : + → + +
  • +
    +
+