Manage domains on Action Window
review589002
This commit is contained in:
1 parent
26e5fd0570
commit
e071b088da
6 files changed
+86
-24
No files matched your search
@@ -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
|
||||
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in new issue
Block a user