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 00000000..3c64aa93 Binary files /dev/null and b/mail_digest/images/digest_layout_preview.png differ 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('