[REM] models: remove _defaults
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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().
|
||||
|
||||
@@ -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:
|
||||
|
||||
+6
-60
@@ -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)
|
||||
|
||||
+1
-13
@@ -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, \
|
||||
|
||||
Reference in New Issue
Block a user