コード例 #1
0
ファイル: action.py プロジェクト: sallecta/openerp-client
    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
コード例 #2
0
 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})}
コード例 #3
0
ファイル: filter.py プロジェクト: sallecta/openerp-client
 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})
     }
コード例 #4
0
 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
コード例 #5
0
ファイル: char.py プロジェクト: sallecta/openerp-client
 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
     }
コード例 #6
0
ファイル: action.py プロジェクト: Ichag/openerp-client
    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
コード例 #7
0
 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 {}
コード例 #8
0
ファイル: checkbox.py プロジェクト: sallecta/openerp-client
 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
     }
コード例 #9
0
 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 {}
コード例 #10
0
 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 {}
コード例 #11
0
ファイル: selection.py プロジェクト: sallecta/openerp-client
 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 {}
コード例 #12
0
    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
コード例 #13
0
ファイル: record.py プロジェクト: Som-Energia/erpclient
    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
コード例 #14
0
ファイル: action.py プロジェクト: gisce/erpclient
    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
コード例 #15
0
ファイル: view_tree.py プロジェクト: sallecta/openerp-client
 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
コード例 #16
0
ファイル: main.py プロジェクト: gisce/erpclient
    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',''))
コード例 #17
0
    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('&', '&amp;').replace(
                '<', '&lt;').replace('>', '&gt;') + '</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']
コード例 #18
0
    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('&','&amp;').replace('<','&lt;').replace('>','&gt;')+'</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']
コード例 #19
0
    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', ''))
コード例 #20
0
ファイル: screen.py プロジェクト: Ichag/openerp-client
    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
コード例 #21
0
ファイル: one2many_list.py プロジェクト: Ichag/openerp-client
    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('&','&amp;').replace('<','&lt;').replace('>','&gt;')+'</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']
コード例 #22
0
    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',''))
コード例 #23
0
    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('&','&amp;').replace('<','&lt;').replace('>','&gt;')+'</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']
コード例 #24
0
    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
コード例 #25
0
ファイル: form.py プロジェクト: sallecta/openerp-client
    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
コード例 #26
0
    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
コード例 #27
0
    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',''))
コード例 #28
0
    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
コード例 #29
0
ファイル: many2many.py プロジェクト: sallecta/openerp-client
    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)
コード例 #30
0
ファイル: one2many_list.py プロジェクト: goldenboy/razvoj
    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("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
            + "</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"]