[IMP] core: avoid extra invalidate of compute no-store field.

`tocompute` in the `Transaction` contains store field on records to
be recomputed. No-store compute fields are directly invalidated from
the cache when a dependency changes (see `BaseModel.modified`).

In fact, `_recompute_field` was actually doing too much for nothing.
Also, it may invalidate caches of compute no-store fields for no reason
(e.g., if they are searchable). Remove the part for field compute
no-store field. And prevent `_recompute_field` callers from calling it
with no-store fields.

closes odoo/odoo#122147

X-original-commit: ba9ccb07fb12558667db97b866df492fd0f5ba4d
Signed-off-by: Raphael Collet <rco@odoo.com>
Signed-off-by: Rémy Voet <ryv@odoo.com>
This commit is contained in:
Rémy Voet (ryv)
2023-05-25 16:29:27 +02:00
parent 4e0eed85d6
commit 28d47d1977
+6 -11
View File
@@ -6345,7 +6345,7 @@ class BaseModel(metaclass=MetaModel):
fields = [self._fields[fname] for fname in fnames]
for field in fields:
if field.compute:
if field.compute and field.store:
self._recompute_field(field)
def _recompute_recordset(self, fnames=None):
@@ -6359,7 +6359,7 @@ class BaseModel(metaclass=MetaModel):
fields = [self._fields[fname] for fname in fnames]
for field in fields:
if field.compute:
if field.compute and field.store:
self._recompute_field(field, self._ids)
def _recompute_field(self, field, ids=None):
@@ -6371,15 +6371,10 @@ class BaseModel(metaclass=MetaModel):
if not ids:
return
records = self.browse(ids)
if field.store:
# do not force recomputation on new records; those will be
# recomputed by accessing the field on the records
records = records.filtered('id')
field.recompute(records)
else:
self.env.cache.invalidate([(field, records._ids)])
self.env.remove_to_compute(field, records)
# do not force recomputation on new records; those will be
# recomputed by accessing the field on the records
records = self.browse(tuple(id_ for id_ in ids if id_))
field.recompute(records)
#
# Generic onchange method