Call on_change's after setting default values

issue3923
review10351002
This commit is contained in:
Cédric Krier committed 2014-06-08 00:36:01 +02:00
1 parent c821aaf8b4
commit b26354df23
2 files changed
+26 -17

No files matched your search

+3 -3
View File
@@ -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)
+23 -14
View File
@@ -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)