summaryrefslogtreecommitdiff
path: root/odoo/fields.py
diff options
context:
space:
mode:
Diffstat (limited to 'odoo/fields.py')
-rw-r--r--odoo/fields.py12
1 files changed, 8 insertions, 4 deletions
diff --git a/odoo/fields.py b/odoo/fields.py
index b6b13e97c8c..2e3d4d7eed2 100644
--- a/odoo/fields.py
+++ b/odoo/fields.py
@@ -658,7 +658,7 @@ class Field(MetaField('DummyField', (object,), {})):
# on ``path``. See method ``modified`` below for details.
#
- def resolve_deps(self, model):
+ def resolve_deps(self, model, path0=[], seen=frozenset()):
""" Return the dependencies of ``self`` as tuples ``(model, field, path)``,
where ``path`` is an optional list of field names.
"""
@@ -669,11 +669,12 @@ class Field(MetaField('DummyField', (object,), {})):
for dotnames in self.depends:
if dotnames == self.name:
_logger.warning("Field %s depends on itself; please fix its decorator @api.depends().", self)
- model, path = model0, dotnames.split('.')
- for i, fname in enumerate(path):
+ model, path = model0, path0
+ for fname in dotnames.split('.'):
field = model._fields[fname]
- result.append((model, field, path[:i]))
+ result.append((model, field, path))
model = model0.env.get(field.comodel_name)
+ path = None if path is None else path + [fname]
# add self's model dependencies
for mname, fnames in model0._depends.items():
@@ -683,11 +684,14 @@ class Field(MetaField('DummyField', (object,), {})):
result.append((model, field, None))
# add indirect dependencies from the dependencies found above
+ seen = seen.union([self])
for model, field, path in list(result):
for inv_field in model._field_inverses[field]:
inv_model = model0.env[inv_field.model_name]
inv_path = None if path is None else path + [field.name]
result.append((inv_model, inv_field, inv_path))
+ if not field.store and field not in seen:
+ result += field.resolve_deps(model, path, seen)
return result