Call on_change's after setting default values
issue3923 review10351002
This commit is contained in:
1 parent
c821aaf8b4
commit
b26354df23
2 files changed
+26
-17
No files matched your search
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user