[IMP] fields: split the default value from the compute function
authorRaphael Collet <rco@openerp.com>
Tue, 30 Sep 2014 13:35:24 +0000 (15:35 +0200)
committerRaphael Collet <rco@openerp.com>
Wed, 1 Oct 2014 07:24:09 +0000 (09:24 +0200)
This separation allows to set a default value on a related field, for instance.

openerp/fields.py

index bd146f6..9c15a7c 100644 (file)
@@ -69,18 +69,6 @@ def resolve_all_mro(cls, name, reverse=False):
             yield klass.__dict__[name]
 
 
-def default_compute(field, value):
-    """ Return a compute function for the given default `value`; `value` is
-        either a constant, or a unary function returning the default value.
-    """
-    name = field.name
-    func = value if callable(value) else lambda rec: value
-    def compute(recs):
-        for rec in recs:
-            rec[name] = func(rec)
-    return compute
-
-
 class MetaField(type):
     """ Metaclass for field classes. """
     by_type = {}
@@ -282,7 +270,7 @@ class Field(object):
     related = None              # sequence of field names, for related fields
     related_sudo = True         # whether related fields should be read as admin
     company_dependent = False   # whether `self` is company-dependent (property field)
-    default = None              # default value
+    default = None              # default value (literal or callable)
 
     string = None               # field label
     help = None                 # field tooltip
@@ -470,10 +458,6 @@ class Field(object):
         def make_depends(deps):
             return tuple(deps(recs) if callable(deps) else deps)
 
-        # transform self.default into self.compute
-        if self.default is not None and self.compute is None:
-            self.compute = default_compute(self, self.default)
-
         # convert compute into a callable and determine depends
         if isinstance(self.compute, basestring):
             # if the compute method has been overridden, concatenate all their _depends
@@ -826,7 +810,10 @@ class Field(object):
 
     def determine_default(self, record):
         """ determine the default value of field `self` on `record` """
-        if self.compute:
+        if self.default is not None:
+            value = self.default(record) if callable(self.default) else self.default
+            record._cache[self] = self.convert_to_cache(value, record)
+        elif self.compute:
             self._compute_value(record)
         else:
             record._cache[self] = SpecialValue(self.null(record.env))