changeset 65002d9965d4 in tryton:default
details: https://hg.tryton.org/tryton?cmd=changeset;node=65002d9965d4
description:
Set loaded fields first after O2M on_change calls
issue9930
review302811002
diffstat:
tryton/gui/window/view_form/model/field.py | 17 ++++++++++++++---
1 files changed, 14 insertions(+), 3 deletions(-)
diffs (38 lines):
diff -r a49fcbe0973a -r 65002d9965d4 tryton/gui/window/view_form/model/field.py
--- a/tryton/gui/window/view_form/model/field.py Wed Feb 03 19:39:33
2021 +0100
+++ b/tryton/gui/window/view_form/model/field.py Thu Feb 04 18:05:18
2021 +0100
@@ -763,12 +763,12 @@
for f in v if f not in fields and f != 'id' and '.' not in f)
if field_names:
try:
- fields = RPCExecute('model', self.attrs['relation'],
+ new_fields = RPCExecute('model', self.attrs['relation'],
'fields_get', list(field_names), context=context)
except RPCException:
return
else:
- fields = {}
+ new_fields = {}
group = record.value[self.name]
if value and value.get('delete'):
@@ -787,7 +787,18 @@
force_remove=False)
if value and (value.get('add') or value.get('update', [])):
- record.value[self.name].add_fields(fields)
+ # First set already added fields to prevent triggering a
+ # second on_change call
+ for vals in value.get('update', []):
+ if 'id' not in vals:
+ continue
+ record2 = group.get(vals['id'])
+ if record2 is not None:
+ vals_to_set = {
+ k: v for k, v in vals.items() if k not in new_fields}
+ record2.set_on_change(vals_to_set)
+
+ record.value[self.name].add_fields(new_fields)
for index, vals in value.get('add', []):
new_record = None
id_ = vals.pop('id', None)