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.