diff --git a/addons/website/tests/test_views.py b/addons/website/tests/test_views.py
index 06a1be33048..40a976d4e7d 100644
--- a/addons/website/tests/test_views.py
+++ b/addons/website/tests/test_views.py
@@ -195,7 +195,7 @@ class TestViewSaving(common.TransactionCase):
def test_save_escaped_text(self):
""" Test saving html special chars in text nodes """
view = self.env['ir.ui.view'].create({
- 'arch': 'hello world
',
+ 'arch': 'hello world
',
'type': 'qweb'
})
# script and style text nodes should not escaped client side
diff --git a/odoo/addons/base/ir/ir_qweb/ir_qweb.py b/odoo/addons/base/ir/ir_qweb/ir_qweb.py
index 6b71606395f..feda00e23ac 100644
--- a/odoo/addons/base/ir/ir_qweb/ir_qweb.py
+++ b/odoo/addons/base/ir/ir_qweb/ir_qweb.py
@@ -77,18 +77,26 @@ class IrQWeb(models.AbstractModel, QWeb):
env = self.env
if lang != env.context.get('lang'):
env = env(context=dict(env.context, lang=lang))
+
template = env['ir.ui.view'].read_template(name)
- res_id = isinstance(name, (int, long)) and name or None
- if res_id:
+ # QWeb's `read_template` will check if one of the first children of
+ # what we send to it has a "t-name" attribute having `name` as value
+ # to consider it has found it. As it'll never be the case when working
+ # with view ids or children view, force it here.
+ def is_child_view(view):
+ view_id = self.env['ir.ui.view'].get_view_id(name)
+ view = self.env['ir.ui.view'].browse(view_id)
+ return view.inherit_id is not None and view.mode != 'primary'
+
+ if isinstance(name, (int, long)) or is_child_view(name):
for node in etree.fromstring(template):
if node.get('t-name'):
- return node
- elif res_id and node.tag == "t":
- node.set('t-name', str(res_id))
- return node
-
- return template
+ node.set('t-name', str(name))
+ return node.getparent()
+ return None # trigger "template not found" in QWeb
+ else:
+ return template
# order
diff --git a/odoo/addons/base/ir/ir_qweb/qweb.py b/odoo/addons/base/ir/ir_qweb/qweb.py
index a50f478779f..e2ffc4bf399 100644
--- a/odoo/addons/base/ir/ir_qweb/qweb.py
+++ b/odoo/addons/base/ir/ir_qweb/qweb.py
@@ -335,6 +335,7 @@ class QWeb(object):
if isinstance(template, etree._Element):
document = template
template = etree.tostring(template)
+ return (document, template)
else:
try:
document = options.get('load', self.load)(template, options)
@@ -352,9 +353,8 @@ class QWeb(object):
else:
element = etree.parse(document).getroot()
for node in element:
- if node.get('t-name') == template:
+ if node.get('t-name') == str(template):
return (node, document)
- return (element, document)
raise QWebException("Template not found", name=template)