From 9333c622e967207dd6fc9ee23513af9769fc9ee1 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 19 Feb 2015 14:01:19 +0100 Subject: [PATCH] [FIX] fields: allow overriding of a old-api function field When overriding a field defined as a function field, the field must either create a corresponding column that is not a fields.function (if stored), or have no corresponding column (if not stored). --- openerp/fields.py | 8 ++++++-- openerp/models.py | 5 +++-- openerp/osv/fields.py | 11 ++++++++--- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/openerp/fields.py b/openerp/fields.py index 5c38d5bb4bd..4e7129e9032 100644 --- a/openerp/fields.py +++ b/openerp/fields.py @@ -637,8 +637,11 @@ class Field(object): # def to_column(self): - """ return a low-level field object corresponding to `self` """ - assert self.store or self.column + """ Return a column object corresponding to `self`, or ``None``. """ + if not self.store and self.compute: + # non-stored computed fields do not have a corresponding column + self.column = None + return None # determine column parameters #_logger.debug("Create fields._column for Field %s", self) @@ -674,6 +677,7 @@ class Field(object): _column_groups = property(attrgetter('groups')) _column_change_default = property(attrgetter('change_default')) _column_deprecated = property(attrgetter('deprecated')) + _column_compute = property(lambda self: bool(self.compute)) ############################################################################ # diff --git a/openerp/models.py b/openerp/models.py index 890d972068f..3a8cb88423e 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -2986,8 +2986,9 @@ class BaseModel(object): cls._columns = {} for name, field in cls._fields.iteritems(): field.setup(self.env) - if field.store or field.column: - cls._columns[name] = field.to_column() + column = field.to_column() + if column: + cls._columns[name] = column # group fields by compute to determine field.computed_fields fields_by_compute = defaultdict(list) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index d0fc0dfcaea..852a8cbfa26 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -1293,9 +1293,14 @@ class function(_column): self._symbol_set = type_class._symbol_set def new(self, **args): - # HACK: function fields are tricky to recreate, simply return a copy - import copy - return copy.copy(self) + if args.get('compute'): + # field is computed, we need an instance of the given type + type_class = globals()[self._type] + return type_class(**args) + else: + # HACK: function fields are tricky to recreate, simply return a copy + import copy + return copy.copy(self) def to_field_args(self): args = super(function, self).to_field_args()