diff --git a/addons/web/static/lib/qweb/qweb-test-conditionals.xml b/addons/web/static/lib/qweb/qweb-test-conditionals.xml
index 1d038ee5908..d18ec404d6e 100644
--- a/addons/web/static/lib/qweb/qweb-test-conditionals.xml
+++ b/addons/web/static/lib/qweb/qweb-test-conditionals.xml
@@ -15,4 +15,18 @@
fail
+
+
+ beginok
+ ok-elseend
+
+ {"condition": true}
+ beginokend
+
+
+ beginfail
+ fail-elseend
+
+ {"condition": false}
+ beginfail-elseend
diff --git a/openerp/addons/base/ir/ir_qweb/qweb.py b/openerp/addons/base/ir/ir_qweb/qweb.py
index b1a18d80b12..dda4e1546c2 100644
--- a/openerp/addons/base/ir/ir_qweb/qweb.py
+++ b/openerp/addons/base/ir/ir_qweb/qweb.py
@@ -977,10 +977,13 @@ class QWeb(object):
return body
def _compile_directive_else(self, el, options):
+ if el.attrib.pop('t-else') == '_t_skip_else_':
+ return []
if not options.pop('t_if', None):
raise ValueError("t-else directive must be preceded by t-if directive")
- el.attrib.pop('t-else')
- return self._compile_directives(el, options)
+ compiled = self._compile_directives(el, options)
+ el.attrib['t-else'] = '_t_skip_else_'
+ return compiled
def _compile_directive_if(self, el, options):
orelse = []
@@ -990,7 +993,6 @@ class QWeb(object):
raise ValueError("Unexpected non-whitespace characters between t-if and t-else directives")
el.tail = None
orelse = self._compile_node(next_el, dict(options, t_if=True))
- next_el.getparent().remove(next_el)
return [
# if $t-if:
# next tag directive
diff --git a/openerp/addons/base/tests/test_qweb.py b/openerp/addons/base/tests/test_qweb.py
index a5247a13463..a6f75b70c4d 100644
--- a/openerp/addons/base/tests/test_qweb.py
+++ b/openerp/addons/base/tests/test_qweb.py
@@ -8,6 +8,7 @@ import os.path
import re
from lxml import etree
+from itertools import chain
from odoo.modules import get_module_resource
from odoo.tests.common import TransactionCase
@@ -85,6 +86,12 @@ class FileSystemLoader(object):
arch = etree.tostring(root, encoding='utf-8', xml_declaration=True)
return arch
+def stringify_children(node):
+ parts = ([node.text] +
+ list(chain(*([c.text, etree.tostring(c), c.tail] for c in node.getchildren() if not isinstance(c, etree._Comment)))) +
+ [node.tail])
+ # filter removes possible Nones in texts and tails
+ return ''.join(filter(None, parts))
class TestQWeb(TransactionCase):
matcher = re.compile(r'^qweb-test-(.*)\.xml$')
@@ -125,7 +132,7 @@ class TestQWeb(TransactionCase):
# so output is predictable & repeatable
params = {} if param is None else json.loads(param.text, object_pairs_hook=collections.OrderedDict)
- result = doc.find('result[@id="{}"]'.format(template)).text
+ result = stringify_children(doc.find('result[@id="{}"]'.format(template)))
self.assertEqual(
qweb.render(template, values=params, load=loader).strip().encode('utf-8'),
(result or u'').strip().encode('utf-8'),