~ubuntu-branches/ubuntu/karmic/openerp-client/karmic

« back to all changes in this revision

Viewing changes to bin/modules/gui/window/tree.py

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2008-12-07 20:17:00 UTC
  • Revision ID: james.westby@ubuntu.com-20081207201700-a875pic3sd7xkoru
Tags: upstream-5.0.0~alpha
ImportĀ upstreamĀ versionĀ 5.0.0~alpha

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- encoding: utf-8 -*-
 
2
##############################################################################
 
3
#
 
4
#    OpenERP, Open Source Management Solution   
 
5
#    Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
 
6
#    $Id$
 
7
#
 
8
#    This program is free software: you can redistribute it and/or modify
 
9
#    it under the terms of the GNU General Public License as published by
 
10
#    the Free Software Foundation, either version 3 of the License, or
 
11
#    (at your option) any later version.
 
12
#
 
13
#    This program is distributed in the hope that it will be useful,
 
14
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
16
#    GNU General Public License for more details.
 
17
#
 
18
#    You should have received a copy of the GNU General Public License
 
19
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
20
#
 
21
##############################################################################
 
22
 
 
23
import gtk
 
24
from gtk import glade
 
25
import gettext
 
26
import xmlrpclib
 
27
 
 
28
import common
 
29
import service
 
30
import view_tree
 
31
import rpc
 
32
import options
 
33
import win_export
 
34
 
 
35
class tree(object):
 
36
    def __init__(self, view, model, res_id=False, domain=[], context={}, window=None, name=False):
 
37
        self.glade = glade.XML(common.terp_path("openerp.glade"),'win_tree_container',gettext.textdomain())
 
38
        self.widget = self.glade.get_widget('win_tree_container')
 
39
        self.widget.show_all()
 
40
        self.model = view['model']
 
41
        self.domain2 = domain
 
42
        if view.get('field_parent', False):
 
43
            self.domain = []
 
44
        else:
 
45
            self.domain = domain
 
46
        self.view = view
 
47
        self.window=window
 
48
 
 
49
        self.context=context
 
50
 
 
51
        self.tree_res = view_tree.view_tree(view, [], res_id, True, context=context)
 
52
        self.tree_res.view.connect('row-activated', self.sig_open)
 
53
 
 
54
        sel = self.tree_res.view.get_selection()
 
55
        sel.connect('changed', self.expand_one)
 
56
 
 
57
        if not name:
 
58
            self.name = self.tree_res.name
 
59
        else:
 
60
            self.name = name
 
61
        self.vp = self.glade.get_widget('main_tree_sw')
 
62
 
 
63
        wid = self.glade.get_widget('widget_vbox')
 
64
        wid.show()
 
65
 
 
66
        widget_sc = self.glade.get_widget('win_tree_sc')
 
67
 
 
68
        widget_sc.connect('row-activated', self.sc_go)
 
69
        self.tree_sc = view_tree.view_tree_sc(widget_sc, self.model)
 
70
        self.handlers = {
 
71
            'but_reload': self.sig_reload,
 
72
            'but_switch': self.sig_edit,
 
73
            'but_chroot': self.sig_chroot,
 
74
            'but_open': self.sig_action,
 
75
            'but_action': self.sig_action,
 
76
            'but_print': self.sig_print,
 
77
            'but_print_html': self.sig_print_html,
 
78
            'but_close': self.sig_close,
 
79
            'but_save_as': self.sig_save_as,
 
80
        }
 
81
        dict = {
 
82
            'on_but_sc_go_clicked': self.sc_go,
 
83
            'on_but_sc_add_clicked': self.sc_add,
 
84
            'on_but_sc_del_clicked': self.sc_del,
 
85
            'on_but_expand_collapse_clicked': self.expand_collapse_all,
 
86
            'on_tbsc_clicked': self.sc_btn,
 
87
        }
 
88
 
 
89
        self.vp.add(self.tree_res.widget_get())
 
90
        self.sig_reload()
 
91
 
 
92
        for signal in dict:
 
93
            self.glade.signal_connect(signal, dict[signal])
 
94
        self.expand = True
 
95
 
 
96
    def sig_reload(self, widget=None):
 
97
        self.tree_sc.update()
 
98
        ids = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'search', self.domain2)
 
99
        if self.tree_res.toolbar:
 
100
            icon_name = 'icon'
 
101
            wid = self.glade.get_widget('tree_toolbar')
 
102
            for w in wid.get_children():
 
103
                wid.remove(w)
 
104
            c = {}
 
105
            c.update(rpc.session.context)
 
106
            res_ids = rpc.session.rpc_exec_auth_try('/object', 'execute', self.view['model'], 'read', ids, ['name',icon_name], c)
 
107
            rb = None
 
108
            for r in res_ids:
 
109
                rb = gtk.RadioToolButton(group=rb)
 
110
                l = gtk.Label(r['name'])
 
111
                rb.set_label_widget(l)
 
112
 
 
113
                icon = gtk.Image()
 
114
                if icon_name in r:
 
115
                    if hasattr(r[icon_name], 'startswith') and r[icon_name].startswith('STOCK_'):
 
116
                        icon.set_from_stock(getattr(gtk, r[icon_name]), gtk.ICON_SIZE_BUTTON)
 
117
                    else:
 
118
                        try:
 
119
                            icon.set_from_stock(r[icon_name], gtk.ICON_SIZE_BUTTON)
 
120
                        except:
 
121
                            pass
 
122
 
 
123
                hb = gtk.HBox(spacing=6)
 
124
                hb.pack_start(icon)
 
125
                hb.pack_start(gtk.Label(r['name']))
 
126
                rb.set_icon_widget(hb)
 
127
                rb.show_all()
 
128
                rb.set_data('id', r['id'])
 
129
                rb.connect('clicked', self.menu_main_clicked)
 
130
                self.menu_main_clicked(rb)
 
131
                wid.insert(rb, -1)
 
132
        else:
 
133
            self.tree_res.ids = ids
 
134
            self.tree_res.reload()
 
135
            wid = self.glade.get_widget('widget_vbox')
 
136
            wid.hide()
 
137
 
 
138
    def menu_main_clicked(self, widget):
 
139
        if widget.get_active():
 
140
            id = widget.get_data('id')
 
141
 
 
142
            ids = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'read', [id], [self.view['field_parent']])[0][self.view['field_parent']]
 
143
 
 
144
            self.tree_res.ids = ids
 
145
            self.tree_res.reload()
 
146
        return False
 
147
 
 
148
    def expand_collapse_all(self, widget):
 
149
        if self.expand:
 
150
            self.tree_res.view.expand_all()
 
151
        else:
 
152
            self.tree_res.view.collapse_all()
 
153
        self.expand = not self.expand
 
154
        if self.expand:
 
155
            widget.set_stock_id('gtk-goto-bottom')
 
156
        else:
 
157
            widget.set_stock_id('gtk-goto-top')
 
158
 
 
159
    def expand_one(self, selection):
 
160
        model,iter = selection.get_selected_rows()
 
161
        if iter:
 
162
            self.tree_res.view.expand_row(iter[0],False)
 
163
 
 
164
    def sig_print_html(self, widget=None, keyword='client_print_multi', id=None):
 
165
        self.sig_action(keyword='client_print_multi', report_type='html')
 
166
 
 
167
    def sig_print(self, widget=None, keyword='client_print_multi', id=None):
 
168
        self.sig_action(keyword='client_print_multi')
 
169
 
 
170
    def sig_action(self, widget=None, keyword='tree_but_action', id=None, report_type='pdf', warning=True):
 
171
        ids = self.ids_get()
 
172
 
 
173
        if not id and ids and len(ids):
 
174
            id = ids[0]
 
175
        if id:
 
176
            ctx = self.context.copy()
 
177
            if 'active_ids' in ctx:
 
178
                del ctx['active_ids']
 
179
            if 'active_id' in ctx:
 
180
                del ctx['active_id']
 
181
            obj = service.LocalService('action.main')
 
182
            return obj.exec_keyword(keyword, {'model':self.model, 'id':id,
 
183
                'ids':ids, 'report_type':report_type, 'window': self.window}, context=ctx,
 
184
                warning=warning)
 
185
        else:
 
186
            common.message(_('No resource selected!'))
 
187
        return False
 
188
 
 
189
    def sig_open(self, widget, iter, path):
 
190
        if not self.sig_action(widget, 'tree_but_open', warning=False):
 
191
            if self.tree_res.view.row_expanded(iter):
 
192
                self.tree_res.view.collapse_row(iter)
 
193
            else:
 
194
                self.tree_res.view.expand_row(iter, False)
 
195
 
 
196
 
 
197
    def sig_remove(self, widget=None):
 
198
        ids = self.ids_get()
 
199
        if len(ids):
 
200
            if common.sur(_('Are you sure you want\nto remove this record?')):
 
201
                try:
 
202
                    rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'unlink', ids)
 
203
                    self.sig_reload()
 
204
                except xmlrpclib.Fault, err:
 
205
                    common.message(_('Error removing resource!'))
 
206
 
 
207
    # TODO: improve with domain expr
 
208
    def sig_chroot(self, widget=None):
 
209
        ids = self.ids_get()
 
210
        if len(ids) and self.domain:
 
211
            id = ids[0]
 
212
            datas = {'domain_field': self.domain[0][0], 'domain_value': id[0], 'res_id':id[0]}
 
213
            obj = service.LocalService('gui.window')
 
214
            obj.create(self.view, self.model, id[0], (self.domain[0],id[0]) )
 
215
        else:
 
216
            common.message(_('Unable to chroot: no tree resource selected'))
 
217
 
 
218
    def sig_new(self, widget=None):
 
219
        #datas = {'res_model':self.model, 'domain_field': self.domain[0], 'domain_value': self.id_get(), 'res_id':None}
 
220
#       domain = self.domain
 
221
#       if self.domain:
 
222
#           id = self.id_get()
 
223
#           if id:
 
224
#               domain=(domain[0],id)
 
225
        obj = service.LocalService('gui.window')
 
226
        obj.create(None, self.model, None, self.domain)
 
227
 
 
228
    def sig_edit(self, widget=None):
 
229
        id = False
 
230
        ids = self.ids_get()
 
231
        if ids:
 
232
            id = ids[0]
 
233
        elif self.tree_res.toolbar:
 
234
            wid = self.glade.get_widget('tree_toolbar')
 
235
            for w in wid.get_children():
 
236
                if w.get_active():
 
237
                    id = w.get_data('id')
 
238
        if id:
 
239
            obj = service.LocalService('gui.window')
 
240
            obj.create(None, self.model, id, self.domain)
 
241
        else:
 
242
            common.message(_('No resource selected!'))
 
243
 
 
244
    def domain_id_get(self, tree=False):
 
245
        filter = []
 
246
        if self.domain and self.view.get('field_parent', False):
 
247
            filter = self.domain
 
248
        res = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'search', filter)
 
249
        return res
 
250
 
 
251
    def sig_printscreen(self, widget=None):
 
252
        ids = self.tree_res.ids
 
253
        pass
 
254
 
 
255
    def sc_btn(self, widget):
 
256
        main = service.LocalService('gui.main')
 
257
        main.shortcut_edit(widget, self.model)
 
258
 
 
259
    def sc_del(self, widget):
 
260
        id = self.tree_sc.sel_id_get()
 
261
        if id!=None:
 
262
            sc_id = int(self.tree_sc.value_get(2))
 
263
            rpc.session.rpc_exec_auth('/object', 'execute', 'ir.ui.view_sc', 'unlink', [sc_id])
 
264
        self.tree_sc.update()
 
265
 
 
266
    def sc_add(self, widget):
 
267
        ids = self.tree_res.sel_ids_get()
 
268
        if len(ids):
 
269
            res = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'name_get', ids, rpc.session.context)
 
270
            for (id,name) in res:
 
271
                uid = rpc.session.uid
 
272
                rpc.session.rpc_exec_auth('/object', 'execute', 'ir.ui.view_sc', 'create', {'resource':self.model, 'user_id':uid, 'res_id':id, 'name':name})
 
273
        self.tree_sc.update()
 
274
 
 
275
    def sc_go(self, widget=None, *args):
 
276
        id = self.tree_sc.sel_id_get()
 
277
        if id!=None:
 
278
            self.sig_action(None, 'tree_but_open', id)
 
279
 
 
280
    def ids_get(self):
 
281
        res = self.tree_res.sel_ids_get()
 
282
        return res
 
283
 
 
284
    def id_get(self):
 
285
        try:
 
286
            if hasattr(self, 'search'):
 
287
                return self.search[self.search_pos]
 
288
            else:
 
289
                return None
 
290
        except IndexError:
 
291
            return None
 
292
 
 
293
    def destroy(self):
 
294
        pass
 
295
 
 
296
    def sig_close(self, urgent=False):
 
297
        return True
 
298
 
 
299
    def sig_save_as(self, widget=None):
 
300
        fields = []
 
301
        win = win_export.win_export(self.model, self.tree_res.sel_ids_get(),
 
302
                self.tree_res.fields, [], parent=self.window, context=self.context)
 
303
        res = win.go()
 
304
 
 
305
 
 
306
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 
307