[FIX] models: simplify partial setup of fields, let it crash silently

The setup of relational fields may be problematic, as they may refer to unknown
models via custom relational fields.  In a partial setup, do not try to skip
the field setup, but let it go and silently catch any exception if it crashes.
This commit is contained in:
Raphael Collet 2014-10-14 17:34:30 +02:00
parent 1da0a0b3a5
commit 89031f5de6
2 changed files with 9 additions and 14 deletions

View File

@ -394,8 +394,8 @@ class Field(object):
if `self` has already been set up.
"""
if not self.setup_done:
self.setup_done = True
self._setup(env)
self.setup_done = True
def _setup(self, env):
""" Do the actual setup of `self`. """
@ -427,16 +427,13 @@ class Field(object):
self.related = tuple(self.related.split('.'))
# determine the chain of fields, and make sure they are all set up
fields = []
recs = env[self.model_name]
for name in self.related:
fields.append(recs._fields[name])
field = recs._fields[name]
field.setup(env)
recs = recs[name]
for field in fields:
field.setup(env)
self.related_field = field = fields[-1]
self.related_field = field
# check type consistency
if self.type != field.type:

View File

@ -2972,13 +2972,11 @@ class BaseModel(object):
def _setup_fields(self, partial=False):
""" Setup the fields (dependency triggers, etc). """
for field in self._fields.itervalues():
if partial and field.manual and \
field.relational and \
(field.comodel_name not in self.pool or \
(field.type == 'one2many' and field.inverse_name not in self.pool[field.comodel_name]._fields)):
# do not set up manual fields that refer to unknown models
continue
field.setup(self.env)
try:
field.setup(self.env)
except Exception:
if not partial:
raise
# group fields by compute to determine field.computed_fields
fields_by_compute = defaultdict(list)