def __init__(self, window, parent, model, attrs={}): interface.widget_interface.__init__(self, window, parent, model, attrs) self.act_id = int(attrs['name']) res = rpc.session.rpc_exec_auth('/object', 'execute', 'ir.actions.actions', 'read', [self.act_id], ['type'], rpc.session.context) if not res: raise Exception, 'ActionNotFound' type = res[0]['type'] self.action = rpc.session.rpc_exec_auth('/object', 'execute', type, 'read', [self.act_id], False, rpc.session.context)[0] if 'view_mode' in attrs: self.action['view_mode'] = attrs['view_mode'] if self.action['type'] == 'ir.actions.act_window': if not self.action.get('domain', False): self.action['domain'] = '[]' if attrs.get('domain', False): self.action['domain'] = attrs.get('domain') self.context = {'active_id': False, 'active_ids': []} self.context.update( tools.expr_eval(self.action.get('context', '{}'), self.context.copy())) self.domain = tools.expr_eval(self.action['domain'], self.context.copy()) view_id = [] if self.action['view_id']: view_id = [self.action['view_id'][0]] if self.action['view_type'] == 'form': mode = (self.action['view_mode'] or 'form,tree').split(',') self.screen = Screen(self.action['res_model'], view_type=mode, context=self.context, view_ids=view_id, domain=self.domain) self.win_gl = glade.XML(common.terp_path("openerp.glade"), 'widget_paned', gettext.textdomain()) self.win_gl.signal_connect('on_switch_button_press_event', self._sig_switch) self.win_gl.signal_connect('on_search_button_press_event', self._sig_search) self.win_gl.signal_connect('on_open_button_press_event', self._sig_open) label = self.win_gl.get_widget('widget_paned_lab') label.set_text( attrs.get('string', self.screen.current_view.title)) vbox = self.win_gl.get_widget('widget_paned_vbox') vbox.add(self.screen.widget) self.widget = self.win_gl.get_widget('widget_paned') self.widget.set_size_request(int(attrs.get('width', -1)), int(attrs.get('height', -1))) elif self.action['view_type'] == 'tree': pass #TODO
def _value_get(self): if not self.butt.get_active(): ctx = tools.expr_eval(self.context, {'context':self.screen_context}) group = ctx.get('group_by',False) if group: return {'context': {'remove_group':group}} return {} return {'domain': tools.expr_eval(self.domain, {'context':self.screen_context}), 'context': tools.expr_eval(self.context, {'context':self.screen_context})}
def _value_get(self): if not self.butt.get_active(): ctx = tools.expr_eval(self.context, {'context': self.screen_context}) group = ctx.get('group_by', False) if group: return {'context': {'remove_group': group}} return {} return { 'domain': tools.expr_eval(self.domain, {'context': self.screen_context}), 'context': tools.expr_eval(self.context, {'context': self.screen_context}) }
def get_color(self, result): color_ids = {} for res in result: color_ids[res["id"]] = "black" res_lower = {} for key, vals in res.iteritems(): if self.fields_type.get(key, False) and vals != "False": type = self.fields_type[key]["type"] if type == "date": res_lower[key] = datetime_util.local_to_server_timestamp( vals, user_locale_format.get_date_format(), DT_FORMAT, tz_offset=False ) continue elif type == "datetime": res_lower[key] = datetime_util.local_to_server_timestamp( vals, user_locale_format.get_datetime_format(True), DT_FORMAT ) continue if isinstance(vals, (str, unicode)): res_lower[key] = vals.lower() else: res_lower[key] = vals for color, expt in self.colors.iteritems(): val = False for cond in expt: if isinstance(cond, basestring): val = tools.expr_eval(cond, res_lower) if val: color_ids[res_lower["id"]] = color break if val: break return color_ids
def _value_get(self): s = self.widget.get_text() domain = [] context = {} if s: if self.attrs.get('filter_domain'): domain = tools.expr_eval(self.attrs['filter_domain'], {'self': s}) else: if self.default_value: domain = [(self.name,'=', self.default_value)] self.default_value = False else: domain = [(self.name,self.attrs.get('comparator','ilike'),s)] context = tools.expr_eval(self.attrs.get('context',"{}"), {'self': s}) return { 'domain':domain, 'context': context }
def __init__(self, window, parent, model, attrs={}): interface.widget_interface.__init__(self, window, parent, model, attrs) self.act_id = int(attrs['name']) res = rpc.session.rpc_exec_auth('/object', 'execute', 'ir.actions.actions', 'read', [self.act_id], ['type'], rpc.session.context) if not res: raise Exception, 'ActionNotFound' type = res[0]['type'] self.action = rpc.session.rpc_exec_auth('/object', 'execute', type, 'read', [self.act_id], False, rpc.session.context)[0] if 'view_mode' in attrs: self.action['view_mode'] = attrs['view_mode'] self.action_view_ids = False if self.action['type'] == 'ir.actions.act_window': if not self.action.get('domain', False): self.action['domain'] = '[]' if attrs.get('domain',False): self.action['domain'] = attrs.get('domain') self.context = {'active_id': False, 'active_ids': []} self.context.update(tools.expr_eval(self.action.get('context', '{}'), self.context.copy())) self.domain = tools.expr_eval(self.action['domain'], self.context.copy()) view_id = [] if self.action['view_id']: view_id = [self.action['view_id'][0]] if self.action.get('views'): self.action_view_ids = map(lambda y:y[0], filter(lambda x:x[1] == 'tree',self.action['views'])) if self.action['view_type']=='form': mode = (self.action['view_mode'] or 'form,tree').split(',') self.screen = Screen(self.action['res_model'], view_type=mode, context=self.context, view_ids = view_id, domain=self.domain) self.ui = openerp_gtk_builder('openerp.ui', ['widget_paned']) self.ui.connect_signals({ 'on_switch_button_press_event': self._sig_switch, 'on_search_button_press_event': self._sig_search, 'on_open_button_press_event': self._sig_open, }) label = self.ui.get_object('widget_paned_lab') label.set_text(attrs.get('string', self.screen.current_view.title)) vbox = self.ui.get_object('widget_paned_vbox') vbox.add(self.screen.widget) self.widget = self.ui.get_object('widget_paned') self.widget.set_size_request(int(attrs.get('width', -1)), int(attrs.get('height', -1))) elif self.action['view_type']=='tree': pass #TODO
def _value_get(self): res = self.widget.child.get_text() context = {} operator = "ilike" if self._selection.get(res, False): res = self._selection.get(res, False) operator = self.attrs.get("operator", "=") context = tools.expr_eval(self.attrs.get("context", "{}"), {"self": res}) if res: return {"domain": [(self.name, operator, res)], "context": context} return {}
def _value_get(self): val = self.entry.get_text() domain = [] context = {} if val: domain = [(self.name,'=',int(val==_('Yes')))] context = tools.expr_eval(self.attrs.get('context',"{}"), {'self': val}) return { 'domain':domain, 'context': context }
def _value_get(self): res = self.widget.child.get_text() context = {} operator = 'ilike' if self._selection.get(res, False): res = self._selection.get(res, False) operator = self.attrs.get('operator', '=') context = tools.expr_eval(self.attrs.get('context', "{}"), {'self': res}) if res: return {'domain': [(self.name, operator, res)], 'context': context} return {}
def _value_get(self): res = self.widget.child.get_text() context = {} operator = 'ilike' if self._selection.get(res, False): res = self._selection.get(res, False) operator = self.attrs.get('operator','=') context = tools.expr_eval(self.attrs.get('context',"{}"), {'self':res}) if res: return { 'domain':[(self.name,operator,res)], 'context': context } return {}
def _value_get(self): res = self.widget.child.get_text() context = {} operator = 'ilike' result = [y for x,y in self._selection if x==res] if result: res = result[0] operator = self.attrs.get('operator','=') context = tools.expr_eval(self.attrs.get('context',"{}"), {'self':res}) if res: return { 'domain':[(self.name,operator,res)], 'context': context } return {}
def expr_eval(self, dom, check_load=True): if not isinstance(dom, basestring): return dom if check_load: self._check_load() d = {} for name, mfield in self.mgroup.mfields.items(): d[name] = mfield.get(self, check_load=check_load) d['current_date'] = time.strftime('%Y-%m-%d') d['time'] = time d['context'] = self.context_get() d['active_id'] = self.id or False if self.parent: d['parent'] = EvalEnvironment(self.parent) val = tools.expr_eval(dom, d) return val
def expr_eval(self, dom, check_load=True): if not isinstance(dom, basestring): return dom if check_load: self._check_load() d = {} for name, mfield in self.mgroup.mfields.items(): d[name] = mfield.get(self, check_load=check_load) d['current_date'] = time.strftime('%Y-%m-%d') d['time'] = time d['context'] = self.context_get() d['active_id'] = self.id if self.parent: d['parent'] = EvalEnvironment(self.parent) val = tools.expr_eval(dom, d) return val
def __init__(self, window, parent, model, attrs={}): interface.widget_interface.__init__(self, window, parent, model, attrs) self.act_id=attrs['name'] res = rpc.session.rpc_exec_auth('/object', 'execute', 'ir.actions.actions', 'read', [self.act_id], ['type'], rpc.session.context) if not res: raise Exception, 'ActionNotFound' type=res[0]['type'] self.action = rpc.session.rpc_exec_auth('/object', 'execute', type, 'read', [self.act_id], False, rpc.session.context)[0] if 'view_mode' in attrs: self.action['view_mode'] = attrs['view_mode'] if self.action['type']=='ir.actions.act_window': if not self.action.get('domain', False): self.action['domain']='[]' self.context = {'active_id': False, 'active_ids': []} self.context.update(eval(self.action.get('context', '{}'), self.context.copy())) a = self.context.copy() a['time'] = time a['datetime'] = datetime self.domain = tools.expr_eval(self.action['domain'], a) view_id = [] if self.action['view_id']: view_id = [self.action['view_id'][0]] if self.action['view_type']=='form': mode = (self.action['view_mode'] or 'form,tree').split(',') self.screen = Screen(self.action['res_model'], view_type=mode, context=self.context, view_ids = view_id, domain=self.domain) self.win_gl = glade.XML(common.terp_path("openerp.glade"), 'widget_paned', gettext.textdomain()) self.win_gl.signal_connect('on_switch_button_press_event', self._sig_switch) self.win_gl.signal_connect('on_search_button_press_event', self._sig_search) self.win_gl.signal_connect('on_open_button_press_event', self._sig_open) label=self.win_gl.get_widget('widget_paned_lab') label.set_text(attrs.get('string', self.screen.current_view.title)) vbox=self.win_gl.get_widget('widget_paned_vbox') vbox.add(self.screen.widget) self.widget=self.win_gl.get_widget('widget_paned') self.widget.set_size_request(int(attrs.get('width', -1)), int(attrs.get('height', -1))) elif self.action['view_type']=='tree': pass #TODO
def get_color(self, result): color_ids = {} for res in result: color_ids[res['id']] = 'black' res_lower = {} for key, vals in res.iteritems(): if self.fields_type.get(key, False) and vals != 'False': type = self.fields_type[key]['type'] if type == 'date': res_lower[ key] = datetime_util.local_to_server_timestamp( vals, user_locale_format.get_date_format(), DT_FORMAT, tz_offset=False) continue elif type == 'datetime': res_lower[ key] = datetime_util.local_to_server_timestamp( vals, user_locale_format.get_datetime_format(True), DT_FORMAT) continue if isinstance(vals, (str, unicode)): res_lower[key] = vals.lower() else: res_lower[key] = vals for color, expt in self.colors.iteritems(): val = False for cond in expt: if isinstance(cond, basestring): val = tools.expr_eval(cond, res_lower) if val: color_ids[res_lower['id']] = color break if val: break return color_ids
def _exec_action(self, action, datas, context={}): if isinstance(action, bool) or 'type' not in action: return # Update context, adding the dynamic context of the action context.update(tools.expr_eval(action.get('context','{}'), context.copy())) if action['type']=='ir.actions.act_window': for key in ('res_id', 'res_model', 'view_type', 'view_mode', 'limit', 'auto_refresh'): datas[key] = action.get(key, datas.get(key, None)) if datas['limit'] is None or datas['limit'] == 0: datas['limit'] = 80 view_ids=False if action.get('views', []): if isinstance(action['views'],list): view_ids=[x[0] for x in action['views']] datas['view_mode']=",".join([x[1] for x in action['views']]) else: # view_ids=[(action['view_type']=='tree') and 1 or False,(action['view_type']=='form') and 1 or False] if action.get('view_id', False): view_ids=[action['view_id'][0]] elif action.get('view_id', False): view_ids=[action['view_id'][0]] if not action.get('domain', False): action['domain']='[]' ctx = context.copy() ctx.update( {'active_id': datas.get('id',False), 'active_ids': datas.get('ids',[])} ) ctx.update(tools.expr_eval(action.get('context','{}'), ctx.copy())) a = ctx.copy() a['time'] = time a['datetime'] = datetime domain = tools.expr_eval(action['domain'], a) if datas.get('domain', False): domain.append(datas['domain']) if action.get('target', False)=='new': dia = dialog(datas['res_model'], id=datas.get('res_id',None), window=datas.get('window',None), domain=domain, context=ctx, view_ids=view_ids,target=True, view_type=datas.get('view_mode', 'tree').split(',')) if dia.dia.get_has_separator(): dia.dia.set_has_separator(False) dia.run() dia.destroy() else: obj = service.LocalService('gui.window') obj.create(view_ids, datas['res_model'], datas['res_id'], domain, action['view_type'], datas.get('window',None), ctx, datas['view_mode'], name=action.get('name', False), limit=datas['limit'], auto_refresh=datas['auto_refresh']) elif action['type']=='ir.actions.server': ctx = context.copy() ctx.update({'active_id': datas.get('id',False), 'active_ids': datas.get('ids',[])}) res = rpc.session.rpc_exec_auth('/object', 'execute', 'ir.actions.server', 'run', [action['id']], ctx) if res: if not isinstance(res, list): res = [res] for r in res: self._exec_action(r, datas, context) elif action['type']=='ir.actions.wizard': win=None if 'window' in datas: win=datas['window'] del datas['window'] wizard.execute(action['wiz_name'], datas, parent=win, context=context) elif action['type']=='ir.actions.report.custom': if 'window' in datas: win=datas['window'] del datas['window'] datas.update(action.get('datas',{})) datas['report_id'] = action['report_id'] self.exec_report('custom', datas, context) elif action['type']=='ir.actions.report.xml': if 'window' in datas: win=datas['window'] del datas['window'] datas.update(action.get('datas',{})) self.exec_report(action['report_name'], datas, context) elif action['type']=='ir.actions.act_url': tools.launch_browser(action.get('url',''))
def __init__(self, window, parent, model, attrs={}): interface.widget_interface.__init__(self, window, parent, model, attrs) self.context = {} #TODO: # group by context are evaled here as we need the context in screen # while displaying. # We need a better way to eval context that has group_by' # We needed to do this as normal context also get evaled here # and results in a traceback which should not be evaled here. if str(attrs.get('context', "{}")).find('group_by') != -1: self.context = tools.expr_eval(attrs.get('context', "{}")) self._readonly = self.default_readonly self.widget = gtk.VBox(homogeneous=False, spacing=5) hb = gtk.HBox(homogeneous=False, spacing=5) menubar = gtk.MenuBar() if hasattr(menubar, 'set_pack_direction') and \ hasattr(menubar, 'set_child_pack_direction'): menubar.set_pack_direction(gtk.PACK_DIRECTION_LTR) menubar.set_child_pack_direction(gtk.PACK_DIRECTION_LTR) menuitem_title = gtk.ImageMenuItem(stock_id='gtk-preferences') menu_title = gtk.Menu() menuitem_set_to_default = gtk.MenuItem(_('Set to default value'), True) menuitem_set_to_default.connect( 'activate', lambda *x: self._menu_sig_default_get()) menu_title.add(menuitem_set_to_default) menuitem_set_default = gtk.MenuItem(_('Set Default'), True) menuitem_set_default.connect('activate', lambda *x: self._menu_sig_default_set()) menu_title.add(menuitem_set_default) menuitem_title.set_submenu(menu_title) menubar.add(menuitem_title) hb.pack_start(menubar, expand=True, fill=True) if self.context.get('group_by'): self.context['group_by'] = [self.context['group_by']] # the context to pass to default_get can be optionally specified in # the context of the one2many field. We also support a legacy # 'default_get' attribute for the same effect (pending removal) default_get_ctx = (attrs.get('default_get') or attrs.get('context')) self.screen = Screen(attrs['relation'], view_type=attrs.get('mode', 'tree,form').split(','), parent=self.parent, views_preload=attrs.get('views', {}), tree_saves=attrs.get('saves', False), create_new=True, context=self.context, row_activate=self._on_activate, default_get=default_get_ctx, window=self._window, readonly=self._readonly, limit=pager.DEFAULT_LIMIT) self.screen.type = 'one2many' self.pager = pager(object=self, relation=attrs['relation'], screen=self.screen) # Button New self.eb_new = self.pager.create_event_box(_('Create a new entry'), self._sig_new, 'gtk-new') hb.pack_start(self.eb_new, expand=False, fill=False) # Button Edit self.eb_open = self.pager.create_event_box(_('Edit this entry'), self._sig_edit, 'gtk-open') hb.pack_start(self.eb_open, expand=False, fill=False) # Button Delete self.eb_del = self.pager.create_event_box(_('Remove this entry'), self._sig_remove, 'gtk-delete') hb.pack_start(self.eb_del, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Button Previous Page self.eb_prev_page = self.pager.create_event_box( _('Previous Page'), self._sig_prev_page, 'gtk-goto-first') hb.pack_start(self.eb_prev_page, expand=False, fill=False) # Button Previous Record self.eb_pre = self.pager.create_event_box(_('Previous Record'), self._sig_previous, 'gtk-go-back') hb.pack_start(self.eb_pre, expand=False, fill=False) # Record display self.label = gtk.Label('(0,0)') hb.pack_start(self.label, expand=False, fill=False) # Button Next self.eb_next = self.pager.create_event_box(_('Next Record'), self._sig_next, 'gtk-go-forward') hb.pack_start(self.eb_next, expand=False, fill=False) # Button Next Page self.eb_next_page = self.pager.create_event_box( _('Next Page'), self._sig_next_page, 'gtk-goto-last') hb.pack_start(self.eb_next_page, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Button Switch self.eb_switch = self.pager.create_event_box(_('Switch'), self.switch_view, 'gtk-justify-left') hb.pack_start(self.eb_switch, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Limit Combo self.cb = self.pager.create_combo_box(_('Choose Limit'), self.limit_changed) hb.pack_start(self.cb, expand=False, fill=False) self.widget.pack_start(hb, expand=False, fill=True) self.screen.signal_connect(self, 'record-message', self._sig_label) menuitem_title.get_child().set_markup( '<b>' + self.screen.current_view.title.replace('&', '&').replace( '<', '<').replace('>', '>') + '</b>') self.widget.pack_start(self.screen.widget, expand=True, fill=True) self.screen.widget.connect('key_press_event', self.on_keypress) self.model = None self.model_field = None self.name = attrs['name']
def __init__(self, window, parent, model, attrs={}): interface.widget_interface.__init__(self, window, parent, model, attrs) self.context = {} self._readonly = self.default_readonly self.widget = gtk.VBox(homogeneous=False, spacing=5) hb = gtk.HBox(homogeneous=False, spacing=5) event_box = gtk.EventBox() event_box.set_events(gtk.gdk.BUTTON_PRESS_MASK) hb.pack_start(event_box, expand=True, fill=True) # the context to pass to default_get can be optionally specified in # the context of the one2many field. We also support a legacy # 'default_get' attribute for the same effect (pending removal) default_get_ctx = (attrs.get('default_get') or attrs.get('context')) self.context = tools.expr_eval(attrs.get('context',"{}"), {"__builtins__":None, "parent": parent}) self.screen = Screen(attrs['relation'], view_type=attrs.get('mode','tree,form').split(','), parent=self.parent, views_preload=attrs.get('views', {}), tree_saves=attrs.get('saves', False), create_new=True, context=self.context, row_activate=self._on_activate, default_get=default_get_ctx, window=self._window, readonly=self._readonly, limit=pager.DEFAULT_LIMIT) self.screen.type = 'one2many' self.pager = pager(object=self, relation=attrs['relation'], screen=self.screen) # Button New self.eb_new = self.pager.create_event_box(_('Create a new entry'), self._sig_new, 'gtk-new') hb.pack_start(self.eb_new, expand=False, fill=False) # Button Edit self.eb_open = self.pager.create_event_box(_('Edit this entry'), self._sig_edit, 'gtk-open') hb.pack_start(self.eb_open, expand=False, fill=False) # Button Delete self.eb_del = self.pager.create_event_box(_('Remove this entry'), self._sig_remove, 'gtk-delete') hb.pack_start(self.eb_del, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Button Previous Page self.eb_prev_page = self.pager.create_event_box(_('Previous Page'), self._sig_prev_page, 'gtk-goto-first') hb.pack_start(self.eb_prev_page, expand=False, fill=False) # Button Previous Record self.eb_pre = self.pager.create_event_box(_('Previous Record'), self._sig_previous, 'gtk-go-back') hb.pack_start(self.eb_pre, expand=False, fill=False) # Record display self.label = gtk.Label('(0,0)') hb.pack_start(self.label, expand=False, fill=False) # Button Next self.eb_next = self.pager.create_event_box(_('Next Record'), self._sig_next, 'gtk-go-forward') hb.pack_start(self.eb_next, expand=False, fill=False) # Button Next Page self.eb_next_page = self.pager.create_event_box(_('Next Page'), self._sig_next_page, 'gtk-goto-last') hb.pack_start(self.eb_next_page, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Button Switch self.eb_switch = self.pager.create_event_box(_('Switch'), self.switch_view, 'gtk-justify-left') hb.pack_start(self.eb_switch, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Limit Combo self.cb = self.pager.create_combo_box(_('Choose Limit'), self.limit_changed) hb.pack_start(self.cb, expand=False, fill=False) self.widget.pack_start(hb, expand=False, fill=True) self.screen.signal_connect(self, 'record-message', self._sig_label) menu_title = gtk.Label('<b>'+self.screen.current_view.title.replace('&','&').replace('<','<').replace('>','>')+'</b>') menu_title.set_use_markup(True) menu_title.set_alignment(0, 0) event_box.add(menu_title) event_box.connect('button_press_event',self.load_menu) self.screen.widget.set_property('height-request', 100) self.widget.pack_start(self.screen.widget, expand=True, fill=True) self.screen.widget.connect('key_press_event', self.on_keypress) self.model = None self.model_field = None self.name = attrs['name']
def _exec_action(self, action, datas, context={}): if isinstance(action, bool) or 'type' not in action: return # Update context, adding the dynamic context of the action context.update( tools.expr_eval(action.get('context', '{}'), context.copy())) if action['type'] == 'ir.actions.act_window': for key in ('res_id', 'res_model', 'view_type', 'view_mode', 'limit', 'auto_refresh'): datas[key] = action.get(key, datas.get(key, None)) if datas['limit'] is None or datas['limit'] == 0: datas['limit'] = 80 view_ids = False if action.get('views', []): if isinstance(action['views'], list): view_ids = [x[0] for x in action['views']] datas['view_mode'] = ",".join( [x[1] for x in action['views']]) else: # view_ids=[(action['view_type']=='tree') and 1 or False,(action['view_type']=='form') and 1 or False] if action.get('view_id', False): view_ids = [action['view_id'][0]] elif action.get('view_id', False): view_ids = [action['view_id'][0]] if not action.get('domain', False): action['domain'] = '[]' ctx = context.copy() ctx.update({ 'active_id': datas.get('id', False), 'active_ids': datas.get('ids', []) }) ctx.update(tools.expr_eval(action.get('context', '{}'), ctx.copy())) a = ctx.copy() a['time'] = time a['datetime'] = datetime domain = tools.expr_eval(action['domain'], a) if datas.get('domain', False): domain.append(datas['domain']) if action.get('target', False) == 'new': dia = dialog(datas['res_model'], id=datas.get('res_id', None), window=datas.get('window', None), domain=domain, context=ctx, view_ids=view_ids, target=True, view_type=datas.get('view_mode', 'tree').split(',')) if dia.dia.get_has_separator(): dia.dia.set_has_separator(False) dia.run() dia.destroy() else: obj = service.LocalService('gui.window') obj.create(view_ids, datas['res_model'], datas['res_id'], domain, action['view_type'], datas.get('window', None), ctx, datas['view_mode'], name=action.get('name', False), limit=datas['limit'], auto_refresh=datas['auto_refresh']) elif action['type'] == 'ir.actions.server': ctx = context.copy() ctx.update({ 'active_id': datas.get('id', False), 'active_ids': datas.get('ids', []) }) res = rpc.session.rpc_exec_auth('/object', 'execute', 'ir.actions.server', 'run', [action['id']], ctx) if res: if not isinstance(res, list): res = [res] for r in res: self._exec_action(r, datas, context) elif action['type'] == 'ir.actions.wizard': win = None if 'window' in datas: win = datas['window'] del datas['window'] wizard.execute(action['wiz_name'], datas, parent=win, context=context) elif action['type'] == 'ir.actions.report.custom': if 'window' in datas: win = datas['window'] del datas['window'] datas.update(action.get('datas', {})) datas['report_id'] = action['report_id'] self.exec_report('custom', datas, context) elif action['type'] == 'ir.actions.report.xml': if 'window' in datas: win = datas['window'] del datas['window'] datas.update(action.get('datas', {})) self.exec_report(action['report_name'], datas, context) elif action['type'] == 'ir.actions.act_url': tools.launch_browser(action.get('url', ''))
def execute_action(self, combo): combo_model = combo.get_model() active_id = combo.get_active() flag = active_id != -1 and combo_model[active_id][1] action_name = active_id != -1 and flag not in ['mf','blk', 'sf'] and combo_model[active_id][4] public_action = active_id != -1 and flag not in ['mf','blk', 'sf'] and combo_model[active_id][3] == 0 # 'mf' Section manages Filters def clear_domain_ctx(): for key in self.old_ctx.keys(): if key in self.context_init: del self.context_init[key] for domain in self.latest_search: if domain in self.domain_init: self.domain_init.remove(domain) #append action domain to filter domain self.domain_init += self.action_domain if flag == 'mf': obj = service.LocalService('action.main') act = {'name': _('Manage Filters'), 'res_model': 'ir.filters', 'type': 'ir.actions.act_window', 'view_type': 'form', 'view_mode': 'tree,form'} ctx = dict(self.context) for key in ('group_by','group_by_no_leaf'): ctx.pop(key, None) ctx.update(search_default_my_filters=True, search_default_model_id=self.name) value = obj._exec_action(act, {}, ctx) if flag in ['blk','mf']: self.screen_container.last_active_filter = False self.screen_container.last_active_filter_public = False clear_domain_ctx() if flag == 'blk': self.search_filter() combo.set_active(0) return True #This section handles shortcut and action creation elif flag in ['sf']: ui2 = openerp_gtk_builder('openerp.ui', ['dia_get_action']) win = ui2.get_object('dia_get_action') win.set_icon(common.OPENERP_ICON) lbl = ui2.get_object('label157') win.set_size_request(300, 165) text_entry = ui2.get_object('action_name') lbl.set_text('Filter Name:') table = ui2.get_object('table8') info_lbl = gtk.Label(_('(Any existing filter with the \nsame name will be replaced)')) public_chk = gtk.CheckButton(_('Share with all users')) public_chk.set_tooltip_text(_('Check this option to make the filter visible to all users')) table.attach(public_chk,1,2,2,3, gtk.FILL, gtk.EXPAND) table.attach(info_lbl,1,2,3,4, gtk.FILL, gtk.EXPAND) if self.screen_container.last_active_filter: text_entry.set_text(self.screen_container.last_active_filter) if self.screen_container.last_active_filter_public: public_chk.set_active(True) win.show_all() response = win.run() # grab a safe copy of the entered text before destroy() to avoid GTK bug https://bugzilla.gnome.org/show_bug.cgi?id=613241 action_name = text_entry.get_text() public_filter = public_chk.get_active() win.destroy() combo.set_active(0) if response == gtk.RESPONSE_OK and action_name: filter_domain = self.filter_widget and self.filter_widget.value.get('domain',[]) filter_context = self.filter_widget and self.filter_widget.value.get('context',{}) values = {'name': action_name, 'model_id': self.name, 'user_id': False if public_filter else rpc.session.uid} if flag == 'sf': domain, context = self.screen_container.get_filter(action_name) for dom in eval(domain): if dom not in filter_domain: filter_domain.append(dom) groupby_list = eval(context).get('group_by',[]) + filter_context.get('group_by',[]) filter_context.update(eval(context)) if groupby_list: filter_context.update({'group_by':groupby_list}) values.update({'domain':str(filter_domain), 'context':str(filter_context), }) action_id = rpc.session.rpc_exec_auth('/object', 'execute', 'ir.filters', 'create_or_replace', values, self.context) self.screen_container.fill_filter_combo(self.name, action_id) else: try: self.screen_container.last_active_filter = action_name self.screen_container.last_active_filter_public = public_action filter_domain = flag and tools.expr_eval(flag) clear_domain_ctx() if combo.get_active() >= 0: combo_model = combo.get_model() val = combo_model[combo.get_active()][2] if val: self.old_ctx = eval(val) self.context_init.update(self.old_ctx) self.domain_init += filter_domain or [] if isinstance(self.domain_init,type([])): self.search_filter() self.reload() except Exception: return True
def __init__(self, window, parent, model, attrs={}, label=None): interface.widget_interface.__init__(self, window, parent, model, attrs, label_ebox=label) self.context = {} self._readonly = self.default_readonly self.widget = gtk.VBox(homogeneous=False, spacing=5) hb = gtk.HBox(homogeneous=False, spacing=5) event_box = gtk.EventBox() event_box.set_events(gtk.gdk.BUTTON_PRESS_MASK) hb.pack_start(event_box, expand=True, fill=True) # the context to pass to default_get can be optionally specified in # the context of the one2many field. We also support a legacy # 'default_get' attribute for the same effect (pending removal) default_get_ctx = (attrs.get('default_get') or attrs.get('context')) self.context = tools.expr_eval(attrs.get('context',"{}"), {"__builtins__":None}) self.screen = Screen(attrs['relation'], view_type=attrs.get('mode','tree,form').split(','), parent=self.parent, views_preload=attrs.get('views', {}), tree_saves=attrs.get('saves', False), create_new=True, row_activate=self._on_activate, default_get=default_get_ctx, context = self.context, window=self._window, readonly=self._readonly, limit=pager.DEFAULT_LIMIT) self.screen.type = 'one2many' self.pager = pager(object=self, relation=attrs['relation'], screen=self.screen) # Button New self.eb_new = self.pager.create_event_box(_('Create a new entry'), self._sig_new, 'gtk-new') hb.pack_start(self.eb_new, expand=False, fill=False) # Button Edit self.eb_open = self.pager.create_event_box(_('Edit this entry'), self._sig_edit, 'gtk-open') hb.pack_start(self.eb_open, expand=False, fill=False) # Button Delete self.eb_del = self.pager.create_event_box(_('Remove this entry'), self._sig_remove, 'gtk-delete') hb.pack_start(self.eb_del, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Button Previous Page self.eb_prev_page = self.pager.create_event_box(_('Previous Page'), self._sig_prev_page, 'gtk-goto-first') hb.pack_start(self.eb_prev_page, expand=False, fill=False) # Button Previous Record self.eb_pre = self.pager.create_event_box(_('Previous Record'), self._sig_previous, 'gtk-go-back') hb.pack_start(self.eb_pre, expand=False, fill=False) # Record display self.label = gtk.Label('(0,0)') hb.pack_start(self.label, expand=False, fill=False) # Button Next self.eb_next = self.pager.create_event_box(_('Next Record'), self._sig_next, 'gtk-go-forward') hb.pack_start(self.eb_next, expand=False, fill=False) # Button Next Page self.eb_next_page = self.pager.create_event_box(_('Next Page'), self._sig_next_page, 'gtk-goto-last') hb.pack_start(self.eb_next_page, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Button Switch self.eb_switch = self.pager.create_event_box(_('Switch'), self.switch_view, 'gtk-justify-left') hb.pack_start(self.eb_switch, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Limit Combo self.cb = self.pager.create_combo_box(_('Choose Limit'), self.limit_changed) hb.pack_start(self.cb, expand=False, fill=False) self.widget.pack_start(hb, expand=False, fill=True) self.screen.signal_connect(self, 'record-message', self._sig_label) menu_title = gtk.Label('<b>'+self.screen.current_view.title.replace('&','&').replace('<','<').replace('>','>')+'</b>') menu_title.set_use_markup(True) menu_title.set_alignment(0, 0) event_box.add(menu_title) event_box.connect('button_press_event',self.load_menu) self.screen.widget.set_property('height-request', 100) self.widget.pack_start(self.screen.widget, expand=True, fill=True) self.screen.widget.connect('key_press_event', self.on_keypress) self.model = None self.model_field = None self.name = attrs['name']
def _exec_action(self, action, datas, context={}): if isinstance(action, bool) or 'type' not in action: return # Updating the context : Adding the context of action in order to use it on Views called from buttons if datas.get('id',False): context.update( {'active_id': datas.get('id',False), 'active_ids': datas.get('ids',[]), 'active_model': datas.get('model',False)}) context.update(tools.expr_eval(action.get('context','{}'), context.copy())) if action['type'] in ['ir.actions.act_window', 'ir.actions.submenu']: for key in ('res_id', 'res_model', 'view_type', 'view_mode', 'limit', 'auto_refresh', 'search_view', 'auto_search', 'search_view_id'): datas[key] = action.get(key, datas.get(key, None)) datas['auto_search'] = action.get('auto_search', True) if not datas['search_view'] and datas['search_view_id']: datas['search_view'] = str(rpc.session.rpc_exec_auth('/object', 'execute', datas['res_model'], 'fields_view_get', isinstance(datas['search_view_id'], (tuple, list)) and datas['search_view_id'][0] or datas['search_view_id'], 'search', context)) if datas['limit'] is None or datas['limit'] == 0: datas['limit'] = 100 view_ids=False if action.get('views', []): if isinstance(action['views'],list): view_ids=[x[0] for x in action['views']] datas['view_mode']=",".join([x[1] for x in action['views']]) else: if action.get('view_id', False): view_ids=[action['view_id'][0]] elif action.get('view_id', False): view_ids=[action['view_id'][0]] if not action.get('domain', False): action['domain']='[]' domain_ctx = context.copy() domain_ctx['time'] = time domain_ctx['datetime'] = datetime domain = tools.expr_eval(action['domain'], domain_ctx) help = {} if action.get('display_menu_tip', False): msg = action.get('help', False) title = action.get('name', False) if msg and len(msg): help['msg'] = msg help['title'] = title or '' if datas.get('domain', False): domain.append(datas['domain']) if action.get('target', False)=='new': dia = dialog(datas['res_model'], id=datas.get('res_id',None), window=datas.get('window',None), domain=domain, context=context, view_ids=view_ids,target=True, view_type=datas.get('view_mode', 'tree').split(','), help=help) if dia.dia.get_has_separator(): dia.dia.set_has_separator(False) dia.run() dia.destroy() else: obj = service.LocalService('gui.window') obj.create(view_ids, datas['res_model'], datas['res_id'], domain, action['view_type'], datas.get('window',None), context, datas['view_mode'], name=action.get('name', False), help=help, limit=datas['limit'], auto_refresh=datas['auto_refresh'], auto_search = datas['auto_search'], search_view = datas['search_view']) elif action['type']=='ir.actions.server': res = rpc.session.rpc_exec_auth('/object', 'execute', 'ir.actions.server', 'run', [action['id']], context) if res: if not isinstance(res, list): res = [res] for r in res: self._exec_action(r, datas, context) elif action['type']=='ir.actions.wizard': win=None if 'window' in datas: win=datas['window'] del datas['window'] wizard.execute(action['wiz_name'], datas, parent=win, context=context) elif action['type']=='ir.actions.report.custom': if 'window' in datas: win=datas['window'] del datas['window'] datas['report_id'] = action['report_id'] self.exec_report('custom', datas, context) elif action['type']=='ir.actions.report.xml': if 'window' in datas: win=datas['window'] del datas['window'] if not datas: datas = action.get('datas',[]) self.exec_report(action['report_name'], datas, context) elif action['type']=='ir.actions.act_url': tools.launch_browser(action.get('url',''))
def __init__(self, window, parent, model, attrs={}): interface.widget_interface.__init__(self, window, parent, model, attrs) self.context = {} #TODO: # group by context are evaled here as we need the context in screen # while displaying. # We need a better way to eval context that has group_by' # We needed to do this as normal context also get evaled here # and results in a traceback which should not be evaled here. if str(attrs.get('context',"{}")).find('group_by') != -1: self.context = tools.expr_eval(attrs.get('context',"{}")) self._readonly = self.default_readonly self.widget = gtk.VBox(homogeneous=False, spacing=5) hb = gtk.HBox(homogeneous=False, spacing=5) menubar = gtk.MenuBar() if hasattr(menubar, 'set_pack_direction') and \ hasattr(menubar, 'set_child_pack_direction'): menubar.set_pack_direction(gtk.PACK_DIRECTION_LTR) menubar.set_child_pack_direction(gtk.PACK_DIRECTION_LTR) menuitem_title = gtk.ImageMenuItem(stock_id='gtk-preferences') menu_title = gtk.Menu() menuitem_set_to_default = gtk.MenuItem(_('Set to default value'), True) menuitem_set_to_default.connect('activate', lambda *x:self._menu_sig_default_get()) menu_title.add(menuitem_set_to_default) menuitem_set_default = gtk.MenuItem(_('Set Default'), True) menuitem_set_default.connect('activate', lambda *x: self._menu_sig_default_set()) menu_title.add(menuitem_set_default) menuitem_title.set_submenu(menu_title) menubar.add(menuitem_title) hb.pack_start(menubar, expand=True, fill=True) if self.context.get('group_by'): self.context['group_by'] = [self.context['group_by']] # the context to pass to default_get can be optionally specified in # the context of the one2many field. We also support a legacy # 'default_get' attribute for the same effect (pending removal) default_get_ctx = (attrs.get('default_get') or attrs.get('context')) self.screen = Screen(attrs['relation'], view_type=attrs.get('mode','tree,form').split(','), parent=self.parent, views_preload=attrs.get('views', {}), tree_saves=attrs.get('saves', False), create_new=True, context=self.context, row_activate=self._on_activate, default_get=default_get_ctx, window=self._window, readonly=self._readonly, limit=pager.DEFAULT_LIMIT) self.screen.type = 'one2many' self.pager = pager(object=self, relation=attrs['relation'], screen=self.screen) # Button New self.eb_new = self.pager.create_event_box(_('Create a new entry'), self._sig_new, 'gtk-new') hb.pack_start(self.eb_new, expand=False, fill=False) # Button Edit self.eb_open = self.pager.create_event_box(_('Edit this entry'), self._sig_edit, 'gtk-open') hb.pack_start(self.eb_open, expand=False, fill=False) # Button Delete self.eb_del = self.pager.create_event_box(_('Remove this entry'), self._sig_remove, 'gtk-delete') hb.pack_start(self.eb_del, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Button Previous Page self.eb_prev_page = self.pager.create_event_box(_('Previous Page'), self._sig_prev_page, 'gtk-goto-first') hb.pack_start(self.eb_prev_page, expand=False, fill=False) # Button Previous Record self.eb_pre = self.pager.create_event_box(_('Previous Record'), self._sig_previous, 'gtk-go-back') hb.pack_start(self.eb_pre, expand=False, fill=False) # Record display self.label = gtk.Label('(0,0)') hb.pack_start(self.label, expand=False, fill=False) # Button Next self.eb_next = self.pager.create_event_box(_('Next Record'), self._sig_next, 'gtk-go-forward') hb.pack_start(self.eb_next, expand=False, fill=False) # Button Next Page self.eb_next_page = self.pager.create_event_box(_('Next Page'), self._sig_next_page, 'gtk-goto-last') hb.pack_start(self.eb_next_page, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Button Switch self.eb_switch = self.pager.create_event_box(_('Switch'), self.switch_view, 'gtk-justify-left') hb.pack_start(self.eb_switch, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Limit Combo self.cb = self.pager.create_combo_box(_('Choose Limit'), self.limit_changed) hb.pack_start(self.cb, expand=False, fill=False) self.widget.pack_start(hb, expand=False, fill=True) self.screen.signal_connect(self, 'record-message', self._sig_label) menuitem_title.get_child().set_markup('<b>'+self.screen.current_view.title.replace('&','&').replace('<','<').replace('>','>')+'</b>') self.widget.pack_start(self.screen.widget, expand=True, fill=True) self.screen.widget.connect('key_press_event', self.on_keypress) self.model = None self.model_field = None self.name = attrs['name']
def parse_filter(self, xml_data, max_width, root_node, call=None): psr = expat.ParserCreate() psr.StartElementHandler = self.dummy_start psr.EndElementHandler = self._psr_end psr.CharacterDataHandler = self._psr_char self.notebooks = [] dict_widget = {} psr.Parse(xml_data) self.name_lst += self.name_lst1 container = _container(max_width) attrs = tools.node_attributes(root_node) container.new() self.container = container for node in root_node: attrs = tools.node_attributes(node) if attrs.get('invisible', False): visval = eval(attrs['invisible'], {'context':call[0].context}) if visval: continue if node.tag =='field': field_name = str(attrs['name']) field_dic = self.fields[field_name] type = attrs.get('widget', field_dic['type']) field_dic.update(attrs) field_dic['model'] = self.model if type not in widgets_type: continue widget_act = widgets_type[type][0](field_name, self.parent, field_dic, screen=call[0]) if 'string' in field_dic: label = field_dic['string']+' :' else: label = None if not self.focusable: self.focusable = widget_act.widget mywidget = widget_act.widget if node is not None and len(node): mywidget = gtk.HBox(homogeneous=False, spacing=0) mywidget.pack_start(widget_act.widget,expand=True,fill=True) for node_child in node: attrs_child = tools.node_attributes(node_child) if attrs_child.get('invisible', False): visval = eval(attrs_child['invisible'], {'context':call[0].context}) if visval: continue if node_child.tag == 'filter': widget_child = widgets_type['filter'][0]('', self.parent, attrs_child, call) mywidget.pack_start(widget_child.widget) dict_widget[str(attrs['name']) + str(uuid.uuid1())] = (widget_child, mywidget, 1) elif node_child.tag == 'separator': if attrs_child.get('orientation','vertical') == 'horizontal': sep = gtk.HSeparator() sep.set_size_request(30,5) mywidget.pack_start(sep,False,True,5) else: sep = gtk.VSeparator() sep.set_size_request(3,40) mywidget.pack_start(sep,False,False,5) # mywidget.pack_start(widget_act.widget,expand=False,fill=False) xoptions = gtk.SHRINK wid = container.wid_add(mywidget, 1,label, int(self.fields[str(attrs['name'])].get('expand',0)),xoptions=xoptions) dict_widget[str(attrs['name'])] = (widget_act, wid, 1) elif node.tag == 'filter': name = str(attrs.get('string','filter')) widget_act = filter.filter(name, self.parent, attrs, call) help = attrs.get('help', False) or name wid = container.wid_add(widget_act.butt, xoptions=gtk.SHRINK, help=help) dict_widget[name + str(uuid.uuid1())] = (widget_act, widget_act, 1) elif node.tag == 'separator': if attrs.get('orientation','vertical') == 'horizontal': sep_box = gtk.VBox(homogeneous=False, spacing=0) sep = gtk.HSeparator() sep.set_size_request(30,5) sep_box.pack_start(gtk.Label(''),expand=False,fill=False) sep_box.pack_start(sep,False,True,5) else: sep_box = gtk.HBox(homogeneous=False, spacing=0) sep = gtk.VSeparator() sep.set_size_request(3,45) sep_box.pack_start(sep,False,False,5) wid = container.wid_add(sep_box,xoptions=gtk.SHRINK) wid.show() elif node.tag=='newline': container.newline(node.getparent() is not None and node.getparent().tag == 'group') elif node.tag=='group': if attrs.get('invisible', False): continue if attrs.get('expand', False): attrs['expand'] = tools.expr_eval(attrs.get('expand',False),{'context':call[0].context}) frame = gtk.Expander(attrs.get('string', None)) frame.set_expanded(bool(attrs['expand'])) else: frame = gtk.Frame(attrs.get('string', None)) if not attrs.get('string', None): frame.set_shadow_type(gtk.SHADOW_NONE) frame.attrs = attrs frame.set_border_width(0) container.wid_add(frame, colspan=1, expand=int(attrs.get('expand',0)), ypadding=0) container.new() widget, widgets = self.parse_filter(xml_data, max_width, node, call= call) dict_widget.update(widgets) if isinstance(widget, list): tb = gtk.Table(1, 1, True) row = 1 for table in widget: tb.attach(table, 0, 1, row-1, row) row +=1 frame.add(tb) else: frame.add(widget) if not attrs.get('string', None): container.get().set_border_width(0) container.pop() self.widget = container.pop() self.container = container return self.widget, dict_widget
def parse_filter(self, xml_data, max_width, root_node, call=None): psr = expat.ParserCreate() psr.StartElementHandler = self.dummy_start psr.EndElementHandler = self._psr_end psr.CharacterDataHandler = self._psr_char self.notebooks = [] dict_widget = {} psr.Parse(xml_data) self.name_lst += self.name_lst1 container = _container(max_width) attrs = tools.node_attributes(root_node) container.new() self.container = container for node in root_node: self.filter_order += 1 attrs = tools.node_attributes(node) if attrs.get('invisible', False): visval = eval(attrs['invisible'], {'context': call[0].context}) if visval: continue if node.tag == 'field': field_name = str(attrs['name']) field_dic = self.fields[field_name] type = attrs.get('widget', field_dic['type']) field_dic.update(attrs) field_dic['model'] = self.model if type not in widgets_type: continue widget_act = widgets_type[type][0](field_name, self.parent, field_dic, screen=call[0]) if 'string' in field_dic: label = field_dic['string'] + ' :' else: label = None if not self.focusable: self.focusable = widget_act.widget mywidget = widget_act.widget if node is not None and len(node): mywidget = gtk.HBox(homogeneous=False, spacing=0) mywidget.pack_start(widget_act.widget, expand=True, fill=True) for node_child in node: attrs_child = tools.node_attributes(node_child) if attrs_child.get('invisible', False): visval = eval(attrs_child['invisible'], {'context': call[0].context}) if visval: continue if node_child.tag == 'filter': widget_child = widgets_type['filter'][0]( '', self.parent, attrs_child, call) mywidget.pack_start(widget_child.widget) dict_widget[str(attrs['name']) + str(uuid.uuid1())] = ( widget_child, mywidget, 1, self.filter_order) elif node_child.tag == 'separator': if attrs_child.get('orientation', 'vertical') == 'horizontal': sep = gtk.HSeparator() sep.set_size_request(30, 5) mywidget.pack_start(sep, False, True, 5) else: sep = gtk.VSeparator() sep.set_size_request(3, 40) mywidget.pack_start(sep, False, False, 5) # mywidget.pack_start(widget_act.widget,expand=False,fill=False) xoptions = gtk.SHRINK wid = container.wid_add(mywidget, 1, label, int(self.fields[str( attrs['name'])].get('expand', 0)), xoptions=xoptions) dict_widget[str(attrs['name'])] = (widget_act, wid, 1, self.filter_order) elif node.tag == 'filter': name = str(attrs.get('string', 'filter')) widget_act = filter.filter(name, self.parent, attrs, call) help = attrs.get('help', False) or name wid = container.wid_add(widget_act.butt, xoptions=gtk.SHRINK, help=help) dict_widget[name + str(uuid.uuid1())] = (widget_act, widget_act, 1, self.filter_order) elif node.tag == 'separator': if attrs.get('orientation', 'vertical') == 'horizontal': sep_box = gtk.VBox(homogeneous=False, spacing=0) sep = gtk.HSeparator() sep.set_size_request(30, 5) sep_box.pack_start(gtk.Label(''), expand=False, fill=False) sep_box.pack_start(sep, False, True, 5) else: sep_box = gtk.HBox(homogeneous=False, spacing=0) sep = gtk.VSeparator() sep.set_size_request(3, 45) sep_box.pack_start(sep, False, False, 5) wid = container.wid_add(sep_box, xoptions=gtk.SHRINK) wid.show() elif node.tag == 'newline': container.newline(node.getparent() is not None and node.getparent().tag == 'group') elif node.tag == 'group': if attrs.get('invisible', False): continue if attrs.get('expand', False): attrs['expand'] = tools.expr_eval( attrs.get('expand', False), {'context': call[0].context}) frame = gtk.Expander(attrs.get('string', None)) frame.set_expanded(bool(attrs['expand'])) else: frame = gtk.Frame(attrs.get('string', None)) if not attrs.get('string', None): frame.set_shadow_type(gtk.SHADOW_NONE) frame.attrs = attrs frame.set_border_width(0) container.wid_add(frame, colspan=1, expand=int(attrs.get('expand', 0)), ypadding=0) container.new() widget, widgets = self.parse_filter(xml_data, max_width, node, call=call) dict_widget.update(widgets) if isinstance(widget, list): tb = gtk.Table(1, 1, True) row = 1 for table in widget: tb.attach(table, 0, 1, row - 1, row) row += 1 frame.add(tb) else: frame.add(widget) if not attrs.get('string', None): container.get().set_border_width(0) container.pop() self.widget = container.pop() self.container = container return self.widget, dict_widget
def execute_action(self, combo): flag = combo.get_active_text() combo_model = combo.get_model() active_id = combo.get_active() action_name = active_id != -1 and flag not in ['mf','blk', 'sf'] and combo_model[active_id][2] # 'mf' Section manages Filters def clear_domain_ctx(): for key in self.old_ctx.keys(): if key in self.context_init: del self.context_init[key] for domain in self.latest_search: if domain in self.domain_init: self.domain_init.remove(domain) #append action domain to filter domain self.domain_init += self.action_domain if flag == 'mf': obj = service.LocalService('action.main') act={'name':'Manage Filters', 'res_model':'ir.filters', 'type':'ir.actions.act_window', 'view_type':'form', 'view_mode':'tree,form', 'domain':'[(\'model_id\',\'=\',\''+self.name+'\'),(\'user_id\',\'=\','+str(rpc.session.uid)+')]'} ctx = self.context.copy() for key in ('group_by','group_by_no_leaf'): if key in ctx: del ctx[key] value = obj._exec_action(act, {}, ctx) if flag in ['blk','mf']: self.screen_container.last_active_filter = False clear_domain_ctx() if flag == 'blk': self.search_filter() combo.set_active(0) return True #This section handles shortcut and action creation elif flag in ['sf']: glade2 = glade.XML(common.terp_path("openerp.glade"),'dia_get_action',gettext.textdomain()) widget = glade2.get_widget('action_name') win = glade2.get_widget('dia_get_action') win.set_icon(common.OPENERP_ICON) lbl = glade2.get_widget('label157') win.set_size_request(300, 165) text_entry = glade2.get_widget('action_name') lbl.set_text('Filter Name:') table = glade2.get_widget('table8') info_lbl = gtk.Label(_('(Any existing filter with the \nsame name will be replaced)')) table.attach(info_lbl,1,2,2,3, gtk.FILL, gtk.EXPAND) if self.screen_container.last_active_filter: text_entry.set_text(self.screen_container.last_active_filter) win.show_all() response = win.run() # grab a safe copy of the entered text before destroy() to avoid GTK bug https://bugzilla.gnome.org/show_bug.cgi?id=613241 action_name = widget.get_text() win.destroy() combo.set_active(0) if response == gtk.RESPONSE_OK and action_name: filter_domain = self.filter_widget and self.filter_widget.value.get('domain',[]) filter_context = self.filter_widget and self.filter_widget.value.get('context',{}) values = {'name':action_name, 'model_id':self.name, 'user_id':rpc.session.uid } if flag == 'sf': domain, context = self.screen_container.get_filter(action_name) for dom in eval(domain): if dom not in filter_domain: filter_domain.append(dom) groupby_list = eval(context).get('group_by',[]) + filter_context.get('group_by',[]) filter_context.update(eval(context)) if groupby_list: filter_context.update({'group_by':groupby_list}) values.update({'domain':str(filter_domain), 'context':str(filter_context), }) action_id = rpc.session.rpc_exec_auth('/object', 'execute', 'ir.filters', 'create_or_replace', values, self.context) self.screen_container.fill_filter_combo(self.name, action_name) else: try: self.screen_container.last_active_filter = action_name filter_domain = flag and tools.expr_eval(flag) clear_domain_ctx() if combo.get_active() >= 0: combo_model = combo.get_model() val = combo_model[combo.get_active()][1] if val: self.old_ctx = eval(val) self.context_init.update(self.old_ctx) self.domain_init += filter_domain or [] if isinstance(self.domain_init,type([])): self.search_filter() self.reload() except Exception: return True
def execute_action(self, combo): flag = combo.get_active_text() combo_model = combo.get_model() active_id = combo.get_active() action_name = active_id != -1 and flag not in [ 'mf', 'blk', 'sf' ] and combo_model[active_id][2] # 'mf' Section manages Filters def clear_domain_ctx(): for key in self.old_ctx.keys(): if key in self.context_init: del self.context_init[key] for domain in self.latest_search: if domain in self.domain_init: self.domain_init.remove(domain) #append action domain to filter domain self.domain_init += self.action_domain if flag == 'mf': obj = service.LocalService('action.main') act = { 'name': 'Manage Filters', 'res_model': 'ir.filters', 'type': 'ir.actions.act_window', 'view_type': 'form', 'view_mode': 'tree,form', 'domain': '[(\'model_id\',\'=\',\'' + self.name + '\'),(\'user_id\',\'=\',' + str(rpc.session.uid) + ')]' } ctx = self.context.copy() for key in ('group_by', 'group_by_no_leaf'): if key in ctx: del ctx[key] value = obj._exec_action(act, {}, ctx) if flag in ['blk', 'mf']: self.screen_container.last_active_filter = False clear_domain_ctx() if flag == 'blk': self.search_filter() combo.set_active(0) return True #This section handles shortcut and action creation elif flag in ['sf']: glade2 = glade.XML(common.terp_path("openerp.glade"), 'dia_get_action', gettext.textdomain()) widget = glade2.get_widget('action_name') win = glade2.get_widget('dia_get_action') win.set_icon(common.OPENERP_ICON) lbl = glade2.get_widget('label157') win.set_size_request(300, 165) text_entry = glade2.get_widget('action_name') lbl.set_text('Filter Name:') table = glade2.get_widget('table8') info_lbl = gtk.Label( _('(Any existing filter with the \nsame name will be replaced)' )) table.attach(info_lbl, 1, 2, 2, 3, gtk.FILL, gtk.EXPAND) if self.screen_container.last_active_filter: text_entry.set_text(self.screen_container.last_active_filter) win.show_all() response = win.run() # grab a safe copy of the entered text before destroy() to avoid GTK bug https://bugzilla.gnome.org/show_bug.cgi?id=613241 action_name = widget.get_text() win.destroy() combo.set_active(0) if response == gtk.RESPONSE_OK and action_name: filter_domain = self.filter_widget and self.filter_widget.value.get( 'domain', []) filter_context = self.filter_widget and self.filter_widget.value.get( 'context', {}) values = { 'name': action_name, 'model_id': self.name, 'user_id': rpc.session.uid } if flag == 'sf': domain, context = self.screen_container.get_filter( action_name) for dom in eval(domain): if dom not in filter_domain: filter_domain.append(dom) groupby_list = eval(context).get( 'group_by', []) + filter_context.get('group_by', []) filter_context.update(eval(context)) if groupby_list: filter_context.update({'group_by': groupby_list}) values.update({ 'domain': str(filter_domain), 'context': str(filter_context), }) action_id = rpc.session.rpc_exec_auth( '/object', 'execute', 'ir.filters', 'create_or_replace', values, self.context) self.screen_container.fill_filter_combo( self.name, action_name) else: try: self.screen_container.last_active_filter = action_name filter_domain = flag and tools.expr_eval(flag) clear_domain_ctx() if combo.get_active() >= 0: combo_model = combo.get_model() val = combo_model[combo.get_active()][1] if val: self.old_ctx = eval(val) self.context_init.update(self.old_ctx) self.domain_init += filter_domain or [] if isinstance(self.domain_init, type([])): self.search_filter() self.reload() except Exception: return True
def __init__(self, window, parent, model, attrs={}): interface.widget_interface.__init__(self, window, parent, model, attrs) self.widget = gtk.VBox(homogeneous=False, spacing=1) hb = gtk.HBox(homogeneous=False, spacing=3) self.wid_text = gtk.Entry() self.wid_text.set_property('width_chars', 13) self.wid_text.connect('activate', self._sig_activate) self.wid_text.connect('populate-popup', self._menu_open) hb.pack_start(self.wid_text, expand=True, fill=True) hb.pack_start(gtk.VSeparator(), padding=2, expand=False, fill=False) self.wid_but_add = gtk.Button(stock='gtk-add') self.wid_but_add.set_relief(gtk.RELIEF_HALF) self.wid_but_add.set_focus_on_click(True) self.wid_but_add.connect('clicked', self._sig_add) hb.pack_start(self.wid_but_add, padding=3, expand=False, fill=False) self.wid_but_remove = gtk.Button(stock='gtk-remove') self.wid_but_remove.set_relief(gtk.RELIEF_HALF) self.wid_but_remove.set_focus_on_click(True) self.wid_but_remove.connect('clicked', self._sig_remove) hb.pack_start(self.wid_but_remove, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) self.context = tools.expr_eval(attrs.get('context',"{}")) self.screen = Screen(attrs['relation'], view_type=['tree'], views_preload=attrs.get('views', {}), row_activate=self.row_activate, limit=pager.DEFAULT_LIMIT, context=self.context) self.screen.signal_connect(self, 'record-message', self._sig_label) self.screen.type = 'many2many' self.model = None self.model_field = None self.name = attrs['name'] self.pager = pager(object=self, relation=attrs['relation'], screen=self.screen) # Button Previous Page self.eb_prev_page = self.pager.create_event_box(_('Previous Page'), self._sig_prev_page, 'gtk-goto-first') hb.pack_start(self.eb_prev_page, expand=False, fill=False) # Button Previous Record self.eb_pre = self.pager.create_event_box(_('Previous Record'), self._sig_previous, 'gtk-go-back') hb.pack_start(self.eb_pre, expand=False, fill=False) # Record display self.label = gtk.Label('(0,0)') hb.pack_start(self.label, expand=False, fill=False) # Button Next self.eb_next = self.pager.create_event_box(_('Next Record'), self._sig_next, 'gtk-go-forward') hb.pack_start(self.eb_next, expand=False, fill=False) # Button Next Page self.eb_next_page = self.pager.create_event_box(_('Next Page'), self._sig_next_page, 'gtk-goto-last') hb.pack_start(self.eb_next_page, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # LIMIT COMBO self.cb = self.pager.create_combo_box(_('Choose Limit'), self.limit_changed) hb.pack_start(self.cb, expand=False, fill=False) self.widget.pack_start(hb, expand=False, fill=False) self.widget.pack_start(gtk.HSeparator(), expand=False, fill=True) scroll = gtk.ScrolledWindow() scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scroll.set_property('height-request', 200) scroll.set_placement(gtk.CORNER_TOP_LEFT) scroll.set_shadow_type(gtk.SHADOW_NONE) scroll.add_with_viewport(self.screen.widget) self.widget.pack_start(scroll, expand=True, fill=True)
def __init__(self, window, parent, model, attrs={}, label=None): interface.widget_interface.__init__(self, window, parent, model, attrs, label_ebox=label) self.context = {} self._readonly = self.default_readonly self.widget = gtk.VBox(homogeneous=False, spacing=5) hb = gtk.HBox(homogeneous=False, spacing=5) menubar = gtk.MenuBar() if hasattr(menubar, "set_pack_direction") and hasattr(menubar, "set_child_pack_direction"): menubar.set_pack_direction(gtk.PACK_DIRECTION_LTR) menubar.set_child_pack_direction(gtk.PACK_DIRECTION_LTR) menuitem_title = gtk.ImageMenuItem(stock_id="gtk-preferences") menu_title = gtk.Menu() menuitem_set_to_default = gtk.MenuItem(_("Set to default value"), True) menuitem_set_to_default.connect("activate", lambda *x: self._menu_sig_default_get()) menu_title.add(menuitem_set_to_default) menuitem_set_default = gtk.MenuItem(_("Set Default"), True) menuitem_set_default.connect("activate", lambda *x: self._menu_sig_default_set()) menu_title.add(menuitem_set_default) menuitem_title.set_submenu(menu_title) menubar.add(menuitem_title) hb.pack_start(menubar, expand=True, fill=True) # the context to pass to default_get can be optionally specified in # the context of the one2many field. We also support a legacy # 'default_get' attribute for the same effect (pending removal) default_get_ctx = attrs.get("default_get") or attrs.get("context") self.context = tools.expr_eval(attrs.get("context", "{}"), {"__builtins__": None}) self.screen = Screen( attrs["relation"], view_type=attrs.get("mode", "tree,form").split(","), parent=self.parent, views_preload=attrs.get("views", {}), tree_saves=attrs.get("saves", False), create_new=True, row_activate=self._on_activate, default_get=default_get_ctx, context=self.context, window=self._window, readonly=self._readonly, limit=pager.DEFAULT_LIMIT, ) self.screen.type = "one2many" self.pager = pager(object=self, relation=attrs["relation"], screen=self.screen) # Button New self.eb_new = self.pager.create_event_box(_("Create a new entry"), self._sig_new, "gtk-new") hb.pack_start(self.eb_new, expand=False, fill=False) # Button Edit self.eb_open = self.pager.create_event_box(_("Edit this entry"), self._sig_edit, "gtk-open") hb.pack_start(self.eb_open, expand=False, fill=False) # Button Delete self.eb_del = self.pager.create_event_box(_("Remove this entry"), self._sig_remove, "gtk-delete") hb.pack_start(self.eb_del, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Button Previous Page self.eb_prev_page = self.pager.create_event_box(_("Previous Page"), self._sig_prev_page, "gtk-goto-first") hb.pack_start(self.eb_prev_page, expand=False, fill=False) # Button Previous Record self.eb_pre = self.pager.create_event_box(_("Previous Record"), self._sig_previous, "gtk-go-back") hb.pack_start(self.eb_pre, expand=False, fill=False) # Record display self.label = gtk.Label("(0,0)") hb.pack_start(self.label, expand=False, fill=False) # Button Next self.eb_next = self.pager.create_event_box(_("Next Record"), self._sig_next, "gtk-go-forward") hb.pack_start(self.eb_next, expand=False, fill=False) # Button Next Page self.eb_next_page = self.pager.create_event_box(_("Next Page"), self._sig_next_page, "gtk-goto-last") hb.pack_start(self.eb_next_page, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Button Switch self.eb_switch = self.pager.create_event_box(_("Switch"), self.switch_view, "gtk-justify-left") hb.pack_start(self.eb_switch, expand=False, fill=False) hb.pack_start(gtk.VSeparator(), expand=False, fill=True) # Limit Combo self.cb = self.pager.create_combo_box(_("Choose Limit"), self.limit_changed) hb.pack_start(self.cb, expand=False, fill=False) self.widget.pack_start(hb, expand=False, fill=True) self.screen.signal_connect(self, "record-message", self._sig_label) menuitem_title.get_child().set_markup( "<b>" + self.screen.current_view.title.replace("&", "&").replace("<", "<").replace(">", ">") + "</b>" ) self.widget.pack_start(self.screen.widget, expand=True, fill=True) self.screen.widget.connect("key_press_event", self.on_keypress) self.model = None self.model_field = None self.name = attrs["name"]