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.
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`. """
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])
- recs = recs[name]
-
- for field in fields:
+ field = recs._fields[name]
field.setup(env)
+ recs = recs[name]
- self.related_field = field = fields[-1]
+ self.related_field = field
# check type consistency
if self.type != field.type:
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)