changeset 696f8c2879dd in trytond:5.2
details: https://hg.tryton.org/trytond?cmd=changeset;node=696f8c2879dd
description:
Do not use only cache if context depends on other fields
We must read all the required fields to set a correct context on the
field.
issue9187
review297391002
(grafted from a4b513b75f9ca23a19ee7eb7b12d3cb9621b36cb)
diffstat:
trytond/model/modelstorage.py | 11 ++++++++---
1 files changed, 8 insertions(+), 3 deletions(-)
diffs (44 lines):
diff -r c97127c29b90 -r 696f8c2879dd trytond/model/modelstorage.py
--- a/trytond/model/modelstorage.py Sat Apr 04 15:35:29 2020 +0200
+++ b/trytond/model/modelstorage.py Fri Apr 10 18:25:03 2020 +0200
@@ -1445,11 +1445,13 @@
ifields = islice(ifields, 0, threshold)
ffields.update(ifields)
+ require_context_field = False
# add datetime_field
for field in list(ffields.values()):
if hasattr(field, 'datetime_field') and field.datetime_field:
datetime_field = self._fields[field.datetime_field]
ffields[field.datetime_field] = datetime_field
+ require_context_field = True
# add depends of field with context
for field in list(ffields.values()):
@@ -1459,12 +1461,14 @@
if context_field_name not in field.depends:
continue
context_field = self._fields.get(context_field_name)
+ require_context_field = True
if context_field not in ffields:
ffields[context_field_name] = context_field
def filter_(id_):
- return (name not in self._cache.get(id_, {})
- and name not in self._local_cache.get(id_, {}))
+ return (id_ == self.id # Ensure the value is read
+ or (name not in self._cache.get(id_, {})
+ and name not in self._local_cache.get(id_, {})))
def unique(ids):
s = set()
@@ -1532,7 +1536,8 @@
self._transaction.set_user(self._user), \
self._transaction.reset_context(), \
self._transaction.set_context(self._context):
- if self.id in self._cache and name in self._cache[self.id]:
+ if (self.id in self._cache and name in self._cache[self.id]
+ and not require_context_field):
# Use values from cache
ids = islice(chain(islice(self._ids, index, None),
islice(self._ids, 0, max(index - 1, 0))),