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):