Skip to content

Commit 87d160a

Browse files
committed
[FIX] models: partial loading of manual fields
Related and function manual fields may not be loadable during initial setup (partial=True) due to dependencies being not loaded. Ignore theses fields during partial loading.
1 parent a445fc9 commit 87d160a

2 files changed

Lines changed: 18 additions & 3 deletions

File tree

openerp/models.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3034,18 +3034,33 @@ def _setup_base(self, partial):
30343034
cls._setup_done = True
30353035

30363036
@api.model
3037-
def _setup_fields(self):
3037+
def _setup_fields(self, partial):
30383038
""" Setup the fields, except for recomputation triggers. """
30393039
cls = type(self)
30403040

30413041
# set up fields, and determine their corresponding column
30423042
cls._columns = {}
3043+
bad_fields = []
30433044
for name, field in cls._fields.iteritems():
3044-
field.setup_full(self)
3045+
try:
3046+
field.setup_full(self)
3047+
except Exception:
3048+
if partial and field.manual:
3049+
# Something goes wrong when setup a manual field.
3050+
# This can happen with related fields using another manual many2one field
3051+
# that hasn't been loaded because the comodel does not exist yet.
3052+
# This can also be a manual function field depending on not loaded fields yet.
3053+
bad_fields.append(name)
3054+
continue
3055+
raise
30453056
column = field.to_column()
30463057
if column:
30473058
cls._columns[name] = column
30483059

3060+
for name in bad_fields:
3061+
del cls._fields[name]
3062+
delattr(cls, name)
3063+
30493064
# map each field to the fields computed with the same method
30503065
groups = defaultdict(list)
30513066
for field in cls._fields.itervalues():

openerp/modules/registry.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ def setup_models(self, cr, partial=False):
197197
model._setup_base(cr, SUPERUSER_ID, partial)
198198

199199
for model in self.models.itervalues():
200-
model._setup_fields(cr, SUPERUSER_ID)
200+
model._setup_fields(cr, SUPERUSER_ID, partial)
201201

202202
for model in self.models.itervalues():
203203
model._setup_complete(cr, SUPERUSER_ID)

0 commit comments

Comments
 (0)