[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:
parent
1da0a0b3a5
commit
89031f5de6
|
@ -394,8 +394,8 @@ class Field(object):
|
||||||
if `self` has already been set up.
|
if `self` has already been set up.
|
||||||
"""
|
"""
|
||||||
if not self.setup_done:
|
if not self.setup_done:
|
||||||
self.setup_done = True
|
|
||||||
self._setup(env)
|
self._setup(env)
|
||||||
|
self.setup_done = True
|
||||||
|
|
||||||
def _setup(self, env):
|
def _setup(self, env):
|
||||||
""" Do the actual setup of `self`. """
|
""" Do the actual setup of `self`. """
|
||||||
|
@ -427,16 +427,13 @@ class Field(object):
|
||||||
self.related = tuple(self.related.split('.'))
|
self.related = tuple(self.related.split('.'))
|
||||||
|
|
||||||
# determine the chain of fields, and make sure they are all set up
|
# determine the chain of fields, and make sure they are all set up
|
||||||
fields = []
|
|
||||||
recs = env[self.model_name]
|
recs = env[self.model_name]
|
||||||
for name in self.related:
|
for name in self.related:
|
||||||
fields.append(recs._fields[name])
|
field = recs._fields[name]
|
||||||
|
field.setup(env)
|
||||||
recs = recs[name]
|
recs = recs[name]
|
||||||
|
|
||||||
for field in fields:
|
self.related_field = field
|
||||||
field.setup(env)
|
|
||||||
|
|
||||||
self.related_field = field = fields[-1]
|
|
||||||
|
|
||||||
# check type consistency
|
# check type consistency
|
||||||
if self.type != field.type:
|
if self.type != field.type:
|
||||||
|
|
|
@ -2972,13 +2972,11 @@ class BaseModel(object):
|
||||||
def _setup_fields(self, partial=False):
|
def _setup_fields(self, partial=False):
|
||||||
""" Setup the fields (dependency triggers, etc). """
|
""" Setup the fields (dependency triggers, etc). """
|
||||||
for field in self._fields.itervalues():
|
for field in self._fields.itervalues():
|
||||||
if partial and field.manual and \
|
try:
|
||||||
field.relational and \
|
field.setup(self.env)
|
||||||
(field.comodel_name not in self.pool or \
|
except Exception:
|
||||||
(field.type == 'one2many' and field.inverse_name not in self.pool[field.comodel_name]._fields)):
|
if not partial:
|
||||||
# do not set up manual fields that refer to unknown models
|
raise
|
||||||
continue
|
|
||||||
field.setup(self.env)
|
|
||||||
|
|
||||||
# group fields by compute to determine field.computed_fields
|
# group fields by compute to determine field.computed_fields
|
||||||
fields_by_compute = defaultdict(list)
|
fields_by_compute = defaultdict(list)
|
||||||
|
|
Loading…
Reference in New Issue