From c9caf55177359b404e4d752dcf1966ca58dccfda Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Tue, 17 Apr 2018 16:57:39 +0200 Subject: [PATCH] [FIX] models: bad setup of inherited custom fields Assume a custom field F is defined on model 'res.partner'. The setup of F may silently fail because of missing stuff. In that situation, setting up the field inherited from F on model 'res.users' should also silently fail. To reproduce the bug, install Invoicing, create a related custom field F on 'res.partner' with 'property_account_position_id.active', and install another module. Setting up F after loading module 'base' will fail because the field 'property_account_position_id' does not exist yet. The error is not caught by the inheritance of F on model 'res.users', and the installation crashes. --- odoo/fields.py | 3 ++- odoo/models.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/odoo/fields.py b/odoo/fields.py index caa36df49ef..a92d814d2bb 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -277,6 +277,7 @@ class Field(MetaField('DummyField', (object,), {})): 'automatic': False, # whether the field is automatically created ("magic" field) 'inherited': False, # whether the field is inherited (_inherits) + 'inherited_field': None, # the corresponding inherited field 'name': None, # name of the field 'model_name': None, # name of the model of this field @@ -611,7 +612,7 @@ class Field(MetaField('DummyField', (object,), {})): @property def base_field(self): """ Return the base field of an inherited field, or ``self``. """ - return self.related_field.base_field if self.inherited else self + return self.inherited_field.base_field if self.inherited_field else self # # Company-dependent fields diff --git a/odoo/models.py b/odoo/models.py index 74b4431b51f..a9670ca2257 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -2292,6 +2292,7 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})): # - copy inherited fields iff their original field is copied fields[name] = field.new( inherited=True, + inherited_field=field, related=(parent_field, name), related_sudo=False, copy=field.copy, @@ -2409,7 +2410,7 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})): try: field.setup_full(self) except Exception: - if not self.pool.loaded and field.manual: + if not self.pool.loaded and field.base_field.manual: # Something goes wrong when setup a manual field. # This can happen with related fields using another manual many2one field # that hasn't been loaded because the comodel does not exist yet.