summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--addons/hr_attendance/models/hr_employee.py2
-rw-r--r--addons/website_mail/models/mail_message.py2
-rw-r--r--openerp/addons/base/res/ir_property.py2
-rw-r--r--openerp/fields.py66
-rw-r--r--openerp/models.py14
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, \