[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:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user