diff --git a/addons/web/static/lib/qweb/qweb-test-attributes.xml b/addons/web/static/lib/qweb/qweb-test-attributes.xml
index bf6070fed08..e16ef8a3f0e 100644
--- a/addons/web/static/lib/qweb/qweb-test-attributes.xml
+++ b/addons/web/static/lib/qweb/qweb-test-attributes.xml
@@ -1,4 +1,14 @@
+
+
+
+ ]]>
+
+
+
+
+ ]]>
+
@@ -55,4 +65,19 @@
]]>
+
+
+
+
+ ",
+ "baz": "\"\"",
+ "qux": {"qux": "<>"}
+ }]]>
+
+ ]]>
diff --git a/addons/web/static/lib/qweb/qweb-test-global.xml b/addons/web/static/lib/qweb/qweb-test-global.xml
new file mode 100644
index 00000000000..1db3e5920fb
--- /dev/null
+++ b/addons/web/static/lib/qweb/qweb-test-global.xml
@@ -0,0 +1,54 @@
+
+
+
+
+ foo default
+ toto default
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ i
+
+
+
+ 4
+
+ aaa
+ foo default
+
+ bbb
+
+
+ 5
+
+ aaa
+ foo default
+
+ bbb
+
+
+ 6
+
+ aaa
+ foo default
+
+ bbb
+
+
+ toto default
+
+ i
+ ]]>
+
diff --git a/addons/web/static/lib/qweb/qweb-test-output.xml b/addons/web/static/lib/qweb/qweb-test-output.xml
index f91196a86cf..cbe7f051d7d 100644
--- a/addons/web/static/lib/qweb/qweb-test-output.xml
+++ b/addons/web/static/lib/qweb/qweb-test-output.xml
@@ -16,6 +16,10 @@
"}]]>
+
+
+
+ ok]]>
diff --git a/addons/web/static/lib/qweb/qweb-test.js.html b/addons/web/static/lib/qweb/qweb-test.js.html
index 59f82d150ae..0ee5f27c3bd 100644
--- a/addons/web/static/lib/qweb/qweb-test.js.html
+++ b/addons/web/static/lib/qweb/qweb-test.js.html
@@ -59,6 +59,7 @@
test("Template calling (to the faraway pages)",
'qweb-test-call.xml');
test("Foreach", 'qweb-test-foreach.xml');
+ test("Global", 'qweb-test-global.xml');
test('Template inheritance', 'qweb-test-extend.xml');
});
diff --git a/addons/web_editor/tests/test_converter.py b/addons/web_editor/tests/test_converter.py
index 6772a15019a..f166e176412 100644
--- a/addons/web_editor/tests/test_converter.py
+++ b/addons/web_editor/tests/test_converter.py
@@ -125,15 +125,17 @@ class TestConvertBack(common.TransactionCase):
model = 'web_editor.converter.test'
record = self.env[model].create({field: value})
+ t = etree.Element('t')
e = etree.Element('span')
+ t.append(e)
field_value = 'record.%s' % field
e.set('t-field', field_value)
qwebcontext = self.qwebcontext({'record': record})
- rendered = self.env['ir.qweb'].render_tag_field(e, {'field': field_value}, '', qwebcontext)
- element = html.fromstring(rendered, parser=html.HTMLParser(encoding='utf-8'))
+ rendered = self.env['ir.qweb'].compile(t)(qwebcontext)
- converter = self.env['ir.qweb'].get_converter_for(element.get('data-oe-type'))
+ element = html.fromstring(rendered, parser=html.HTMLParser(encoding='utf-8'))
+ converter = self.env['ir.qweb'].get_field_for(element.get('data-oe-type'))
value_back = converter.from_html(model, record._fields[field], element)
if isinstance(expected, str):
@@ -188,27 +190,28 @@ class TestConvertBack(common.TransactionCase):
""" the M2O field conversion (from html) is markedly different from
others as it directly writes into the m2o and returns nothing at all.
"""
- model = 'web_editor.converter.test'
field = 'many2one'
subrec1 = self.env['web_editor.converter.test.sub'].create({'name': "Foo"})
subrec2 = self.env['web_editor.converter.test.sub'].create({'name': "Bar"})
- record = self.env[model].create({field: subrec1.id})
+ record = self.env['web_editor.converter.test'].create({field: subrec1.id})
+ t = etree.Element('t')
e = etree.Element('span')
+ t.append(e)
field_value = 'record.%s' % field
e.set('t-field', field_value)
qwebcontext = self.qwebcontext({'record': record})
- rendered = self.env['ir.qweb'].render_tag_field(e, {'field': field_value}, '', qwebcontext)
+ rendered = self.env['ir.qweb'].compile(t)(qwebcontext)
element = html.fromstring(rendered, parser=html.HTMLParser(encoding='utf-8'))
# emulate edition
element.set('data-oe-many2one-id', str(subrec2.id))
element.text = "New content"
- converter = self.env['ir.qweb'].get_converter_for(element.get('data-oe-type'))
- value_back = converter.from_html(model, record._fields[field], element)
+ converter = self.env['ir.qweb'].get_field_for(element.get('data-oe-type'))
+ value_back = converter.from_html('web_editor.converter.test', record._fields[field], element)
self.assertIsNone(
value_back, "the m2o converter should return None to avoid spurious"
diff --git a/openerp/addons/base/tests/test_qweb.py b/openerp/addons/base/tests/test_qweb.py
index 65b1ffc6d54..63a280579ed 100644
--- a/openerp/addons/base/tests/test_qweb.py
+++ b/openerp/addons/base/tests/test_qweb.py
@@ -113,10 +113,9 @@ class TestQWeb(TransactionCase):
self.assertEqual(
qweb.render(template, qwebcontext=ctx).strip().encode('utf-8'),
(result or u'').strip().encode('utf-8'),
- template,
+ template
)
-
def load_tests(loader, suite, _):
# can't override TestQWeb.__dir__ because dir() called on *class* not
# instance
diff --git a/openerp/addons/test_assetsbundle/tests/test_assetsbundle.py b/openerp/addons/test_assetsbundle/tests/test_assetsbundle.py
index 5eee3943413..c6c62f3de6e 100644
--- a/openerp/addons/test_assetsbundle/tests/test_assetsbundle.py
+++ b/openerp/addons/test_assetsbundle/tests/test_assetsbundle.py
@@ -4,7 +4,7 @@
from openerp import api
from openerp.tests import HttpCase
from openerp.tests.common import TransactionCase
-from openerp.addons.base.ir.ir_qweb import AssetsBundle, QWebContext
+from openerp.addons.base.ir.ir_qweb import QWebContext
from openerp.modules.module import get_resource_path
from collections import Counter
@@ -19,7 +19,7 @@ class TestJavascriptAssetsBundle(TransactionCase):
self.cssbundle_xmlid = 'test_assetsbundle.bundle2'
def _get_asset(self, xmlid, env=None):
- return self.en['ir.qweb']._get_asset(xmlid, QWebContext(env or self.env, {}))
+ return self.env['ir.qweb']._get_asset(xmlid, QWebContext(env or self.env, {}))
def _any_ira_for_bundle(self, type):
""" Returns all ir.attachments associated to a bundle, regardless of the verion.
@@ -98,7 +98,8 @@ class TestJavascriptAssetsBundle(TransactionCase):
"""
bundle0 = self._get_asset(self.jsbundle_xmlid)
bundle0.js()
- html0 = bundle0.html
+ files0 = bundle0.files
+ remains0 = bundle0.remains
version0 = bundle0.version
self.assertEquals(len(self._any_ira_for_bundle('js')), 1)
@@ -120,10 +121,12 @@ class TestJavascriptAssetsBundle(TransactionCase):
bundle1 = self._get_asset(self.jsbundle_xmlid, env=self.env(context={'check_view_ids': [newid]}))
bundle1.js()
- html1 = bundle1.html
+ files1 = bundle1.files
+ remains1 = bundle1.remains
version1 = bundle1.version
- self.assertNotEquals(html0, html1)
+ self.assertNotEquals(files0, files1)
+ self.assertEquals(remains0, remains1)
self.assertNotEquals(version0, version1)
# check if the previous attachment are correctly cleaned
@@ -228,7 +231,8 @@ class TestJavascriptAssetsBundle(TransactionCase):
"""
bundle0 = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'max_css_rules': 1}))
bundle0.css()
- html0 = bundle0.html
+ files0 = bundle0.files
+ remains0 = bundle0.remains
version0 = bundle0.version
self.assertEquals(len(self._any_ira_for_bundle('css')), 3)
@@ -250,10 +254,12 @@ class TestJavascriptAssetsBundle(TransactionCase):
bundle1 = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'check_view_ids': [newid], 'max_css_rules': 1}))
bundle1.css()
- html1 = bundle1.html
+ files1 = bundle1.files
+ remains1 = bundle1.remains
version1 = bundle1.version
- self.assertNotEquals(html0, html1)
+ self.assertNotEquals(files0, files1)
+ self.assertEquals(remains0, remains1)
self.assertNotEquals(version0, version1)
# check if the previous attachment are correctly cleaned
@@ -342,7 +348,8 @@ class TestAssetsBundleWithIRAMock(TransactionCase):
def _bundle(self, should_create, should_unlink):
self.counter.clear()
- self.en['ir.qweb']._get_asset(self.lessbundle_xmlid, QWebContext(self.env, {})).to_html(debug='assets')
+ qw = QWebContext(self.env, {})
+ self.env['ir.qweb']._get_asset(self.lessbundle_xmlid, qw).to_html(debug='assets')
self.assertEquals(self.counter['create'], int(should_create))
self.assertEquals(self.counter['unlink'], int(should_unlink))
diff --git a/openerp/addons/test_converter/models.py b/openerp/addons/test_converter/models.py
index 9dd2f486af0..94a69ae3554 100644
--- a/openerp/addons/test_converter/models.py
+++ b/openerp/addons/test_converter/models.py
@@ -17,7 +17,7 @@ class test_model(orm.Model):
(1, "réponse A"),
(2, "réponse B"),
(3, "réponse C"),
- (4, "réponse D"),
+ (4, "réponse "),
]),
'selection_str': fields.selection([
('A', "Qu'il n'est pas arrivé à Toronto"),
diff --git a/openerp/addons/test_converter/tests/test_html.py b/openerp/addons/test_converter/tests/test_html.py
index 36b4f2fa2d0..def7184d237 100644
--- a/openerp/addons/test_converter/tests/test_html.py
+++ b/openerp/addons/test_converter/tests/test_html.py
@@ -1,10 +1,7 @@
# -*- encoding: utf-8 -*-
-import json
import os
import datetime
-from lxml import etree
-
from openerp.tests import common
from openerp.tools import html_escape as e
from openerp.addons.base.ir.ir_qweb import QWebContext
@@ -34,8 +31,8 @@ class TestExport(common.TransactionCase):
break
except KeyError: pass
- return lambda value, options=None, context=None: e(model.value_to_html(
- self.cr, self.uid, value, field, options=options, context=context))
+ return lambda value, options=None, context=None: model.value_to_html(
+ self.cr, self.uid, value, field, options=options, context=context)
class TestBasicExport(TestExport):
_model = 'test_converter.test_model'
@@ -106,17 +103,10 @@ class TestCurrencyExport(TestExport):
converter = self.registry('ir.qweb.field.monetary')
options = {
'widget': 'monetary',
- 'display_currency': 'c2'
+ 'display_currency': dest
}
- context = dict(inherit_branding=True)
- converted = converter.to_html(
- self.cr, self.uid, 'value', obj, options,
- etree.Element('span'),
- {'field': 'obj.value', 'field-options': json.dumps(options)},
- '', QWebContext(self.env, {'obj': obj, 'c2': dest, }),
- context=context,
- )
- return converted
+ return converter.record_to_html(self.cr, self.uid, obj, 'value', options,
+ QWebContext(self.env(context=dict(inherit_branding=True)), {'obj': obj}))
def test_currency_post(self):
currency = self.create(self.Currency, name="Test", symbol=u"test")
@@ -125,15 +115,11 @@ class TestCurrencyExport(TestExport):
converted = self.convert(obj, dest=currency)
self.assertEqual(
- converted,
- ''
- '0.12'
- u'\N{NO-BREAK SPACE}{symbol}'.format(
+ converted, '0.12'
+ u'\N{NO-BREAK SPACE}{symbol}'.format(
obj=obj,
symbol=currency.symbol.encode('utf-8')
- ).encode('utf-8'),)
+ ),)
def test_currency_pre(self):
currency = self.create(
@@ -144,15 +130,11 @@ class TestCurrencyExport(TestExport):
self.assertEqual(
converted,
- ''
u'{symbol}\N{NO-BREAK SPACE}'
- '0.12'
- ''.format(
+ '0.12'.format(
obj=obj,
symbol=currency.symbol.encode('utf-8')
- ).encode('utf-8'),)
+ ),)
def test_currency_precision(self):
""" Precision should be the currency's, not the float field's
@@ -164,14 +146,11 @@ class TestCurrencyExport(TestExport):
self.assertEqual(
converted,
- ''
'0.12'
- u'\N{NO-BREAK SPACE}{symbol}'.format(
+ u'\N{NO-BREAK SPACE}{symbol}'.format(
obj=obj,
symbol=currency.symbol.encode('utf-8')
- ).encode('utf-8'),)
+ ),)
class TestTextExport(TestBasicExport):
def test_text(self):
@@ -221,8 +200,9 @@ class TestMany2OneExport(TestBasicExport):
})
def converter(record):
- model = self.registry('ir.qweb.field.many2one')
- return e(model.record_to_html(self.cr, self.uid, 'many2one', record))
+ converter = self.registry('ir.qweb.field.many2one')
+ field_name = 'many2one'
+ return converter.record_to_html(self.cr, self.uid, record, field_name, {})
value = converter(self.Model.browse(self.cr, self.uid, id0))
self.assertEqual(value, "Foo")
@@ -239,8 +219,8 @@ class TestBinaryExport(TestBasicExport):
content = f.read()
encoded_content = content.encode('base64')
- value = e(converter.value_to_html(
- self.cr, self.uid, encoded_content, field))
+ value = converter.value_to_html(self.cr, self.uid, encoded_content, field)
+
self.assertEqual(
value, '
' % (
encoded_content
@@ -250,32 +230,32 @@ class TestBinaryExport(TestBasicExport):
content = f.read()
with self.assertRaises(ValueError):
- e(converter.value_to_html(
- self.cr, self.uid, 'binary', content.encode('base64'), field))
+ converter.value_to_html(
+ self.cr, self.uid, 'binary', content.encode('base64'), field)
with open(os.path.join(directory, 'test_vectors', 'pptx'), 'rb') as f:
content = f.read()
with self.assertRaises(ValueError):
- e(converter.value_to_html(
- self.cr, self.uid, 'binary', content.encode('base64'), field))
+ converter.value_to_html(
+ self.cr, self.uid, 'binary', content.encode('base64'), field)
class TestSelectionExport(TestBasicExport):
def test_selection(self):
[record] = self.Model.browse(self.cr, self.uid, [self.Model.create(self.cr, self.uid, {
- 'selection': 2,
+ 'selection': 4,
'selection_str': 'C',
})])
converter = self.registry('ir.qweb.field.selection')
field_name = 'selection'
- value = converter.record_to_html(self.cr, self.uid, field_name, record)
- self.assertEqual(value, "réponse B")
+ value = converter.record_to_html(self.cr, self.uid, record, field_name, {})
+ self.assertEqual(value, e(u"réponse "))
field_name = 'selection_str'
- value = converter.record_to_html(self.cr, self.uid, field_name, record)
- self.assertEqual(value, "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?")
+ value = converter.record_to_html(self.cr, self.uid, record, field_name, {})
+ self.assertEqual(value, u"Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?")
class TestHTMLExport(TestBasicExport):
def test_html(self):