diff options
| author | Raphael Collet <rco@odoo.com> | 2017-11-16 17:21:06 +0100 |
|---|---|---|
| committer | Raphael Collet <rco@odoo.com> | 2018-01-16 10:47:13 +0100 |
| commit | 869f062e0898361bb261a0e457e75b2ae24cb785 (patch) | |
| tree | 957e1a6a01746491e785b2a9756f6b2b89e85913 /odoo/fields.py | |
| parent | be0f24a96bcd6d66448f422d21ab126297885bd9 (diff) | |
[REF] models: improve code of `_create`/`_write`
Also remove method `self._check_selection_field_value`, and perform the check
in field method `convert_to_column`.
Diffstat (limited to 'odoo/fields.py')
| -rw-r--r-- | odoo/fields.py | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/odoo/fields.py b/odoo/fields.py index c7c3d84abe1..70a9e1af80e 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -787,7 +787,7 @@ class Field(MetaField('DummyField', (object,), {})): """ Return the null value for this field in the record format. """ return False - def convert_to_column(self, value, record, values=None): + def convert_to_column(self, value, record, values=None, validate=True): """ Convert ``value`` from the ``write`` format to the SQL format. """ if value is None or value is False: return None @@ -1145,7 +1145,7 @@ class Boolean(Field): type = 'boolean' column_type = ('bool', 'bool') - def convert_to_column(self, value, record, values=None): + def convert_to_column(self, value, record, values=None, validate=True): return bool(value) def convert_to_cache(self, value, record, validate=True): @@ -1166,7 +1166,7 @@ class Integer(Field): _description_group_operator = property(attrgetter('group_operator')) - def convert_to_column(self, value, record, values=None): + def convert_to_column(self, value, record, values=None, validate=True): return int(value or 0) def convert_to_cache(self, value, record, validate=True): @@ -1232,7 +1232,7 @@ class Float(Field): _description_digits = property(attrgetter('digits')) _description_group_operator = property(attrgetter('group_operator')) - def convert_to_column(self, value, record, values=None): + def convert_to_column(self, value, record, values=None, validate=True): result = float(value or 0.0) digits = self.digits if digits: @@ -1286,11 +1286,11 @@ 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, values=None): + def convert_to_column(self, value, record, values=None, validate=True): # 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_cache(values[self.currency_field], record, validate) currency = field.convert_to_record(currency, record) else: # Note: this is wrong if 'record' is several records with different @@ -1419,7 +1419,7 @@ class Char(_String): assert self.size is None or isinstance(self.size, int), \ "Char field %s with non-integer size %r" % (self, self.size) - def convert_to_column(self, value, record, values=None): + def convert_to_column(self, value, record, values=None, validate=True): if value is None or value is False: return None # we need to convert the string to a unicode object to be able @@ -1484,7 +1484,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, values=None): + def convert_to_column(self, value, record, values=None, validate=True): if value is None or value is False: return None if self.sanitize: @@ -1671,7 +1671,7 @@ class Binary(Field): _description_attachment = property(attrgetter('attachment')) - def convert_to_column(self, value, record, values=None): + def convert_to_column(self, value, record, values=None, validate=True): # 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 @@ -1755,6 +1755,7 @@ class Selection(Field): type = 'selection' _slots = { 'selection': None, # [(value, string), ...], function or method name + 'validate': True, # whether validating upon write } def __init__(self, selection=Default, string=Default, **kwargs): @@ -1820,6 +1821,11 @@ class Selection(Field): selection = selection(env[self.model_name]) return [value for value, _ in selection] + def convert_to_column(self, value, record, values=None, validate=True): + if validate and self.validate: + value = self.convert_to_cache(value, record) + return super(Selection, self).convert_to_column(value, record, values, validate) + def convert_to_cache(self, value, record, validate=True): if not validate: return value or False @@ -1846,6 +1852,9 @@ class Reference(Selection): def column_type(self): return ('varchar', pg_varchar()) + def convert_to_column(self, value, record, values=None, validate=True): + return Field.convert_to_column(self, value, record, values, validate) + def convert_to_cache(self, value, record, validate=True): # cache format: (res_model, res_id) or False def process(res_model, res_id): @@ -1987,7 +1996,7 @@ class Many2one(_Relational): for record in records: cache.set(record, self, self.convert_to_cache(value, record, validate=False)) - def convert_to_column(self, value, record, values=None): + def convert_to_column(self, value, record, values=None, validate=True): return value or None def convert_to_cache(self, value, record, validate=True): |
