summaryrefslogtreecommitdiff
path: root/odoo/models.py
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2020-09-02 11:37:24 +0000
committerRaphael Collet <rco@odoo.com>2020-09-03 13:15:14 +0000
commit5eb7e81f3e11798536f506af5786fec58d2a3dab (patch)
tree52ff84d4d18c9abdba534ff01a7908cc36164a89 /odoo/models.py
parent1a9b873535380ba62e495f7a1f3d54844d7d4acb (diff)
[FIX] core: reintroduce model dependencies
Make sure that model dependencies are flushed before searching with a given domain. This fixes inconsistencies in `search` and `read_group`. closes odoo/odoo#57033 X-original-commit: 6b80632e98a932d2b552d6dec0fc7208ca8e04c1 Signed-off-by: Raphael Collet (rco) <rco@openerp.com>
Diffstat (limited to 'odoo/models.py')
-rw-r--r--odoo/models.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/odoo/models.py b/odoo/models.py
index 62f9f9e457f..63a773ce28f 100644
--- a/odoo/models.py
+++ b/odoo/models.py
@@ -350,6 +350,14 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
as attribute.
"""
+ _depends = {}
+ """dependencies of models backed up by SQL views
+ ``{model_name: field_names}``, where ``field_names`` is an iterable.
+ This is only used to determine the changes to flush to database before
+ executing ``search()`` or ``read_group()``. It won't be used for cache
+ invalidation or recomputing fields.
+ """
+
# default values for _transient_vacuum()
_transient_max_count = lazy_classproperty(lambda _: config.get('osv_memory_count_limit'))
_transient_max_hours = lazy_classproperty(lambda _: config.get('transient_age_limit'))
@@ -609,6 +617,7 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
cls._sequence = None
cls._log_access = cls._auto
cls._inherits = {}
+ cls._depends = {}
cls._sql_constraints = {}
for base in reversed(cls.__bases__):
@@ -624,6 +633,9 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
cls._inherits.update(base._inherits)
+ for mname, fnames in base._depends.items():
+ cls._depends.setdefault(mname, []).extend(fnames)
+
for cons in base._sql_constraints:
cls._sql_constraints[cons[0]] = cons
@@ -4389,6 +4401,15 @@ Fields:
if self._active_name:
to_flush[self._name].add(self._active_name)
+ # flush model dependencies (recursively)
+ if self._depends:
+ models = [self]
+ while models:
+ model = models.pop()
+ for model_name, field_names in model._depends.items():
+ to_flush[model_name].update(field_names)
+ models.append(self.env[model_name])
+
for model_name, field_names in to_flush.items():
self.env[model_name].flush(field_names)