[IMP] fields: split the default value from the compute function
This separation allows to set a default value on a related field, for instance.
This commit is contained in:
parent
eaa0f29094
commit
34ba5154e2
|
@ -69,18 +69,6 @@ def resolve_all_mro(cls, name, reverse=False):
|
||||||
yield klass.__dict__[name]
|
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):
|
class MetaField(type):
|
||||||
""" Metaclass for field classes. """
|
""" Metaclass for field classes. """
|
||||||
by_type = {}
|
by_type = {}
|
||||||
|
@ -282,7 +270,7 @@ class Field(object):
|
||||||
related = None # sequence of field names, for related fields
|
related = None # sequence of field names, for related fields
|
||||||
related_sudo = True # whether related fields should be read as admin
|
related_sudo = True # whether related fields should be read as admin
|
||||||
company_dependent = False # whether `self` is company-dependent (property field)
|
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
|
string = None # field label
|
||||||
help = None # field tooltip
|
help = None # field tooltip
|
||||||
|
@ -470,10 +458,6 @@ class Field(object):
|
||||||
def make_depends(deps):
|
def make_depends(deps):
|
||||||
return tuple(deps(recs) if callable(deps) else 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
|
# convert compute into a callable and determine depends
|
||||||
if isinstance(self.compute, basestring):
|
if isinstance(self.compute, basestring):
|
||||||
# if the compute method has been overridden, concatenate all their _depends
|
# if the compute method has been overridden, concatenate all their _depends
|
||||||
|
@ -826,7 +810,10 @@ class Field(object):
|
||||||
|
|
||||||
def determine_default(self, record):
|
def determine_default(self, record):
|
||||||
""" determine the default value of field `self` on `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)
|
self._compute_value(record)
|
||||||
else:
|
else:
|
||||||
record._cache[self] = SpecialValue(self.null(record.env))
|
record._cache[self] = SpecialValue(self.null(record.env))
|
||||||
|
|
Loading…
Reference in New Issue