Support explicit delete and remove for saving and on_change xxx2Many

issue4140
review291281002
This commit is contained in:
Cédric Krier committed 2020-04-12 23:18:15 +02:00
1 parent abb6a22ec6
commit 01a65f6c6b
2 files changed
+27 -18

No files matched your search

+20 -12
View File
@@ -748,30 +748,38 @@ class O2MField(Field):
else:
fields = {}
to_remove = []
for record2 in record.value[self.name]:
if not record2.id:
to_remove.append(record2)
group = record.value[self.name]
if value and value.get('delete'):
for record_id in value['delete']:
record2 = group.get(record_id)
if record2 is not None:
group.remove(
record2, remove=False, signal=False,
force_remove=False)
if value and value.get('remove'):
for record_id in value['remove']:
record2 = record.value[self.name].get(record_id)
record2 = group.get(record_id)
if record2 is not None:
to_remove.append(record2)
for record2 in to_remove:
record.value[self.name].remove(record2, signal=False,
force_remove=False)
group.remove(
record2, remove=True, signal=False,
force_remove=False)
if value and (value.get('add') or value.get('update', [])):
record.value[self.name].add_fields(fields)
for index, vals in value.get('add', []):
new_record = record.value[self.name].new(default=False)
record.value[self.name].add(new_record, index, signal=False)
new_record = None
id_ = vals.pop('id', None)
if id_ is not None:
new_record = group.get(id_)
if not new_record:
new_record = group.new(obj_id=id_, default=False)
group.add(new_record, index, 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'])
record2 = group.get(vals['id'])
if record2 is not None:
record2.set_on_change(vals)
+7 -6
View File
@@ -314,16 +314,17 @@ class Group(SignalEvent, list):
record.signal_connect(self, 'record-changed', self._record_changed)
record.signal_connect(self, 'record-modified',
self._record_modified)
if position == -1:
self.append(record)
else:
self.insert(position, record)
if record not in self:
if position == -1:
self.append(record)
else:
self.insert(position, record)
for record_rm in self.record_removed:
if record_rm.id == record.id:
self.record_removed.remove(record)
self.record_removed.remove(record_rm)
for record_del in self.record_deleted:
if record_del.id == record.id:
self.record_deleted.remove(record)
self.record_deleted.remove(record_del)
self.current_idx = position
record.modified_fields.setdefault('id')
record.signal('record-modified')