diff --git a/tryton/gui/window/tree.py b/tryton/gui/window/tree.py index 68d27acd1e..94e9919672 100644 --- a/tryton/gui/window/tree.py +++ b/tryton/gui/window/tree.py @@ -67,6 +67,8 @@ class Tree(SignalEvent): context=context) self.tree_res.view.connect('row-activated', self.sig_activate) self.tree_res.view.connect('key_press_event', self.sig_key_press) + self.tree_res.view.connect_after('test-expand-row', + self.sig_test_expand_row) if not name: self.name = self.tree_res.name @@ -259,6 +261,24 @@ class Tree(SignalEvent): for path in paths: self.tree_res.view.expand_row(path, False) + def sig_test_expand_row(self, widget, iter, path): + model = self.tree_res.view.get_model() + iter_children = model.iter_children(iter) + if iter_children and model.get(iter_children, 0)[0] in model.to_reload: + host = rpc._SOCK.host + port = rpc._SOCK.port + while True: + password = common.ask(_('Password:'), self.window, + visibility=False) + if password is None: + return True + res = rpc.login(rpc._USERNAME, password, host, port, + rpc._DATABASE) + if res < 0: + continue + return False + return False + def sig_edit(self): obj_ids = self.ids_get() if self.tree_res.toolbar: diff --git a/tryton/gui/window/view_tree/view_tree.py b/tryton/gui/window/view_tree/view_tree.py index 3281fac8fe..bd4651bec0 100644 --- a/tryton/gui/window/view_tree/view_tree.py +++ b/tryton/gui/window/view_tree/view_tree.py @@ -43,6 +43,7 @@ class ViewTreeModel(gtk.GenericTreeModel, gtk.TreeSortable): self.view = view self.roots = ids self.context = context or {} + self.to_reload = [] self.tree = self._node_process(self.roots) self.pixbufs = pixbufs or {} self.treeview = treeview @@ -57,7 +58,10 @@ class ViewTreeModel(gtk.GenericTreeModel, gtk.TreeSortable): ctx) try: res_ids = rpc.execute(*args) - except: + for obj_id in ids: + if obj_id in self.to_reload: + self.to_reload.remove(obj_id) + except Exception, exception: for obj_id in ids: val = {'id': obj_id} for field in fields: @@ -68,6 +72,8 @@ class ViewTreeModel(gtk.GenericTreeModel, gtk.TreeSortable): else: val[field] = '' res_ids.append(val) + if obj_id not in self.to_reload: + self.to_reload.append(obj_id) for field in self.fields: field_type = self.fields_type[field]['type'] if field in self.fields_attrs \ @@ -165,7 +171,6 @@ class ViewTreeModel(gtk.GenericTreeModel, gtk.TreeSortable): def _node_expand(self, node): node[2] = self._node_process(node[3]) - del node[3] #Mandatory GenericTreeModel method def on_get_path(self, node): @@ -233,7 +238,14 @@ class ViewTreeModel(gtk.GenericTreeModel, gtk.TreeSortable): return [(0, self.tree)] node = node[:] (i, values) = node[-1] - if values[i][2] is None: + + to_reload = False + if len(values[i]) >= 4: + for obj_id in values[i][3]: + if obj_id in self.to_reload: + to_reload = True + + if values[i][2] is None or to_reload: self._node_expand(values[i]) if values[i][2] == []: return None @@ -250,7 +262,14 @@ class ViewTreeModel(gtk.GenericTreeModel, gtk.TreeSortable): if node is None: return len(self.tree) (i, values) = node[-1] - if values[i][2] is None: + + to_reload = False + if len(values[i]) >= 4: + for obj_id in values[i][3]: + if obj_id in self.to_reload: + to_reload = True + + if values[i][2] is None or to_reload: self._node_expand(values[i]) return len(values[i][2]) @@ -262,7 +281,14 @@ class ViewTreeModel(gtk.GenericTreeModel, gtk.TreeSortable): return None node = node[:] (i, values) = node[-1] - if values[i][2] is None: + + to_reload = False + if len(values[i]) >= 4: + for obj_id in values[i][3]: + if obj_id in self.to_reload: + to_reload = True + + if values[i][2] is None or to_reload: self._node_expand(values[i]) if child < len(values[i][2]): node.append((child, values[i][2]))