diff options
| author | Raphael Collet <rco@odoo.com> | 2019-09-11 08:21:33 +0000 |
|---|---|---|
| committer | Raphael Collet <rco@odoo.com> | 2019-09-12 14:24:58 +0000 |
| commit | 492e4cc5a12fb062e106836fc35889072b85453c (patch) | |
| tree | 93eb8da311aed058a79ce7bc2456f645662dff71 /odoo/fields.py | |
| parent | 956338f28af96dc53bb15ac1c0a7d9888f314b18 (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.py | 56 |
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 # |
