summaryrefslogtreecommitdiff
path: root/odoo/fields.py
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2019-09-11 08:21:33 +0000
committerRaphael Collet <rco@odoo.com>2019-09-12 14:24:58 +0000
commit492e4cc5a12fb062e106836fc35889072b85453c (patch)
tree93eb8da311aed058a79ce7bc2456f645662dff71 /odoo/fields.py
parent956338f28af96dc53bb15ac1c0a7d9888f314b18 (diff)
[REF] fields: setup and use of `depends_context`
closes odoo/odoo#36795 Signed-off-by: Raphael Collet (rco) <rco@openerp.com>
Diffstat (limited to 'odoo/fields.py')
-rw-r--r--odoo/fields.py56
1 files changed, 35 insertions, 21 deletions
diff --git a/odoo/fields.py b/odoo/fields.py
index da283c226d3..dc685d7885b 100644
--- a/odoo/fields.py
+++ b/odoo/fields.py
@@ -498,30 +498,24 @@ class Field(MetaField('DummyField', (object,), {})):
if self.depends is not None:
return
- def get_depends(func):
- deps = getattr(func, '_depends', ())
- return deps(model) if callable(deps) else deps
-
- def get_depends_context(func):
- return getattr(func, '_depends_context', ())
-
+ # determine the functions implementing self.compute
if isinstance(self.compute, str):
- # if the compute method has been overridden, concatenate all their _depends
- self.depends = tuple(
- dep
- for method in resolve_mro(model, self.compute, callable)
- for dep in get_depends(method)
- )
- depends_context = tuple(
- dep
- for method in resolve_mro(model, self.compute, callable)
- for dep in get_depends_context(method)
- )
+ funcs = resolve_mro(model, self.compute, callable)
+ elif self.compute:
+ funcs = [self.compute]
else:
- self.depends = tuple(get_depends(self.compute))
- depends_context = tuple(get_depends_context(self.compute))
+ funcs = []
+
+ # collect depends and depends_context
+ depends = []
+ depends_context = list(self.depends_context or ())
+ for func in funcs:
+ deps = getattr(func, '_depends', ())
+ depends.extend(deps(model) if callable(deps) else deps)
+ depends_context.extend(getattr(func, '_depends_context', ()))
- self.depends_context = (self.depends_context or ()) + depends_context
+ self.depends = tuple(depends)
+ self.depends_context = tuple(depends_context)
# display_name may depend on context['lang'] (`test_lp1071710`)
if self.automatic and self.name == 'display_name' and model._rec_name:
@@ -699,6 +693,26 @@ class Field(MetaField('DummyField', (object,), {})):
return Property.search_multi(self.name, self.model_name, operator, value)
#
+ # Cache key for context-dependent fields
+ #
+
+ def cache_key(self, env):
+ """ Return the cache key corresponding to ``self.depends_context``. """
+ get_context = env.context.get
+
+ def get(key):
+ if key == 'force_company':
+ return get_context('force_company') or env.company.id
+ elif key == 'uid':
+ return (env.uid, env.su)
+ elif key == 'active_test':
+ return get_context('active_test', self.context.get('active_test', True))
+ else:
+ return get_context(key)
+
+ return tuple(get(key) for key in self.depends_context)
+
+ #
# Setup of field triggers
#