From c36bd85c27ceb1e79cc265a71e69a5e52c22aefe Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 25 Sep 2013 14:10:28 +0200 Subject: [PATCH] [REM] automagic tag creation in t-field rendering bzr revid: xmo@openerp.com-20130925121028-s1i1628vt7rtopzn --- openerp/tests/__init__.py | 2 ++ openerp/tests/test_acl.py | 1 - openerp/tests/test_qweb.py | 52 ++++++++++++++++++++++++++++++++++++++ openerp/tools/qweb.py | 28 ++++---------------- 4 files changed, 59 insertions(+), 24 deletions(-) create mode 100644 openerp/tests/test_qweb.py diff --git a/openerp/tests/__init__.py b/openerp/tests/__init__.py index 3d129e06924..0e86effe8f0 100644 --- a/openerp/tests/__init__.py +++ b/openerp/tests/__init__.py @@ -21,6 +21,7 @@ import test_osv import test_translate import test_uninstall import test_view_validation +import test_qweb # This need a change in `oe run-tests` to only run fast_suite + checks by default. # import test_xmlrpc @@ -41,6 +42,7 @@ checks = [ test_misc, test_osv, test_translate, + test_qweb, ] # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/tests/test_acl.py b/openerp/tests/test_acl.py index e80390cd5a2..7f722f9fc19 100644 --- a/openerp/tests/test_acl.py +++ b/openerp/tests/test_acl.py @@ -103,7 +103,6 @@ class TestACL(common.TransactionCase): finally: self.res_partner._columns['email'].groups = False - if __name__ == '__main__': unittest2.main() diff --git a/openerp/tests/test_qweb.py b/openerp/tests/test_qweb.py new file mode 100644 index 00000000000..5553fe8e21f --- /dev/null +++ b/openerp/tests/test_qweb.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +from xml.dom import minidom as dom + +import common + +from ..tools import qweb + +impl = dom.getDOMImplementation() +document = impl.createDocument(None, None, None) + +class TestQWebTField(common.TransactionCase): + def setUp(self): + super(TestQWebTField, self).setUp() + self.engine = qweb.QWebXml() + + def test_trivial(self): + field = document.createElement('span') + field.setAttribute('t-field', u'company.name') + + Companies = self.registry('res.company') + company_id = Companies.create(self.cr, self.uid, { + 'name': "My Test Company" + }) + root_company = Companies.browse(self.cr, self.uid, company_id) + + result = self.engine.render_node(field, {'company': root_company}) + + self.assertEqual( + result, + '%s' % ( + company_id, + "My Test Company",)) + + def test_reject_crummy_tags(self): + field = document.createElement('td') + field.setAttribute('t-field', u'company.name') + + with self.assertRaisesRegexp( + AssertionError, + r'^RTE widgets do not work correctly'): + self.engine.render_node(field, {'company': None}) + + def test_reject_t_tag(self): + field = document.createElement('t') + field.setAttribute('t-field', u'company.name') + + with self.assertRaisesRegexp( + AssertionError, + r'^t-field can not be used on a t element'): + self.engine.render_node(field, {'company': None}) diff --git a/openerp/tools/qweb.py b/openerp/tools/qweb.py index 9699e2b5717..b80299aac8e 100644 --- a/openerp/tools/qweb.py +++ b/openerp/tools/qweb.py @@ -36,7 +36,7 @@ class QWebContext(dict): self.undefined_handler = undefined_handler dic = BUILTINS.copy() dic.update(data) - dict.__init__(self, dic) + super(QWebContext, self).__init__(dic) self['defined'] = lambda key: key in self def __getitem__(self, key): @@ -330,14 +330,16 @@ class QWebXml(object): node_name = e.nodeName assert node_name not in ("table", "tbody", "thead", "tfoot", "tr", "td"),\ "RTE widgets do not work correctly on %r elements" % node_name + assert node_name != 't',\ + "t-field can not be used on a t element, provide an actual HTML node" record, field = t_att["field"].rsplit('.', 1) record = self.eval_object(record, v) inner = None - column = record._model._all_columns[field].column + field_type = record._model._all_columns[field].column._type try: - if column._type == 'many2one': + if field_type == 'many2one': field_data = record.read([field])[0].get(field) inner = field_data and field_data[1] else: @@ -346,9 +348,6 @@ class QWebXml(object): if isinstance(inner, unicode): inner = inner.encode("utf8") - if node_name == 't': - e.nodeName = DEFAULT_TAG_BY_TYPE[column._type] - g_att += ''.join( ' %s="%s"' % (name, cgi.escape(str(value), True)) for name, value in [ @@ -365,21 +364,4 @@ class QWebXml(object): return self.render_element(e, t_att, g_att, v, str(inner or "")) -# If a t-field is set on a element, by default only its text will be -# rendered losing the information that it's a tag and completely breaking -# edition => replace by some default tag depending on field type -DEFAULT_TAG_BY_TYPE = { - 'integer': 'span', - 'float': 'span', - 'char': 'span', - 'date': 'span', - 'datetime': 'span', - 'time': 'span', - 'many2one': 'span', - - 'text': 'p', - - 'html': 'div', -} - # leave this, al.