diff --git a/openerp/addons/base/ir/ir_qweb/fields.py b/openerp/addons/base/ir/ir_qweb/fields.py index c0feaa27aa8..b82945ca155 100644 --- a/openerp/addons/base/ir/ir_qweb/fields.py +++ b/openerp/addons/base/ir/ir_qweb/fields.py @@ -298,8 +298,6 @@ class MonetaryConverter(models.AbstractModel): @api.model def record_to_html(self, record, field_name, options, values=None): - field = record._fields[field_name] - # for backward compatibility to remove after v10 if isinstance(options.get('display_currency'), str): _logger.warning("Use new syntax for '%s' monetary widget 'display_currency' option (instead of deprecated JSON syntax) to improve speed." % options['display_currency']) @@ -309,14 +307,17 @@ class MonetaryConverter(models.AbstractModel): options['from_currency'] = safe_eval.safe_eval(options['from_currency'], mode='eval', globals_dict=values) # end backward - display_currency = False - #currency should be specified by monetary field - if field.type == 'monetary' and field.currency_field: - display_currency = record[field.currency_field] - #otherwise fall back to old method - if not display_currency: - display_currency = options['display_currency'] + field = record._fields[field_name] + from_amount = record[field_name] + #currency should be specified by monetary field + if not options.get('display_currency') and field.type == 'monetary' and field.currency_field: + options['display_currency'] = record[field.currency_field] + + pre, value, post = self._format_func_monetary(from_amount, options['display_currency'], options.get('from_currency')) + return u'{pre}{0}{post}'.format(value, pre=pre, post=post) + + def _format_func_monetary(self, from_amount, display_currency, from_currency=None): # lang.format mandates a sprintf-style format. These formats are non- # minimal (they have a default fixed precision instead), and # lang.format will not set one by default. currency.round will not @@ -324,10 +325,8 @@ class MonetaryConverter(models.AbstractModel): # (integer > 0) from the currency's rounding (a float generally < 1.0). fmt = "%.{0}f".format(display_currency.decimal_places) - from_amount = record[field_name] - - if options.get('from_currency'): - from_amount = options['from_currency'].compute(from_amount, display_currency) + if from_currency: + from_amount = from_currency.compute(from_amount, display_currency) lang = self.user_lang() formatted_amount = lang.format(fmt, display_currency.round(from_amount), @@ -335,15 +334,12 @@ class MonetaryConverter(models.AbstractModel): pre = post = u'' if display_currency.position == 'before': - pre = u'{symbol}\N{NO-BREAK SPACE}' + pre = u'{symbol}\N{NO-BREAK SPACE}'.format(symbol=display_currency.symbol) else: - post = u'\N{NO-BREAK SPACE}{symbol}' + post = u'\N{NO-BREAK SPACE}{symbol}'.format(symbol=display_currency.symbol) + + return pre, formatted_amount, post - return u'{pre}{0}{post}'.format( - formatted_amount, pre=pre, post=post, - ).format( - symbol=display_currency.symbol, - ) TIMEDELTA_UNITS = ( ('year', 3600 * 24 * 365), diff --git a/openerp/addons/base/ir/ir_qweb/ir_qweb.py b/openerp/addons/base/ir/ir_qweb/ir_qweb.py index 166858edd2c..f57b6fbd437 100644 --- a/openerp/addons/base/ir/ir_qweb/ir_qweb.py +++ b/openerp/addons/base/ir/ir_qweb/ir_qweb.py @@ -237,20 +237,10 @@ class IrQWeb(models.AbstractModel, QWeb): return (attributes, content, inherit_branding or translate) # formating methods - def _format_func_monetary(self, value, display_currency=None, from_currency=None): - env = display_currency.env - precision = int(round(math.log10(display_currency.rounding))) - fmt = "%.{0}f".format(-precision if precision < 0 else 0) - lang = env['res.lang']._lang_get(env.context.get('lang', 'en_US')) - formatted_amount = lang.format(fmt, value, grouping=True, monetary=True).replace(r' ', u'\N{NO-BREAK SPACE}') - pre = post = u'' - if display_currency.position == 'before': - pre = u'{symbol}\N{NO-BREAK SPACE}' - else: - post = u'\N{NO-BREAK SPACE}{symbol}' - return u'{pre}{0}{post}'.format( - formatted_amount, pre=pre, post=post - ).format(symbol=display_currency.symbol,) + + def _format_func_monetary(self, value, display_currency, from_currency=None): + pre, value, post = self.env['ir.qweb.field.monetary']._format_func_monetary(value, display_currency, from_currency) + return u'{pre}{0}{post}'.format(value, pre=pre, post=post) def _format_func_htmlcontact(self, value, options, values=None): return self.pool['ir.qweb.field.contact'].record_to_html(