Recursively call set_on_change in One2Many

review611003
This commit is contained in:
Cédric Krier committed 2012-12-23 22:38:39 +01:00
1 parent ed7df2e953
commit 5d117893be
2 files changed
+29 -27

No files matched your search

+2 -2
View File
@@ -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):
+27 -25
View File
@@ -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')