From e071b088da5d5c41398b9f874b1a9dacceeea796 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Fri, 16 Nov 2012 00:49:16 +0100 Subject: [PATCH] Manage domains on Action Window review589002 --- CHANGELOG | 1 + tryton/action/main.py | 9 +- tryton/gui/window/form.py | 5 +- tryton/gui/window/view_form/screen/screen.py | 9 +- .../window/view_form/view/screen_container.py | 82 +++++++++++++++---- tryton/gui/window/window.py | 4 +- 6 files changed, 86 insertions(+), 24 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index a42db36321..b6e2da01f7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Manage domains on Action Window * Use range for Date/Time fields in filter box * Allow multi-selection for Selection field in filter box diff --git a/tryton/action/main.py b/tryton/action/main.py index ec681af28d..78a94299ea 100644 --- a/tryton/action/main.py +++ b/tryton/action/main.py @@ -119,6 +119,12 @@ class Action(object): search_value = PYSONDecoder(search_context).decode( action['pyson_search_value'] or '[]') + tab_domain_context = ctx.copy() + tab_domain_context['context'] = ctx + tab_domain_context['_user'] = rpc._USER + decoder = PYSONDecoder(tab_domain_context) + tab_domain = [(n, decoder.decode(d)) for n, d in action['domains']] + name = False if action.get('window_name', True): name = action.get('name', False) @@ -131,7 +137,8 @@ class Action(object): limit=action.get('limit'), auto_refresh=action.get('auto_refresh'), search_value=search_value, - icon=(action.get('icon.rec_name') or '')) + icon=(action.get('icon.rec_name') or ''), + tab_domain=tab_domain) elif action['type'] == 'ir.action.wizard': Window.create_wizard(action['wiz_name'], data, direct_print=action.get('direct_print', False), diff --git a/tryton/gui/window/form.py b/tryton/gui/window/form.py index 5fb66ced35..421a68bf04 100644 --- a/tryton/gui/window/form.py +++ b/tryton/gui/window/form.py @@ -89,7 +89,7 @@ class Form(SignalEvent, TabContent): def __init__(self, model, res_id=False, domain=None, mode=None, view_ids=None, context=None, name=False, limit=None, - auto_refresh=False, search_value=None): + auto_refresh=False, search_value=None, tab_domain=None): super(Form, self).__init__() if not mode: @@ -112,7 +112,8 @@ class Form(SignalEvent, TabContent): self.screen = Screen(self.model, mode=mode, context=self.context, view_ids=view_ids, domain=domain, limit=limit, - readonly=bool(auto_refresh), search_value=search_value) + readonly=bool(auto_refresh), search_value=search_value, + tab_domain=tab_domain) self.screen.widget.show() if not name: diff --git a/tryton/gui/window/view_form/screen/screen.py b/tryton/gui/window/view_form/screen/screen.py index 27d2f2afc1..3361737ec8 100644 --- a/tryton/gui/window/view_form/screen/screen.py +++ b/tryton/gui/window/view_form/screen/screen.py @@ -32,7 +32,7 @@ class Screen(SignalEvent): def __init__(self, model_name, view_ids=None, mode=None, context=None, views_preload=None, domain=None, row_activate=None, limit=None, readonly=False, exclude_field=None, sort=None, search_value=None, - alternate_view=False): + tab_domain=None, alternate_view=False): if view_ids is None: view_ids = [] if mode is None: @@ -70,7 +70,7 @@ class Screen(SignalEvent): self.new_group() self.__current_record = None self.current_record = None - self.screen_container = ScreenContainer() + self.screen_container = ScreenContainer(tab_domain) self.screen_container.alternate_view = alternate_view self.widget = self.screen_container.widget_get() self.__current_view = 0 @@ -169,6 +169,11 @@ class Screen(SignalEvent): domain = ['AND', domain, self.domain] else: domain = self.domain + + tab_domain = self.screen_container.get_tab_domain() + if tab_domain: + domain = ['AND', domain, tab_domain] + try: ids = RPCExecute('model', self.model_name, 'search', domain, self.offset, self.limit, self.sort, context=self.context) diff --git a/tryton/gui/window/view_form/view/screen_container.py b/tryton/gui/window/view_form/view/screen_container.py index ebdeab002a..0f872f74e1 100644 --- a/tryton/gui/window/view_form/view/screen_container.py +++ b/tryton/gui/window/view_form/view/screen_container.py @@ -71,30 +71,19 @@ class Selection(gtk.ScrolledWindow): class ScreenContainer(object): - def __init__(self): + def __init__(self, tab_domain): self.viewport = gtk.Viewport() self.viewport.set_shadow_type(gtk.SHADOW_NONE) self.vbox = gtk.VBox(spacing=3) - self.vbox.pack_end(self.viewport) - self.filter_vbox = None - self.filter_button = None - self.but_prev = None - self.but_next = None self.alternate_viewport = gtk.Viewport() self.alternate_viewport.set_shadow_type(gtk.SHADOW_NONE) self.alternate_view = False self.search_window = None self.search_table = None - - def widget_get(self): - return self.vbox - - def set_screen(self, screen): - self.screen = screen + self.tab_domain = tab_domain or [] tooltips = common.Tooltips() - if self.filter_vbox is not None: - return + self.filter_vbox = gtk.VBox(spacing=0) self.filter_vbox.set_border_width(0) hbox = gtk.HBox(homogeneous=False, spacing=0) @@ -171,22 +160,56 @@ class ScreenContainer(object): hbox.show_all() hbox.set_focus_chain([self.search_entry]) - self.filter_vbox.pack_start(hbox, expand=True, fill=False) + self.filter_vbox.pack_start(hbox, expand=False, fill=False) hseparator = gtk.HSeparator() hseparator.show() - self.filter_vbox.pack_start(hseparator, expand=True, fill=False) + self.filter_vbox.pack_start(hseparator, expand=False, fill=False) - self.vbox.pack_start(self.filter_vbox, expand=False, fill=True) + if self.tab_domain: + self.notebook = gtk.Notebook() + self.notebook.props.homogeneous = True + self.notebook.set_scrollable(True) + for name, domain in self.tab_domain: + label = gtk.Label('_' + name) + label.set_use_underline(True) + self.notebook.append_page(gtk.VBox(), label) + self.filter_vbox.pack_start(self.notebook, expand=True, fill=True) + self.notebook.show_all() + # Set the current page before connecting to switch-page to not + # trigger the search a second times. + self.notebook.set_current_page(0) + self.notebook.get_nth_page(0).pack_end(self.viewport) + self.notebook.connect('switch-page', self.switch_page) + self.notebook.connect_after('switch-page', self.switch_page_after) + filter_expand = True + else: + self.notebook = None + self.vbox.pack_end(self.viewport) + filter_expand = False + + self.vbox.pack_start(self.filter_vbox, expand=filter_expand, fill=True) self.but_next.set_sensitive(False) self.but_prev.set_sensitive(False) tooltips.enable() + def widget_get(self): + return self.vbox + + def set_screen(self, screen): + self.screen = screen + def show_filter(self): if self.filter_vbox: self.filter_vbox.show() + if self.notebook: + self.notebook.set_show_tabs(True) + if self.viewport in self.vbox.get_children(): + self.vbox.remove(self.viewport) + self.notebook.get_nth_page(self.notebook.get_current_page() + ).pack_end(self.viewport) def hide_filter(self): if self.filter_vbox: @@ -194,6 +217,12 @@ class ScreenContainer(object): if self.filter_button and self.filter_button.get_active(): self.filter_button.set_active(False) self.filter_button.toggled() + if self.notebook: + self.notebook.set_show_tabs(False) + if self.viewport not in self.vbox.get_children(): + self.notebook.get_nth_page(self.notebook.get_current_page() + ).remove(self.viewport) + self.vbox.pack_end(self.viewport) def set(self, widget): if self.alternate_view: @@ -232,6 +261,25 @@ class ScreenContainer(object): def search_prev(self, widget=None): self.screen.search_prev(self.get_text()) + def switch_page(self, notebook, page, page_num): + current_page = notebook.get_nth_page(notebook.get_current_page()) + current_page.remove(self.viewport) + + new_page = notebook.get_nth_page(page_num) + new_page.pack_end(self.viewport) + + def switch_page_after(self, notebook, page, page_num): + self.do_search() + notebook.grab_focus() + + def get_tab_domain(self): + if not self.notebook: + return [] + idx = self.notebook.get_current_page() + if idx < 0: + return [] + return self.tab_domain[idx][1] + def match_selected(self, completion, model, iter): def callback(): self.update() diff --git a/tryton/gui/window/window.py b/tryton/gui/window/window.py index 6d2f16162e..42a9e4633f 100644 --- a/tryton/gui/window/window.py +++ b/tryton/gui/window/window.py @@ -21,7 +21,7 @@ class Window(object): @staticmethod def create(view_ids, model, res_id=False, domain=None, context=None, mode=None, name=False, limit=None, - auto_refresh=False, search_value=None, icon=None): + auto_refresh=False, search_value=None, icon=None, tab_domain=None): from tryton.gui import Main if context is None: context = {} @@ -31,7 +31,7 @@ class Window(object): win = Form(model, res_id, domain, mode=mode, view_ids=(view_ids or []), context=context, name=name, limit=limit, auto_refresh=auto_refresh, - search_value=search_value) + search_value=search_value, tab_domain=tab_domain) else: from board import Board win = Board(model, view_ids and view_ids[0] or None,