From b26354df2370010067b19d927bcdeb4468f53a2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sun, 8 Jun 2014 00:36:01 +0200 Subject: [PATCH] Call on_change's after setting default values issue3923 review10351002 --- tryton/gui/window/view_form/model/field.py | 6 ++-- tryton/gui/window/view_form/model/record.py | 37 +++++++++++++-------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/tryton/gui/window/view_form/model/field.py b/tryton/gui/window/view_form/model/field.py index 9d78a29276..c57e7e214b 100644 --- a/tryton/gui/window/view_form/model/field.py +++ b/tryton/gui/window/view_form/model/field.py @@ -37,9 +37,8 @@ class Field(object): def sig_changed(self, record): if self.get_state_attrs(record).get('readonly', False): return - if self.attrs.get('on_change', False): - record.on_change(self.name, self.attrs['on_change']) - record.on_change_with(self.name) + record.on_change([self.name]) + record.on_change_with([self.name]) record.autocomplete_with(self.name) def domains_get(self, record): @@ -648,6 +647,7 @@ class O2MField(Field): record.modified_fields.setdefault(self.name) def set_on_change(self, record, value): + self._set_default_value(record) if isinstance(value, (list, tuple)): self._set_value(record, value) record.modified_fields.setdefault(self.name) diff --git a/tryton/gui/window/view_form/model/record.py b/tryton/gui/window/view_form/model/record.py index 587aaff785..e7ec55edab 100644 --- a/tryton/gui/window/view_form/model/record.py +++ b/tryton/gui/window/view_form/model/record.py @@ -418,6 +418,7 @@ class Record(SignalEvent): return self.group.context def set_default(self, val, signal=True): + fieldnames = [] for fieldname, value in val.items(): if fieldname not in self.group.fields: continue @@ -432,6 +433,9 @@ class Record(SignalEvent): del self.value[field_rec_name] self.group.fields[fieldname].set_default(self, value) self._loaded.add(fieldname) + fieldnames.append(fieldname) + self.on_change(fieldnames) + self.on_change_with(fieldnames) self.validate(softvalidation=True) if signal: self.signal('record-changed') @@ -529,18 +533,25 @@ class Record(SignalEvent): res['id'] = self.id return res - def on_change(self, fieldname, attr): - if isinstance(attr, basestring): - attr = PYSONDecoder().decode(attr) - args = self._get_on_change_args(attr) - try: - res = RPCExecute('model', self.model_name, 'on_change_' + - fieldname, args, context=self.context_get()) - except RPCException: - return - self.set_on_change(res) + def on_change(self, fieldnames): + values = {} + for fieldname in fieldnames: + on_change = self.group.fields[fieldname].attrs.get('on_change') + if not on_change: + continue + values.update(self._get_on_change_args(on_change)) - def on_change_with(self, field_name): + if values: + try: + changes = RPCExecute('model', self.model_name, 'on_change', + values, fieldnames, context=self.context_get()) + except RPCException: + return + for change in changes: + self.set_on_change(change) + + def on_change_with(self, field_names): + field_names = set(field_names) fieldnames = set() values = {} later = set() @@ -549,9 +560,7 @@ class Record(SignalEvent): 'on_change_with') if not on_change_with: continue - if field_name not in on_change_with: - continue - if field_name == fieldname: + if not field_names & set(on_change_with): continue if fieldnames & set(on_change_with): later.add(fieldname)