From 5d117893be8549d6c6bcbbcaa3f3b9bf2a900580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sun, 23 Dec 2012 22:38:39 +0100 Subject: [PATCH] Recursively call set_on_change in One2Many review611003 --- tryton/gui/window/view_form/model/field.py | 4 +- tryton/gui/window/view_form/model/record.py | 52 +++++++++++---------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/tryton/gui/window/view_form/model/field.py b/tryton/gui/window/view_form/model/field.py index 04d6a3cb2c..ad6ec7adb9 100644 --- a/tryton/gui/window/view_form/model/field.py +++ b/tryton/gui/window/view_form/model/field.py @@ -712,14 +712,14 @@ class O2MField(CharField): for vals in value.get('add', []): new_record = record.value[self.name].new(default=False) record.value[self.name].add(new_record) - new_record.set(vals, modified=True, signal=False) + new_record.set_on_change(vals) for vals in value.get('update', []): if 'id' not in vals: continue record2 = record.value[self.name].get(vals['id']) if record2 is not None: - record2.set(vals, modified=True, signal=False) + record2.set_on_change(vals) return True def validation_domains(self, record): diff --git a/tryton/gui/window/view_form/model/record.py b/tryton/gui/window/view_form/model/record.py index 871d846d41..d0b83fe8d3 100644 --- a/tryton/gui/window/view_form/model/record.py +++ b/tryton/gui/window/view_form/model/record.py @@ -439,6 +439,31 @@ class Record(SignalEvent): if signal: self.signal('record-changed') + def set_on_change(self, values): + later = {} + for fieldname, value in values.items(): + if fieldname not in self.group.fields: + continue + if isinstance(self.group.fields[fieldname], fields.O2MField): + later[fieldname] = value + continue + if isinstance(self.group.fields[fieldname], (fields.M2OField, + fields.ReferenceField)): + field_rec_name = fieldname + '.rec_name' + if field_rec_name in values: + self.value[field_rec_name] = values[field_rec_name] + elif field_rec_name in self.value: + del self.value[field_rec_name] + self.group.fields[fieldname].set_on_change(self, value) + for fieldname, value in later.items(): + # on change recursion checking is done only for x2many + field_x2many = self.group.fields[fieldname] + try: + field_x2many.in_on_change = True + field_x2many.set_on_change(self, value) + finally: + field_x2many.in_on_change = False + def reload(self, fields=None): if self.id < 0: return @@ -492,29 +517,7 @@ class Record(SignalEvent): 'on_change_' + fieldname, args, context=self.context_get()) except RPCException: return - later = {} - for fieldname, value in res.items(): - if fieldname not in self.group.fields: - continue - if isinstance(self.group.fields[fieldname], fields.O2MField): - later[fieldname] = value - continue - if isinstance(self.group.fields[fieldname], (fields.M2OField, - fields.ReferenceField)): - field_rec_name = fieldname + '.rec_name' - if field_rec_name in res: - self.value[field_rec_name] = res[field_rec_name] - elif field_rec_name in self.value: - del self.value[field_rec_name] - self.group.fields[fieldname].set_on_change(self, value) - for fieldname, value in later.items(): - # on change recursion checking is done only for x2many - field_x2many = self.group.fields[fieldname] - try: - field_x2many.in_on_change = True - field_x2many.set_on_change(self, value) - finally: - field_x2many.in_on_change = False + self.set_on_change(res) def on_change_with(self, field_name): fieldnames = set() @@ -545,8 +548,7 @@ class Record(SignalEvent): values, list(fieldnames), context=self.context_get()) except RPCException: return - for fieldname, value in result.items(): - self.group.fields[fieldname].set_on_change(self, value) + self.set_on_change(result) for fieldname in later: on_change_with = self.group.fields[fieldname].attrs.get( 'on_change_with')