summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Lempereur <nle@odoo.com>2019-11-15 13:38:07 +0000
committerNicolas Lempereur <nle@odoo.com>2019-11-25 18:10:30 +0000
commit1c47f2070b76ee6c06d0c65e6a3cfc7c1ccdfbfb (patch)
treed1ca7f8287f32ea3908c0d08590079c8387be76f
parent70d856f2c7c0ba8358af86a243ee4b872e057e2b (diff)
[FIX] web_editor: update attribute of edition container
In most use case, when we edit the website we have a situation such as: ``` <div id="wrap" branding-attributes="..."> <section class="mycontent">hi!</section> </div> ``` When we modify a part, we replace all child nodes of the branded element. But if we had more complex content such as: ``` <div id="wrap"> <section class="mycontent" branding-attributes="...">ho!</section> <t t-call-assets="web.assets_common" t-js="false" t-css="false"/> </div> ``` we have a t-call inside the div#wrap, so branding is distributed to child that could have attribute modified (eg. changing background). Then if `<section/>` node is saved, the possibly modified attributes are lost. Without the change, the added test fails with: '<div class="nice">hoi</div>' not found in '...<div>hoi</div>...' : saved element attributes are saved excluding branding ones opw-2122947 closes #40345 closes odoo/odoo#40830 X-original-commit: 71b20a24c40ae9daa10076ab0fd656b043819cff Signed-off-by: Nicolas Lempereur (nle) <nle@odoo.com>
-rw-r--r--addons/web_editor/models/ir_ui_view.py7
-rw-r--r--addons/website/tests/test_views.py14
2 files changed, 21 insertions, 0 deletions
diff --git a/addons/web_editor/models/ir_ui_view.py b/addons/web_editor/models/ir_ui_view.py
index edda3ba6887..0d1100a0161 100644
--- a/addons/web_editor/models/ir_ui_view.py
+++ b/addons/web_editor/models/ir_ui_view.py
@@ -10,6 +10,8 @@ from odoo import api, fields, models
_logger = logging.getLogger(__name__)
+EDITING_ATTRIBUTES = ['data-oe-model', 'data-oe-id', 'data-oe-field', 'data-oe-xpath', 'data-note-id']
+
class IrUiView(models.Model):
_inherit = 'ir.ui.view'
@@ -132,6 +134,11 @@ class IrUiView(models.Model):
# Note: after a standard edition, the tail *must not* be replaced
if replace_tail:
root.tail = replacement.tail
+ # update attributes
+ root.attrib.clear()
+ root.attrib.update(replacement.attrib)
+ for attribute in EDITING_ATTRIBUTES:
+ root.attrib.pop(attribute, None)
# replace all children
del root[:]
for child in replacement:
diff --git a/addons/website/tests/test_views.py b/addons/website/tests/test_views.py
index d99e3c84e16..81b180fb1de 100644
--- a/addons/website/tests/test_views.py
+++ b/addons/website/tests/test_views.py
@@ -221,6 +221,20 @@ class TestViewSaving(common.TransactionCase):
'text node characters wrongly unescaped when rendering'
)
+ def test_save_node_with_attr(self):
+ """ Test saving node with saved element changed attrs """
+ view = self.env['ir.ui.view'].create({
+ 'arch': u'<t t-name="dummy"><div>hi</div><t esc="0"/></t>',
+ 'type': 'qweb'
+ })
+ replacement = u'<div data-oe-id="55" class="nice">hoi</div>'
+ view.save(replacement, xpath='/t/div')
+ self.assertIn(
+ '<div class="nice">hoi</div>',
+ view.arch,
+ 'saved element attributes are saved excluding branding ones'
+ )
+
def test_save_only_embedded(self):
Company = self.env['res.company']
company_id = 1