diff options
| author | Christophe Simonis <chs@odoo.com> | 2017-12-05 16:46:14 +0100 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2017-12-05 16:46:14 +0100 |
| commit | b8540eefe3b82fc4a54c8a808ce3bfa0bea8a29a (patch) | |
| tree | f6c631c860d1decc712be66dcb0bfbcd186d8872 /odoo/fields.py | |
| parent | 519555054a3a0e2e0b8a139518da081c4d5e80aa (diff) | |
| parent | 970be94f3763e40a75885f93840e2be40572fc54 (diff) | |
[MERGE] forward port branch saas-15 up to 970be94f376
Diffstat (limited to 'odoo/fields.py')
| -rw-r--r-- | odoo/fields.py | 54 |
1 files changed, 31 insertions, 23 deletions
diff --git a/odoo/fields.py b/odoo/fields.py index 35ed914bedf..6e0a38370d3 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -19,7 +19,7 @@ except ImportError: import psycopg2 from odoo.sql_db import LazyCursor -from odoo.tools import float_precision, float_repr, float_round, frozendict, html_sanitize, human_size, pg_varchar, ustr, OrderedSet, pycompat +from odoo.tools import float_repr, float_round, frozendict, html_sanitize, human_size, pg_varchar, ustr, OrderedSet, pycompat from odoo.tools import DEFAULT_SERVER_DATE_FORMAT as DATE_FORMAT from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT as DATETIME_FORMAT from odoo.tools.translate import html_translate, _ @@ -776,7 +776,7 @@ class Field(object): """ Return the null value for this field in the record format. """ return False - def convert_to_column(self, value, record): + def convert_to_column(self, value, record, values=None): """ Convert ``value`` from the ``write`` format to the SQL format. """ if value is None or value is False: return None @@ -1180,7 +1180,7 @@ class Boolean(Field): type = 'boolean' column_type = ('bool', 'bool') - def convert_to_column(self, value, record): + def convert_to_column(self, value, record, values=None): return bool(value) def convert_to_cache(self, value, record, validate=True): @@ -1201,7 +1201,7 @@ class Integer(Field): _description_group_operator = property(attrgetter('group_operator')) - def convert_to_column(self, value, record): + def convert_to_column(self, value, record, values=None): return int(value or 0) def convert_to_cache(self, value, record, validate=True): @@ -1265,7 +1265,7 @@ class Float(Field): _description_digits = property(attrgetter('digits')) _description_group_operator = property(attrgetter('group_operator')) - def convert_to_column(self, value, record): + def convert_to_column(self, value, record, values=None): result = float(value or 0.0) digits = self.digits if digits: @@ -1319,25 +1319,33 @@ class Monetary(Field): assert self.currency_field in model._fields, \ "Field %s with unknown currency_field %r" % (self, self.currency_field) - def convert_to_column(self, value, record): - try: - return value.float_repr() # see float_precision.float_repr() - except Exception: - return float(value or 0.0) + def convert_to_column(self, value, record, values=None): + # retrieve currency from values or record + if values and self.currency_field in values: + field = record._fields[self.currency_field] + currency = field.convert_to_cache(values[self.currency_field], record) + currency = field.convert_to_record(currency, record) + else: + # Note: this is wrong if 'record' is several records with different + # currencies, which is functional nonsense and should not happen + currency = record[:1][self.currency_field] + + value = float(value or 0.0) + if currency: + return float_repr(currency.round(value), currency.decimal_places) + return value def convert_to_cache(self, value, record, validate=True): - if validate: - currency = record[self.currency_field] + # cache format: float + value = float(value or 0.0) + if validate and record[self.currency_field]: # FIXME @rco-odoo: currency may not be already initialized if it is # a function or related field! - if currency: - value = currency.round(float(value or 0.0)) - return float_precision(value, currency.decimal_places) - return float(value or 0.0) + value = record[self.currency_field].round(value) + return value def convert_to_read(self, value, record, use_name_get=True): - # float_precision values are not supported in pure XMLRPC - return float(value) + return value def convert_to_write(self, value, record): return value @@ -1438,7 +1446,7 @@ class Char(_String): assert isinstance(self.size, (NoneType, int)), \ "Char field %s with non-integer size %r" % (self, self.size) - def convert_to_column(self, value, record): + def convert_to_column(self, value, record, values=None): if value is None or value is False: return None # we need to convert the string to a unicode object to be able @@ -1503,7 +1511,7 @@ class Html(_String): _description_strip_style = property(attrgetter('strip_style')) _description_strip_classes = property(attrgetter('strip_classes')) - def convert_to_column(self, value, record): + def convert_to_column(self, value, record, values=None): if value is None or value is False: return None if self.sanitize: @@ -1684,7 +1692,7 @@ class Binary(Field): _description_attachment = property(attrgetter('attachment')) - def convert_to_column(self, value, record): + def convert_to_column(self, value, record, values=None): # Binary values may be byte strings (python 2.6 byte array), but # the legacy OpenERP convention is to transfer and store binaries # as base64-encoded strings. The base64 string may be provided as a @@ -1844,7 +1852,7 @@ class Selection(Field): return item[1] return False - def convert_to_column(self, value, record): + def convert_to_column(self, value, record, values=None): """ Convert ``value`` from the ``write`` format to the SQL format. """ if value is None or value is False: return None @@ -2011,7 +2019,7 @@ class Many2one(_Relational): """ records._cache[self] = self.convert_to_cache(value, records, validate=False) - def convert_to_column(self, value, record): + def convert_to_column(self, value, record, values=None): return value or None def convert_to_cache(self, value, record, validate=True): |
