diff --git a/tryton/gui/window/view_form/model/group.py b/tryton/gui/window/view_form/model/group.py index ec6c5731b3..825b88068e 100644 --- a/tryton/gui/window/view_form/model/group.py +++ b/tryton/gui/window/view_form/model/group.py @@ -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)) diff --git a/tryton/gui/window/view_form/model/record.py b/tryton/gui/window/view_form/model/record.py index 949a2ad3ad..0101a9c747 100644 --- a/tryton/gui/window/view_form/model/record.py +++ b/tryton/gui/window/view_form/model/record.py @@ -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', diff --git a/tryton/gui/window/view_form/screen/screen.py b/tryton/gui/window/view_form/screen/screen.py index 8961353cf1..6468837188 100644 --- a/tryton/gui/window/view_form/screen/screen.py +++ b/tryton/gui/window/view_form/screen/screen.py @@ -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)