Do not trigger on change when setting change values

Also unify the keyword argument to trigger modified record.

issue11325
review356361002
This commit is contained in:
Cédric Krier committed 2022-04-25 23:19:07 +02:00
1 parent ea7a6beced
commit d43f4a842e
4 files changed
+29 -31

No files matched your search

+9 -8
View File
@@ -674,19 +674,20 @@ class O2MField(Field):
if mode == 'list ids':
records_to_remove = [r for r in group if r.id not in value]
for record_to_remove in records_to_remove:
group.remove(record_to_remove, remove=True, signal=False)
group.remove(record_to_remove, remove=True, modified=False)
group.load(value, modified=modified or default)
else:
for vals in value:
new_record = record.value[self.name].new(default=False)
if default:
# Don't validate as parent will validate
new_record.set_default(vals, signal=False, validate=False)
group.add(new_record, signal=False)
new_record.set_default(
vals, modified=False, validate=False)
group.add(new_record, modified=False)
else:
new_record.set(vals, signal=False)
new_record.set(vals, modified=False)
group.append(new_record)
# Trigger signal only once with the last record
# Trigger modified only once
group.record_modified()
def set(self, record, value, _default=False):
@@ -766,14 +767,14 @@ class O2MField(Field):
record2 = group.get(record_id)
if record2 is not None:
group.remove(
record2, remove=False, signal=False,
record2, remove=False, modified=False,
force_remove=False)
if value and value.get('remove'):
for record_id in value['remove']:
record2 = group.get(record_id)
if record2 is not None:
group.remove(
record2, remove=True, signal=False,
record2, remove=True, modified=False,
force_remove=False)
if value and (value.get('add') or value.get('update', [])):
@@ -796,7 +797,7 @@ class O2MField(Field):
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)
group.add(new_record, index, modified=False)
new_record.set_on_change(vals)
for vals in value.get('update', []):
+11 -15
View File
@@ -308,7 +308,7 @@ class Group(list):
def context(self, value):
self._context = value.copy()
def add(self, record, position=-1, signal=True):
def add(self, record, position=-1, modified=True):
if record.group is not self:
record.group = self
if record not in self:
@@ -323,8 +323,8 @@ class Group(list):
if record_del.id == record.id:
self.record_deleted.remove(record_del)
self.current_idx = position
record.set_modified('id')
if signal:
record.modified_fields.setdefault('id')
if modified:
# Set parent field to trigger on_change
if self.parent and self.parent_name in self.fields:
field = self.fields[self.parent_name]
@@ -384,16 +384,15 @@ class Group(list):
record.default_get(rec_name=rec_name)
return record
def unremove(self, record, signal=True):
def unremove(self, record, modified=True):
if record in self.record_removed:
self.record_removed.remove(record)
if record in self.record_deleted:
self.record_deleted.remove(record)
if signal:
if modified:
self.record_modified()
def remove(self, record, remove=False, modified=True, signal=True,
force_remove=False):
def remove(self, record, remove=False, modified=True, force_remove=False):
idx = self.index(record)
if record.id >= 0:
if remove:
@@ -406,10 +405,7 @@ class Group(list):
self.record_removed.remove(record)
if record not in self.record_deleted:
self.record_deleted.append(record)
if record.parent:
record.parent.set_modified('id')
if modified:
record.set_modified('id')
record.modified_fields.setdefault('id')
if record.id < 0 or force_remove:
self._remove(record)
@@ -418,7 +414,7 @@ class Group(list):
else:
self.current_idx = None
if signal:
if modified:
self.record_modified()
def prev(self):
@@ -463,8 +459,8 @@ class Group(list):
except RPCException:
return False
for record in new:
record.set_default(values, signal=False)
# Trigger signal only once with the last record
record.set_default(values, modified=False)
# Trigger modified only once with the last record
self.record_modified()
def get(self, id):
@@ -483,7 +479,7 @@ class Group(list):
self.parent.group.children.remove(self)
except ValueError:
pass
# One2Many connect the group to itself to send signals to the parent
# One2Many connect the group to itself to send modified to the parent
# but as we are destroying the group, we do not need to notify the
# parent otherwise it will trigger unnecessary display.
self.screens.clear()
+6 -6
View File
@@ -141,7 +141,7 @@ class Record:
if record and not record.destroyed and value:
for key in record.modified_fields:
value.pop(key, None)
record.set(value, signal=False)
record.set(value, modified=False)
if name != '*':
return self.group.fields[name]
@@ -424,7 +424,7 @@ class Record:
else:
return self.group.local_context
def set_default(self, val, signal=True, validate=True):
def set_default(self, val, modified=True, validate=True):
fieldnames = []
for fieldname, value in list(val.items()):
if fieldname in {'_write', '_delete', '_timestamp'}:
@@ -445,10 +445,10 @@ class Record:
self.on_change_with(fieldnames)
if validate:
self.validate(softvalidation=True)
if signal:
if modified:
self.set_modified()
def set(self, val, signal=True, validate=True):
def set(self, val, modified=True, validate=True):
later = {}
fieldnames = []
for fieldname, value in val.items():
@@ -479,7 +479,7 @@ class Record:
self._loaded.add(fieldname)
if validate:
self.validate(fieldnames, softvalidation=True)
if signal:
if modified:
self.set_modified()
def set_on_change(self, values):
@@ -505,7 +505,7 @@ class Record:
def reset(self, value):
self.cancel()
self.set(value, signal=False)
self.set(value, modified=False)
if self.parent:
self.parent.on_change([self.group.child_name])
+3 -2
View File
@@ -796,7 +796,8 @@ class Screen:
# set current model to None to prevent __select_changed
# to save the previous_model as it can be already deleted.
self.current_record = None
record.group.remove(record, remove=remove, signal=False,
record.group.remove(
record, remove=remove, modified=False,
force_remove=force_remove)
# call only once
record.set_modified()
@@ -978,7 +979,7 @@ class Screen:
if set_cursor:
self.set_cursor(reset_view=False)
self.set_tree_state()
# Force record_message signal
# Force record_message
self.current_record = self.current_record
def display_next(self):