[IMP] reimplement t-field using new converters

bzr revid: xmo@openerp.com-20130926145126-21hlubvs39a0z68j
This commit is contained in:
Xavier Morel 2013-09-26 16:51:26 +02:00
parent 2707b17771
commit c741c0eeb1
3 changed files with 47 additions and 32 deletions

View File

@ -475,11 +475,11 @@ class selection(_column):
translation_filter = "%s,%s" % (model._name, field_name) translation_filter = "%s,%s" % (model._name, field_name)
translate = functools.partial( translate = functools.partial(
(model.pool['ir.translation'])._get_source, model.pool['ir.translation']._get_source,
cr, uid, translation_filter, 'selection', context['lang']) cr, uid, translation_filter, 'selection', context['lang'])
return [ return [
(value, translate(source=label)) (value, translate(label))
for value, label in field.selection for value, label in field.selection
] ]

View File

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from collections import namedtuple
from xml.dom import minidom as dom from xml.dom import minidom as dom
import common import common
@ -8,6 +9,13 @@ from ..tools import qweb
impl = dom.getDOMImplementation() impl = dom.getDOMImplementation()
document = impl.createDocument(None, None, None) document = impl.createDocument(None, None, None)
Request = namedtuple('Request', 'cr uid registry')
class RegistryProxy(object):
def __init__(self, func):
self.func = func
def __getitem__(self, name):
return self.func(name)
class TestQWebTField(common.TransactionCase): class TestQWebTField(common.TransactionCase):
def setUp(self): def setUp(self):
super(TestQWebTField, self).setUp() super(TestQWebTField, self).setUp()
@ -23,7 +31,10 @@ class TestQWebTField(common.TransactionCase):
}) })
root_company = Companies.browse(self.cr, self.uid, company_id) root_company = Companies.browse(self.cr, self.uid, company_id)
result = self.engine.render_node(field, {'company': root_company}) result = self.engine.render_node(field, {
'company': root_company,
'request': Request(self.cr, self.uid, RegistryProxy(self.registry))
})
self.assertEqual( self.assertEqual(
result, result,

View File

@ -1,7 +1,7 @@
import cgi
import logging import logging
import re import re
import werkzeug.utils
#from openerp.tools.safe_eval import safe_eval as eval #from openerp.tools.safe_eval import safe_eval as eval
import xml # FIXME use lxml import xml # FIXME use lxml
@ -183,7 +183,7 @@ class QWebXml(object):
t_render = an[2:] t_render = an[2:]
t_att[an[2:]] = av t_att[an[2:]] = av
else: else:
g_att += ' %s="%s"' % (an, cgi.escape(av, 1)) g_att += ' %s="%s"' % (an, werkzeug.utils.escape(av))
if 'debug' in t_att: if 'debug' in t_att:
debugger = t_att.get('debug', 'pdb') debugger = t_att.get('debug', 'pdb')
@ -193,6 +193,8 @@ class QWebXml(object):
r = self._render_tag[t_render](self, e, t_att, g_att, v) r = self._render_tag[t_render](self, e, t_att, g_att, v)
else: else:
r = self.render_element(e, t_att, g_att, v) r = self.render_element(e, t_att, g_att, v)
if isinstance(r, unicode):
return r.encode('utf-8')
return r return r
def render_element(self, e, t_att, g_att, v, inner=None): def render_element(self, e, t_att, g_att, v, inner=None):
@ -235,7 +237,7 @@ class QWebXml(object):
val = val.encode("utf8") val = val.encode("utf8")
else: else:
att, val = self.eval_object(av, v) att, val = self.eval_object(av, v)
return val and ' %s="%s"' % (att, cgi.escape(str(val), 1)) or " " return val and ' %s="%s"' % (att, werkzeug.utils.escape(val)) or " "
def render_att_href(self, e, an, av, v): def render_att_href(self, e, an, av, v):
return self.url_for(e, an, av, v) return self.url_for(e, an, av, v)
@ -259,11 +261,11 @@ class QWebXml(object):
return self.render_element(e, t_att, g_att, v, inner) return self.render_element(e, t_att, g_att, v, inner)
def render_tag_esc(self, e, t_att, g_att, v): def render_tag_esc(self, e, t_att, g_att, v):
inner = cgi.escape(self.eval_str(t_att["esc"], v)) inner = werkzeug.utils.escape(self.eval_str(t_att["esc"], v))
return self.render_element(e, t_att, g_att, v, inner) return self.render_element(e, t_att, g_att, v, inner)
def render_tag_escf(self, e, t_att, g_att, v): def render_tag_escf(self, e, t_att, g_att, v):
inner = cgi.escape(self.eval_format(t_att["escf"], v)) inner = werkzeug.utils.escape(self.eval_format(t_att["escf"], v))
return self.render_element(e, t_att, g_att, v, inner) return self.render_element(e, t_att, g_att, v, inner)
def render_tag_foreach(self, e, t_att, g_att, v): def render_tag_foreach(self, e, t_att, g_att, v):
@ -336,32 +338,34 @@ class QWebXml(object):
record, field = t_att["field"].rsplit('.', 1) record, field = t_att["field"].rsplit('.', 1)
record = self.eval_object(record, v) record = self.eval_object(record, v)
inner = None column = record._model._all_columns[field].column
field_type = record._model._all_columns[field].column._type field_type = column._type
req = v['request']
converter = req.registry['ir.fields.converter'].from_field(
req.cr, req.uid, record._model, column, totype='html')
content = None
try: try:
if field_type == 'many2one': value = record[field]
field_data = record.read([field])[0].get(field) if value:
inner = field_data and field_data[1] content, warnings = converter(value)
else: assert not warnings
inner = getattr(record, field) except KeyError:
if isinstance(inner, unicode):
inner = inner.encode("utf8")
g_att += ''.join(
' %s="%s"' % (name, cgi.escape(str(value), True))
for name, value in [
('data-oe-model', record._model._name),
('data-oe-id', str(record.id)),
('data-oe-field', field),
('data-oe-type', column._type),
('data-oe-translate', '1' if column.translate else '0'),
('data-oe-expression', t_att['field']),
]
)
except AttributeError:
_logger.warning("t-field no field %s for model %s", field, record._model._name) _logger.warning("t-field no field %s for model %s", field, record._model._name)
return self.render_element(e, t_att, g_att, v, str(inner or "")) g_att += ''.join(
' %s="%s"' % (name, werkzeug.utils.escape(value))
for name, value in [
('data-oe-model', record._model._name),
('data-oe-id', record.id),
('data-oe-field', field),
('data-oe-type', field_type),
('data-oe-translate', '1' if column.translate else '0'),
('data-oe-expression', t_att['field']),
]
)
return self.render_element(e, t_att, g_att, v, content or "")
# leave this, al. # leave this, al.