[REM] automagic tag creation in t-field rendering

bzr revid: xmo@openerp.com-20130925121028-s1i1628vt7rtopzn
This commit is contained in:
Xavier Morel
2013-09-25 14:10:28 +02:00
parent 2101023873
commit c36bd85c27
4 changed files with 59 additions and 24 deletions
+2
View File
@@ -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:
-1
View File
@@ -103,7 +103,6 @@ class TestACL(common.TransactionCase):
finally:
self.res_partner._columns['email'].groups = False
if __name__ == '__main__':
unittest2.main()
+52
View File
@@ -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,
'<span data-oe-model="res.company" data-oe-id="%d" '
'data-oe-field="name" data-oe-type="char" '
'data-oe-expression="company.name">%s</span>' % (
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})
+5 -23
View File
@@ -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 <t> element, by default only its text will be
# rendered losing the information that it's a tag and completely breaking
# edition => replace <t> 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.