[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#57037

X-original-commit: 6b80632e98a932d2b552d6dec0fc7208ca8e04c1
Signed-off-by: Raphael Collet (rco) <rco@openerp.com>
This commit is contained in:
Raphael Collet
2020-09-03 13:42:15 +00:00
parent 773b98cfd7
commit a216844e6b
+21
View File
@@ -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)