Refactor Screen.delete
review83003
This commit is contained in:
1 parent
bb15984d60
commit
9666382ce6
3 files changed
+69
-97
No files matched your search
@@ -152,6 +152,9 @@ class Group(SignalEvent, list):
|
||||
saved.append(record.save(force_reload=False))
|
||||
return saved
|
||||
|
||||
def delete(self, records, context=None):
|
||||
return Record.delete(records, context=context)
|
||||
|
||||
@property
|
||||
def root_group(self):
|
||||
root = self
|
||||
@@ -176,7 +179,7 @@ class Group(SignalEvent, list):
|
||||
|
||||
def on_write_ids(self, ids):
|
||||
if not self.on_write:
|
||||
return False
|
||||
return []
|
||||
res = []
|
||||
for fnct in self.on_write:
|
||||
args = ('model', self.model_name, fnct, ids, self.context)
|
||||
@@ -185,7 +188,7 @@ class Group(SignalEvent, list):
|
||||
except TrytonServerError, exception:
|
||||
res2 = common.process_exception(exception, *args)
|
||||
if not res2:
|
||||
return False
|
||||
return []
|
||||
res += res2
|
||||
return list({}.fromkeys(res))
|
||||
|
||||
|
||||
@@ -266,6 +266,35 @@ class Record(SignalEvent):
|
||||
self.parent.save(force_reload=force_reload)
|
||||
return self.id
|
||||
|
||||
@staticmethod
|
||||
def delete(records, context=None):
|
||||
if not records:
|
||||
return
|
||||
record = records[0]
|
||||
group = record.group
|
||||
assert all(r.model_name == record.model_name for r in records)
|
||||
assert all(r.group == group for r in records)
|
||||
records = [r for r in records if r.id < 0]
|
||||
ctx = {}
|
||||
ctx.update(rpc.CONTEXT)
|
||||
ctx.update(context or {})
|
||||
ctx['_timestamp'] = {}
|
||||
for rec in records:
|
||||
context['_timestamp'].update(rec.get_timestamp())
|
||||
record_ids = set(r.id for r in records)
|
||||
reload_ids = set(group.on_write_ids(list(record_ids)))
|
||||
reload_ids -= record_ids
|
||||
reload_ids = list(reload_ids)
|
||||
args = ('model', record.model_name, 'delete', list(record_ids), ctx)
|
||||
try:
|
||||
rpc.execute(*args)
|
||||
except TrytonServerError, exception:
|
||||
if not common.process_exception(exception, *args):
|
||||
return False
|
||||
if reload_ids:
|
||||
group.root_group.reload(reload_ids)
|
||||
return True
|
||||
|
||||
def default_get(self, domain=None, context=None):
|
||||
if len(self.group.fields):
|
||||
args = ('model', self.model_name, 'default_get',
|
||||
|
||||
@@ -515,106 +515,46 @@ class Screen(SignalEvent):
|
||||
self.group.unremove(record)
|
||||
|
||||
def remove(self, delete=False, remove=False, force_remove=False):
|
||||
res = False
|
||||
reload_ids = []
|
||||
records = None
|
||||
if self.current_view.view_type == 'form' and self.current_record:
|
||||
record_id = self.current_record.id
|
||||
if delete and record_id > 0:
|
||||
context = {}
|
||||
context.update(rpc.CONTEXT)
|
||||
context.update(self.context)
|
||||
context['_timestamp'] = self.current_record.get_timestamp()
|
||||
reload_ids = self.group.on_write_ids([record_id])
|
||||
if reload_ids and record_id in reload_ids:
|
||||
reload_ids.remove(record_id)
|
||||
args = ('model', self.model_name, 'delete', [record_id],
|
||||
context)
|
||||
try:
|
||||
res = rpc.execute(*args)
|
||||
except TrytonServerError, exception:
|
||||
res = common.process_exception(exception, *args)
|
||||
if not res:
|
||||
return False
|
||||
self.current_view.set_cursor()
|
||||
record = self.current_record
|
||||
idx = record.group.index(record)
|
||||
record.group.remove(record, remove=remove,
|
||||
force_remove=force_remove)
|
||||
records = [self.current_record]
|
||||
elif self.current_view.view_type == 'tree':
|
||||
records = self.current_view.selected_records()
|
||||
if delete:
|
||||
if not self.group.delete([self.current_record]):
|
||||
return False
|
||||
|
||||
if delete:
|
||||
if (record.parent and
|
||||
record.parent.model_name == record.model_name):
|
||||
top_record = records[0]
|
||||
idx = top_record.group.index(top_record)
|
||||
path = top_record.get_path(self.group)
|
||||
|
||||
for record in records:
|
||||
# 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,
|
||||
force_remove=force_remove)
|
||||
# send record-changed only once
|
||||
record.signal('record-changed')
|
||||
|
||||
if delete:
|
||||
for record in records:
|
||||
if record.parent:
|
||||
record.parent.save()
|
||||
|
||||
if record.group:
|
||||
idx = min(idx, len(record.group) - 1)
|
||||
self.current_record = record.group[idx]
|
||||
elif (record.parent and
|
||||
record.parent.model_name == record.model_name):
|
||||
self.current_record = record.parent
|
||||
else:
|
||||
self.current_record = None
|
||||
if reload_ids:
|
||||
self.group.root_group.reload(reload_ids)
|
||||
self.display()
|
||||
res = True
|
||||
if self.current_view.view_type == 'tree':
|
||||
records = self.current_view.selected_records()
|
||||
saved_records = [r for r in records if r.id >= 0]
|
||||
if delete and saved_records:
|
||||
context = {}
|
||||
context.update(rpc.CONTEXT)
|
||||
context.update(self.context)
|
||||
context['_timestamp'] = {}
|
||||
for record in saved_records:
|
||||
context['_timestamp'].update(record.get_timestamp())
|
||||
reload_ids = self.group.on_write_ids([x.id for x in saved_records])
|
||||
if reload_ids:
|
||||
for record in saved_records:
|
||||
if record.id in reload_ids:
|
||||
reload_ids.remove(record.id)
|
||||
args = ('model', self.model_name, 'delete',
|
||||
[x.id for x in saved_records], context)
|
||||
try:
|
||||
res = rpc.execute(*args)
|
||||
except TrytonServerError, exception:
|
||||
res = common.process_exception(exception, *args)
|
||||
if not res:
|
||||
return False
|
||||
if not records:
|
||||
return True
|
||||
path = self.current_view.store.on_get_path(records[0])
|
||||
for record in records:
|
||||
# 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,
|
||||
force_remove=force_remove)
|
||||
|
||||
# send record-changed only once
|
||||
record.signal('record-changed')
|
||||
|
||||
if delete:
|
||||
for record in records:
|
||||
if record.parent:
|
||||
record.parent.save()
|
||||
|
||||
if path[-1] > 0:
|
||||
path = path[:-1] + (path[-1] - 1,)
|
||||
else:
|
||||
path = path[:-1]
|
||||
if path:
|
||||
iter_ = self.current_view.store.get_iter(path)
|
||||
self.current_record = self.current_view.store.get_value(iter_, 0)
|
||||
elif len(self.group):
|
||||
self.current_record = self.group[0]
|
||||
if reload_ids:
|
||||
self.group.root_group.reload(reload_ids)
|
||||
self.current_view.set_cursor()
|
||||
self.display()
|
||||
res = True
|
||||
if idx > 0:
|
||||
record = top_record.group[idx - 1]
|
||||
path = path[:-1] + ((path[-1][0], record.id,))
|
||||
else:
|
||||
path = path[:-1]
|
||||
if path:
|
||||
self.current_record = self.group.get_by_path(path)
|
||||
elif len(self.group):
|
||||
self.current_record = self.group[0]
|
||||
self.current_view.set_cursor()
|
||||
self.display()
|
||||
self.request_set()
|
||||
return res
|
||||
return True
|
||||
|
||||
def load(self, ids, set_cursor=True, modified=False):
|
||||
self.group.load(ids, display=False, modified=modified)
|
||||
|
||||
Reference in new issue
Block a user