From 6956696eb28cc16ff1e35b66689ecdfa7cc62e27 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 25 Aug 2016 16:52:22 +0200 Subject: [PATCH] [REM] models: remove `_defaults` --- addons/hr_attendance/models/hr_employee.py | 2 +- addons/website_mail/models/mail_message.py | 2 +- openerp/addons/base/res/ir_property.py | 2 +- openerp/fields.py | 66 ++-------------------- openerp/models.py | 14 +---- 5 files changed, 10 insertions(+), 76 deletions(-) diff --git a/addons/hr_attendance/models/hr_employee.py b/addons/hr_attendance/models/hr_employee.py index 4d0b6e15d56..2a5a66d838f 100644 --- a/addons/hr_attendance/models/hr_employee.py +++ b/addons/hr_attendance/models/hr_employee.py @@ -141,7 +141,7 @@ class HrEmployee(models.Model): if column_name not in ["barcode", "pin"]: super(HrEmployee, self)._init_column(column_name) else: - default_compute = self._defaults.get(column_name) + default_compute = self._fields[column_name].default query = 'SELECT id FROM "%s" WHERE "%s" is NULL' % ( self._table, column_name) diff --git a/addons/website_mail/models/mail_message.py b/addons/website_mail/models/mail_message.py index 7e175b6ea12..d5e12e41b0b 100644 --- a/addons/website_mail/models/mail_message.py +++ b/addons/website_mail/models/mail_message.py @@ -14,7 +14,7 @@ class MailMessage(models.Model): def default_get(self, fields_list): defaults = super(MailMessage, self).default_get(fields_list) - # Note: explicitly implemented in default_get() instead of _defaults, + # Note: explicitly implemented in default_get() instead of field default, # to avoid setting to True for all existing messages during upgrades. # TODO: this default should probably be dynamic according to the model # on which the messages are attached, thus moved to create(). diff --git a/openerp/addons/base/res/ir_property.py b/openerp/addons/base/res/ir_property.py index 10ce85ee389..636a08a2307 100644 --- a/openerp/addons/base/res/ir_property.py +++ b/openerp/addons/base/res/ir_property.py @@ -61,7 +61,7 @@ class Property(models.Model): prop = self[0] type_ = prop.type else: - type_ = self._defaults['type'] + type_ = self._fields['type'].default(self) field = TYPE2FIELD.get(type_) if not field: diff --git a/openerp/fields.py b/openerp/fields.py index e25dbfdb884..0aa86082c65 100644 --- a/openerp/fields.py +++ b/openerp/fields.py @@ -74,30 +74,6 @@ def resolve_mro(model, name, predicate): return result -def default_new_to_new(field, value): - """ Convert the new-API default ``value`` to a callable. """ - return value if callable(value) else lambda model: value - -def default_new_to_old(field, value): - """ Convert the new-API default ``value`` to the old API. """ - if callable(value): - from openerp import api - return api.model(lambda model: field.convert_to_write(value(model), model)) - else: - return value - -def default_old_to_new(field, value): - """ Convert the old-API default ``value`` to the new API. """ - if callable(value): - return lambda model: value(model._model, model._cr, model._uid, model._context) - else: - return lambda model: value - -def default_old_to_old(field, value): - """ Convert the old-API default ``value`` to the old API. """ - return value - - class MetaField(type): """ Metaclass for field classes. """ by_type = {} @@ -457,40 +433,10 @@ class Field(object): # related fields get their string from their parent field self.string = name.replace('_', ' ').capitalize() - self._setup_default(model, name) - - def _setup_default(self, model, name): - """ Determine ``self.default`` and the corresponding ``model._defaults``. """ - self.default = None - model._defaults.pop(name, None) - - # traverse the class hierarchy upwards, and take the first field - # definition with a default or _defaults for self - for klass in type(model).__mro__: - if name in klass.__dict__: - field = klass.__dict__[name] - if not isinstance(field, type(self)): - # klass contains another value overridden by self - return - - if 'default' in field.args: - # take the value, and adapt it for model._defaults - value = field.args['default'] - if value is not None: - self.default = default_new_to_new(self, value) - model._defaults[name] = default_new_to_old(self, value) - return - - # do not look up _defaults on model classes - if getattr(klass, 'pool', None): - continue - defaults = klass.__dict__.get('_defaults') or {} - if name in defaults: - # take the value from _defaults, and adapt it for self.default - value = defaults[name] - self.default = default_old_to_new(self, value) - model._defaults[name] = default_old_to_old(self, value) - return + # self.default must be a callable + if self.default is not None: + value = self.default + self.default = value if callable(value) else lambda model: value ############################################################################ # @@ -1430,9 +1376,9 @@ class Datetime(Field): @staticmethod def context_timestamp(record, timestamp): """Returns the given timestamp converted to the client's timezone. - This method is *not* meant for use as a _defaults initializer, + This method is *not* meant for use as a default initializer, because datetime fields are automatically converted upon - display on client side. For _defaults you :meth:`fields.datetime.now` + display on client side. For default values :meth:`fields.datetime.now` should be used instead. :param datetime timestamp: naive datetime value (expressed in UTC) diff --git a/openerp/models.py b/openerp/models.py index 8e127280e5b..85d2978940d 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -317,7 +317,6 @@ class BaseModel(object): _inherit = None # Python-inherited models ('model' or ['model']) _inherits = {} # inherited models {'parent_model': 'm2o_field'} _columns = {} # field definitions (old API) - _defaults = {} # field defaults (old API) _constraints = [] # Python constraints (old API) _table = None # SQL table name used by model @@ -609,7 +608,6 @@ class BaseModel(object): '_original_module': cls._module, '_inherit_children': OrderedSet(), # names of children models '_fields': {}, # populated in _setup_base() - '_defaults': {}, # populated in _setup_base() }) check_parent = cls._build_model_check_parent @@ -3021,17 +3019,13 @@ class BaseModel(object): for name in set(cls._fields) - cls0._proper_fields: delattr(cls, name) cls._fields.pop(name, None) - cls._defaults.pop(name, None) # collect proper fields on cls0, and add them on cls for name in cls0._proper_fields: field = cls0._fields[name] + # regular fields are shared, while related fields are setup from scratch if not field.related: - # regular fields are shared, and their default value copied self._add_field(name, field) - if name in cls0._defaults: - cls._defaults[name] = cls0._defaults[name] else: - # related fields are copied, and setup from scratch self._add_field(name, field.new(**field.args)) cls._proper_fields = set(cls._fields) @@ -3041,7 +3035,6 @@ class BaseModel(object): for name in cls._fields: delattr(cls, name) cls._fields = {} - cls._defaults = {} for name, field in getmembers(cls, Field.__instancecheck__): # do not retrieve magic, custom and inherited fields if not any(field.args.get(k) for k in ('automatic', 'manual', 'inherited')): @@ -3122,11 +3115,6 @@ class BaseModel(object): # register constraints and onchange methods cls._init_constraints_onchanges() - # check defaults - for name in cls._defaults: - assert name in cls._fields, \ - "Model %s has a default for nonexiting field %s" % (cls._name, name) - # validate rec_name if cls._rec_name: assert cls._rec_name in cls._fields, \