From 95754eb6a464894417e8f763ae0fc4933ca3a157 Mon Sep 17 00:00:00 2001 From: Antoine Guenet Date: Fri, 6 Aug 2021 14:54:08 +0000 Subject: [PATCH] [FIX] mass_mailing: save transpiled html without affecting body_arch Since the introduction of Odoo Editor, `field_html`'s `_getValue` uses `wysiwyg.getValue`. This conflicts with the mechanism of `mass_mailing` which modifies the html of the editable area in place to save an "e-mailable" version on the `body_html` field, then relies on `_getValue` to reset the original html (`body_arch`). This ensures the field has a value before modifying the html in place, so we can manually restore it instead of relying on a side effect of the old behavior of `_getValue`. Part-of: odoo/odoo#75901 --- .../static/src/js/mass_mailing_widget.js | 2 ++ .../src/js/tours/mass_mailing_editor_tour.js | 28 +++++++++++++++++++ addons/mass_mailing/tests/__init__.py | 1 + addons/mass_mailing/tests/test_mailing_ui.py | 23 +++++++++++++++ .../static/src/js/backend/convert_inline.js | 2 +- 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 addons/mass_mailing/static/src/js/tours/mass_mailing_editor_tour.js create mode 100644 addons/mass_mailing/tests/test_mailing_ui.py diff --git a/addons/mass_mailing/static/src/js/mass_mailing_widget.js b/addons/mass_mailing/static/src/js/mass_mailing_widget.js index 4bf467efeec..c798ccd26ec 100644 --- a/addons/mass_mailing/static/src/js/mass_mailing_widget.js +++ b/addons/mass_mailing/static/src/js/mass_mailing_widget.js @@ -65,6 +65,7 @@ var MassMailingFieldHtml = FieldHtml.extend({ } return this.wysiwyg.saveModifiedImages(this.$content).then(function () { self._isDirty = self.wysiwyg.isDirty(); + self._doAction(); convertInline.attachmentThumbnailToLinkImg($editable); convertInline.fontToImg($editable); @@ -84,6 +85,7 @@ var MassMailingFieldHtml = FieldHtml.extend({ changes: _.object([fieldName], [self._unWrap($editable.html())]) }); + $editable.html(self.value); if (self._isDirty && self.mode === 'edit') { return self._doAction(); } diff --git a/addons/mass_mailing/static/src/js/tours/mass_mailing_editor_tour.js b/addons/mass_mailing/static/src/js/tours/mass_mailing_editor_tour.js new file mode 100644 index 00000000000..ea79d62e2a7 --- /dev/null +++ b/addons/mass_mailing/static/src/js/tours/mass_mailing_editor_tour.js @@ -0,0 +1,28 @@ +odoo.define('mass_mailing.mass_mailing_editor_tour', function (require) { + "use strict"; + + var tour = require('web_tour.tour'); + + tour.register('mass_mailing_editor_tour', { + url: '/web', + test: true, + }, [tour.stepUtils.showAppsMenuItem(), { + trigger: '.o_app[data-menu-xmlid="mass_mailing.mass_mailing_menu_root"]', + }, { + trigger: 'button.o_list_button_add', + }, { + trigger: 'input[name="subject"]', + run: 'text Test', + }, { + trigger: 'div[name="contact_list_ids"] .o_input_dropdown > input[type="text"]', + }, { + trigger: 'li.ui-menu-item', + }, { + trigger: 'iframe #default', + run: () => $('iframe').contents().find('o_editable').html('


'), + }, { + trigger: 'button.o_form_button_save', + }, { + trigger: 'iframe.o_readonly', + }]); +}); diff --git a/addons/mass_mailing/tests/__init__.py b/addons/mass_mailing/tests/__init__.py index 9b913f3af21..60b0223b293 100644 --- a/addons/mass_mailing/tests/__init__.py +++ b/addons/mass_mailing/tests/__init__.py @@ -7,3 +7,4 @@ from . import test_mailing_internals from . import test_mailing_list from . import test_mailing_controllers from . import test_mailing_mailing_schedule_date +from . import test_mailing_ui diff --git a/addons/mass_mailing/tests/test_mailing_ui.py b/addons/mass_mailing/tests/test_mailing_ui.py new file mode 100644 index 00000000000..808bb608d1c --- /dev/null +++ b/addons/mass_mailing/tests/test_mailing_ui.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import odoo.tests +from odoo.addons.base.tests.common import HttpCaseWithUserDemo + + +@odoo.tests.tagged('-at_install', 'post_install') +class TestUi(HttpCaseWithUserDemo): + def setUp(self): + super().setUp() + self.user_demo.groups_id |= self.env.ref('mass_mailing.group_mass_mailing_user') + self.user_demo.groups_id |= self.env.ref('mail.group_mail_template_editor') + + def test_01_mass_mailing_editor_tour(self): + self.start_tour("/web", 'mass_mailing_editor_tour', login="demo") + mail = self.env['mailing.mailing'].search([('subject', '=', 'Test')])[0] + # The tour created and saved an email. The edited version should be + # saved in body_arch, and its transpiled version (see convert_inline) + # for email client compatibility should be saved in body_html. This + # ensures both fields have different values. + self.assertEqual(mail.body_arch, '


') + self.assertEqual(mail.body_html, '


') diff --git a/addons/web_editor/static/src/js/backend/convert_inline.js b/addons/web_editor/static/src/js/backend/convert_inline.js index 6ed40307dcd..cdb70d32878 100644 --- a/addons/web_editor/static/src/js/backend/convert_inline.js +++ b/addons/web_editor/static/src/js/backend/convert_inline.js @@ -24,7 +24,7 @@ function getMatchedCSSRules(a) { try { rules = sheets[i].rules || sheets[i].cssRules; } catch (e) { - console.warn("Can't read the css rules of: " + sheets[i].href, e); + console.log("Can't read the css rules of: " + sheets[i].href, e); continue; } if (rules) {