From c741c0eeb19209cdd25fc867145bfa4acc5da044 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 26 Sep 2013 16:51:26 +0200 Subject: [PATCH] [IMP] reimplement t-field using new converters bzr revid: xmo@openerp.com-20130926145126-21hlubvs39a0z68j --- openerp/osv/fields.py | 4 +-- openerp/tests/test_qweb.py | 13 +++++++- openerp/tools/qweb.py | 62 ++++++++++++++++++++------------------ 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 1db2d1a111d..2aeea751f89 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -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 ] diff --git a/openerp/tests/test_qweb.py b/openerp/tests/test_qweb.py index 5553fe8e21f..edee0941fd6 100644 --- a/openerp/tests/test_qweb.py +++ b/openerp/tests/test_qweb.py @@ -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, diff --git a/openerp/tools/qweb.py b/openerp/tools/qweb.py index b80299aac8e..ada6200b032 100644 --- a/openerp/tools/qweb.py +++ b/openerp/tools/qweb.py @@ -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.