summaryrefslogtreecommitdiff
path: root/odoo/fields.py
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2017-12-05 16:46:14 +0100
committerChristophe Simonis <chs@odoo.com>2017-12-05 16:46:14 +0100
commitb8540eefe3b82fc4a54c8a808ce3bfa0bea8a29a (patch)
treef6c631c860d1decc712be66dcb0bfbcd186d8872 /odoo/fields.py
parent519555054a3a0e2e0b8a139518da081c4d5e80aa (diff)
parent970be94f3763e40a75885f93840e2be40572fc54 (diff)
[MERGE] forward port branch saas-15 up to 970be94f376
Diffstat (limited to 'odoo/fields.py')
-rw-r--r--odoo/fields.py54
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):