From 49733b01df7317c82b7fb40cf693652118273010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Fri, 6 May 2011 16:00:30 +0200 Subject: [PATCH 1/7] Fix typo in Changelog --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 9504c7d1fd..61fe653da3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -Version 2.0.0 - 2010-04-26 +Version 2.0.0 - 2011-04-26 * Bug fixes (see mercurial logs for details) * Popup form dialog has 3 buttons (close, ok, new) * New UI layout From 56f12033dcc48e21671f45c5d3cd2b1f8f0f26e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 10 May 2011 15:13:49 +0200 Subject: [PATCH 2/7] Fix concurrency conflict on DND for issue1991 --- tryton/gui/window/view_form/model/group.py | 6 ++++++ tryton/gui/window/view_form/view/list.py | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/tryton/gui/window/view_form/model/group.py b/tryton/gui/window/view_form/model/group.py index e2b706be55..efe1f478c0 100644 --- a/tryton/gui/window/view_form/model/group.py +++ b/tryton/gui/window/view_form/model/group.py @@ -228,6 +228,12 @@ class Group(SignalEvent, list): 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) + for record_del in self.record_deleted: + if record_del.id == record.id: + self.record_deleted.remove(record) self.current_idx = position if modified: record.modified_fields.setdefault('id') diff --git a/tryton/gui/window/view_form/view/list.py b/tryton/gui/window/view_form/view/list.py index 3b70c3c502..b2b3a3738a 100644 --- a/tryton/gui/window/view_form/view/list.py +++ b/tryton/gui/window/view_form/view/list.py @@ -84,9 +84,18 @@ class AdaptModelGroup(gtk.GenericTreeModel): group = record_pos.group pos = group.index(record_pos) + offset if group is not record.group: + prev_group = record.group record.group.remove(record, remove=True, force_remove=True) + # Don't remove record from previous group + # as the new parent will change the parent + # This prevents concurrency conflict + record.group.record_removed.remove(record) group.add(record) - record.modified_fields.setdefault(record.parent_name or 'id') + if not record.parent_name: + record.modified_fields.setdefault(prev_group.parent_name) + record.value[prev_group.parent_name] = False + else: + record.modified_fields.setdefault(record.parent_name) group.move(record, pos) def move_before(self, record, path): From 7d4b9216065f5a73cfc3a2a2b671cf7ce706a29b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 10 May 2011 15:23:36 +0200 Subject: [PATCH 3/7] Limit the size of form inside dialog according to the parent/transiant window --- tryton/gui/window/view_form/view/form.py | 6 ++++++ tryton/wizard/main.py | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/tryton/gui/window/view_form/view/form.py b/tryton/gui/window/view_form/view/form.py index f41a4c02a9..12bc70aa88 100644 --- a/tryton/gui/window/view_form/view/form.py +++ b/tryton/gui/window/view_form/view/form.py @@ -43,6 +43,12 @@ class ViewForm(ParserView): viewport.add(scroll) if isinstance(self.screen.window, gtk.Dialog): width, height = self.widget.size_request() + if self.screen.window: + parent = self.screen.window.get_transient_for() + if parent: + parent_width, parent_height = parent.get_size() + width = min(parent_width - 40, width) + height = min(parent_height - 80, height) vbox.set_size_request(width or -1, height or -1) vbox.pack_start(viewport, expand=True, fill=True) diff --git a/tryton/wizard/main.py b/tryton/wizard/main.py index ec9479235b..6cb22a3aec 100644 --- a/tryton/wizard/main.py +++ b/tryton/wizard/main.py @@ -103,10 +103,10 @@ class Dialog(object): width, height = self.screen.screen_container.size_get() parent_width, parent_height = parent.get_size() dia_width, dia_height = self.dia.get_size() - self.widget_width = max(min(parent_width - 20, - max(dia_width, width + 20)), size[0]) - self.widget_height = max(min(parent_height - 60, - height + dia_height + 20), size[1]) + self.widget_width = min(parent_width - 20, + max(dia_width, width + 20, size[0])) + self.widget_height = min(parent_height - 60, + max(height + dia_height + 20, size[1])) self.dia.set_default_size(self.widget_width, self.widget_height) self.screen.widget.show() From 6786df2158092886c3125023ac0c693d0dc80e55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Mon, 16 May 2011 12:21:24 +0200 Subject: [PATCH 4/7] Use sendall for non-ssl socket --- tryton/pysocket.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tryton/pysocket.py b/tryton/pysocket.py index 9936e2421a..4f6009b2be 100644 --- a/tryton/pysocket.py +++ b/tryton/pysocket.py @@ -177,15 +177,15 @@ class PySocket: + (gzip_p and "1" or "0") + msg size = len(msg) - totalsent = 0 - while totalsent < size: - if self.ssl: + if self.ssl: + totalsent = 0 + while totalsent < size: sent = self.ssl_sock.write(msg[totalsent:]) - else: - sent = self.sock.send(msg[totalsent:]) - if sent == 0: - raise RuntimeError, "socket connection broken" - totalsent = totalsent + sent + if sent == 0: + raise RuntimeError, "socket connection broken" + totalsent = totalsent + sent + else: + self.sock.sendall(msg) def receive(self): buf = self.buffer From f5ce81957b7f235d81a3e62d2851e68e4e6cfd18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Mon, 16 May 2011 12:24:55 +0200 Subject: [PATCH 5/7] get_fields in graph view should return empty list --- tryton/gui/window/view_form/view/graph.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tryton/gui/window/view_form/view/graph.py b/tryton/gui/window/view_form/view/graph.py index 6d4d6a16ef..75c43fc037 100644 --- a/tryton/gui/window/view_form/view/graph.py +++ b/tryton/gui/window/view_form/view/graph.py @@ -44,3 +44,6 @@ class ViewGraph(ParserView): def set_cursor(self, new=False, reset_view=True): pass + + def get_fields(self): + return [] From 117935d3abbbbb13471865fe05c62b69b2c8d5ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Mon, 16 May 2011 12:26:19 +0200 Subject: [PATCH 6/7] Manage selection changed for empty selection --- tryton/gui/window/view_form/view/list.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tryton/gui/window/view_form/view/list.py b/tryton/gui/window/view_form/view/list.py index b2b3a3738a..4494e7d0e4 100644 --- a/tryton/gui/window/view_form/view/list.py +++ b/tryton/gui/window/view_form/view/list.py @@ -749,6 +749,8 @@ class ViewList(ParserView): if model and iter_: record = model.get_value(iter_, 0) self.screen.current_record = record + else: + self.screen.current_record = None elif tree_sel.get_mode() == gtk.SELECTION_MULTIPLE: model, paths = tree_sel.get_selected_rows() @@ -756,6 +758,8 @@ class ViewList(ParserView): iter_ = model.get_iter(paths[0]) record = model.get_value(iter_, 0) self.screen.current_record = record + else: + self.screen.current_record = None if hasattr(self.widget_tree, 'editable') \ and self.widget_tree.editable \ From 4224cafe061344d9c6f20cc7e21f4538e20afc8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Mon, 16 May 2011 12:58:06 +0200 Subject: [PATCH 7/7] Fix activate event of many2one when search is required for issue1993 --- tryton/gui/window/view_form/view/form_gtk/many2one.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tryton/gui/window/view_form/view/form_gtk/many2one.py b/tryton/gui/window/view_form/view/form_gtk/many2one.py index 309c1b2791..4f9f967307 100644 --- a/tryton/gui/window/view_form/view/form_gtk/many2one.py +++ b/tryton/gui/window/view_form/view/form_gtk/many2one.py @@ -36,7 +36,7 @@ class Many2One(WidgetInterface): self.wid_text.connect('focus-out-event', lambda x, y: self._focus_out()) self.wid_text.connect_after('changed', self.sig_changed) self.changed = True - self.wid_text.connect_after('activate', self.sig_activate) + self.wid_text.connect('activate', self.sig_activate) self.wid_text.connect_after('focus-out-event', self.sig_activate) self.focus_out = True self.widget.pack_start(self.wid_text, expand=True, fill=True) @@ -93,6 +93,8 @@ class Many2One(WidgetInterface): self.focus_out = False if not value: + if not key_press and not event: + widget.emit_stop_by_name('activate') if not self._readonly and (self.wid_text.get_text() or \ (self.field.get_state_attrs( self.record)['required']) and key_press):