[FIX] models: simplify partial setup of fields, let it crash silently
authorRaphael Collet <rco@openerp.com>
Tue, 14 Oct 2014 15:34:30 +0000 (17:34 +0200)
committerRaphael Collet <rco@openerp.com>
Wed, 15 Oct 2014 09:39:12 +0000 (11:39 +0200)
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.

openerp/fields.py
openerp/models.py

index 5f7255c..e2a79ad 100644 (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])
-            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:
index 8123ec6..dfc41bf 100644 (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)