diff --git a/openerp/addons/base/ir/ir_qweb.py b/openerp/addons/base/ir/ir_qweb.py
index 9405b5086ca..0f829f7a982 100644
--- a/openerp/addons/base/ir/ir_qweb.py
+++ b/openerp/addons/base/ir/ir_qweb.py
@@ -464,8 +464,9 @@ class FieldConverter(osv.AbstractModel):
cr, uid, field_name, record,
record._model._all_columns[field_name].column,
options)
- except KeyError:
- _logger.warning("t-field no field %s for model %s", field_name, record._model._name)
+ except Exception:
+ _logger.warning("Could not get field %s for model %s",
+ field_name, record._model._name, exc_info=True)
g_att += ''.join(
' %s="%s"' % (name, werkzeug.utils.escape(value))
@@ -477,11 +478,14 @@ class FieldConverter(osv.AbstractModel):
return self.render_element(cr, uid, source_element, t_att, g_att,
qweb_context, content)
+ def qweb_object(self):
+ return self.pool['ir.qweb']
+
def render_element(self, cr, uid, source_element, t_att, g_att,
qweb_context, content):
""" Final rendering hook, by default just calls ir.qweb's ``render_element``
"""
- return self.pool['ir.qweb'].render_element(
+ return self.qweb_object().render_element(
source_element, t_att, g_att, qweb_context, content or '')
class FloatConverter(osv.AbstractModel):
@@ -555,35 +559,60 @@ class ImageConverter(osv.AbstractModel):
return '
' % (Image.MIME[image.format], value)
class MonetaryConverter(osv.AbstractModel):
- """ ``monetary`` converter, has a mandatory option ``currency_field``.
+ """ ``monetary`` converter, has two mandatory options ``source_currency``
+ and ``display_currency``. Both are evaluated in the qweb context, must
+ yield a res.currency browse_record and are used to convert currency field
+ value into a display value, and (using the display currency) format the
+ currency symbol.
- The currency field is a (float) value, the linked ``currency_field`` is an
- m2o to a ``res.currency`` indicating how to format the field.
+ The currency field is a (float) value.
+
+ .. note:: the monetary converter internally adds the qweb context to its
+ options mapping, so that the context is available to callees.
+ It's set under the ``_qweb_context`` key.
"""
_name = 'ir.qweb.field.monetary'
_inherit = 'ir.qweb.field'
+ def to_html(self, cr, uid, field_name, record, options,
+ source_element, t_att, g_att, qweb_context):
+ options['_qweb_context'] = qweb_context
+ return super(MonetaryConverter, self).to_html(
+ cr, uid, field_name, record, options,
+ source_element, t_att, g_att, qweb_context)
+
def record_to_html(self, cr, uid, field_name, record, column, options):
- Currency = self.pool['res.currency']
+ source = self.source_currency(cr, uid, options)
+ display = self.display_currency(cr, uid, options)
+
+ value = self.pool['res.currency'].compute(
+ cr, uid, source.id, display.id, record[field_name])
symbol_pre = symbol_post = space_pre = space_post = u''
- currency = record[options['currency_field']]
- if currency.position == 'before':
+ if display.position == 'before':
space_pre = u' '
- symbol_pre = currency.symbol
+ symbol_pre = display.symbol
else:
space_post = u' '
- symbol_post = currency.symbol
+ symbol_post = display.symbol
return u'{symbol_pre}{space_pre}' \
u'{0}' \
u'{space_post}{symbol_post}'.format(
- Currency.round(cr, uid, currency, record[field_name]),
+ value,
space_pre=space_pre,
symbol_pre=symbol_pre,
space_post=space_post,
symbol_post=symbol_post,)
+ def source_currency(self, cr, uid, options):
+ return self.qweb_object().eval_object(
+ options['source_currency'], options['_qweb_context'])
+
+ def display_currency(self, cr, uid, options):
+ return self.qweb_object().eval_object(
+ options['display_currency'], options['_qweb_context'])
+
def get_field_type(column, options):
""" Gets a t-field's effective type from the field's column and its options
"""
diff --git a/openerp/tests/addons/test_converter/tests/test_html.py b/openerp/tests/addons/test_converter/tests/test_html.py
index 96f710473aa..aca9967e89b 100644
--- a/openerp/tests/addons/test_converter/tests/test_html.py
+++ b/openerp/tests/addons/test_converter/tests/test_html.py
@@ -79,6 +79,8 @@ class TestCurrencyExport(TestExport):
def setUp(self):
super(TestCurrencyExport, self).setUp()
self.Currency = self.registry('res.currency')
+ self.base = self.create(self.Currency, name="Source", symbol=u'source')
+ self.create_rate(self.base)
def create(self, model, context=None, **values):
return model.browse(
@@ -86,21 +88,30 @@ class TestCurrencyExport(TestExport):
model.create(self.cr, self.uid, values, context=context),
context=context)
- def convert(self, obj):
+ def convert(self, obj, dest):
converter = self.registry('ir.qweb.field.monetary')
- options = {'widget': 'monetary', 'currency_field': 'currency_id'}
+ options = {
+ 'widget': 'monetary',
+ 'source_currency': 'c1',
+ 'display_currency': 'c2'
+ }
converted = converter.to_html(
self.cr, self.uid, 'value', obj, options,
doc.createElement('span'),
{'field': 'obj.value', 'field-options': json.dumps(options)},
- '', {'obj': obj})
+ '', {'obj': obj, 'c1': self.base, 'c2': dest, })
return converted
+ def create_rate(self, currency, rate=1.0):
+ Rate = self.registry('res.currency.rate')
+ self.create(Rate, name='1970-01-01', rate=rate, currency_id=currency.id)
+
def test_currency_post(self):
currency = self.create(self.Currency, name="Test", symbol=u"test")
+ self.create_rate(currency)
obj = self.create(self.Model, value=0.12, currency_id=currency.id)
- converted = self.convert(obj)
+ converted = self.convert(obj, dest=currency)
self.assertEqual(
converted,
@@ -116,9 +127,10 @@ class TestCurrencyExport(TestExport):
def test_currency_pre(self):
currency = self.create(
self.Currency, name="Test", symbol=u"test", position='before')
+ self.create_rate(currency)
obj = self.create(self.Model, value=0.12, currency_id=currency.id)
- converted = self.convert(obj)
+ converted = self.convert(obj, dest=currency)
self.assertEqual(
converted,
@@ -136,9 +148,10 @@ class TestCurrencyExport(TestExport):
""" Precision should be the currency's, not the float field's
"""
currency = self.create(self.Currency, name="Test", symbol=u"test",)
+ self.create_rate(currency)
obj = self.create(self.Model, value=0.1234567, currency_id=currency.id)
- converted = self.convert(obj)
+ converted = self.convert(obj, dest=currency)
self.assertEqual(
converted,