[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)
translate = functools.partial(
(model.pool['ir.translation'])._get_source,
model.pool['ir.translation']._get_source,
cr, uid, translation_filter, 'selection', context['lang'])
return [
(value, translate(source=label))
(value, translate(label))
for value, label in field.selection
]

View File

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
from collections import namedtuple
from xml.dom import minidom as dom
import common
@ -8,6 +9,13 @@ from ..tools import qweb
impl = dom.getDOMImplementation()
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):
def setUp(self):
super(TestQWebTField, self).setUp()
@ -23,7 +31,10 @@ class TestQWebTField(common.TransactionCase):
})
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(
result,

View File

@ -1,7 +1,7 @@
import cgi
import logging
import re
import werkzeug.utils
#from openerp.tools.safe_eval import safe_eval as eval
import xml # FIXME use lxml
@ -183,7 +183,7 @@ class QWebXml(object):
t_render = an[2:]
t_att[an[2:]] = av
else:
g_att += ' %s="%s"' % (an, cgi.escape(av, 1))
g_att += ' %s="%s"' % (an, werkzeug.utils.escape(av))
if 'debug' in t_att:
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)
else:
r = self.render_element(e, t_att, g_att, v)
if isinstance(r, unicode):
return r.encode('utf-8')
return r
def render_element(self, e, t_att, g_att, v, inner=None):
@ -235,7 +237,7 @@ class QWebXml(object):
val = val.encode("utf8")
else:
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):
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)
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)
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)
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 = self.eval_object(record, v)
inner = None
field_type = record._model._all_columns[field].column._type
column = record._model._all_columns[field].column
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:
if field_type == 'many2one':
field_data = record.read([field])[0].get(field)
inner = field_data and field_data[1]
else:
inner = getattr(record, field)
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:
value = record[field]
if value:
content, warnings = converter(value)
assert not warnings
except KeyError:
_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.