diff options
| author | Raphael Collet <rco@odoo.com> | 2020-09-02 11:37:24 +0000 |
|---|---|---|
| committer | Raphael Collet <rco@odoo.com> | 2020-09-03 13:15:14 +0000 |
| commit | 5eb7e81f3e11798536f506af5786fec58d2a3dab (patch) | |
| tree | 52ff84d4d18c9abdba534ff01a7908cc36164a89 | |
| parent | 1a9b873535380ba62e495f7a1f3d54844d7d4acb (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>
| -rw-r--r-- | odoo/models.py | 21 |
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) |
