~zaber/openobject-client/main

« back to all changes in this revision

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

  • Committer: pinky
  • Date: 2006-12-07 13:41:40 UTC
  • Revision ID: pinky-56e9b555eeb500d42202250a3456cfa2a6dc78c7
New trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
##############################################################################
 
2
#
 
3
# Copyright (c) 2004 TINY SPRL. (http://tiny.be) All Rights Reserved.
 
4
#                    Fabien Pinckaers <fp@tiny.Be>
 
5
#
 
6
# WARNING: This program as such is intended to be used by professional
 
7
# programmers who take the whole responsability of assessing all potential
 
8
# consequences resulting from its eventual inadequacies and bugs
 
9
# End users who are looking for a ready-to-use solution with commercial
 
10
# garantees and support are strongly adviced to contract a Free Software
 
11
# Service Company
 
12
#
 
13
# This program is Free Software; you can redistribute it and/or
 
14
# modify it under the terms of the GNU General Public License
 
15
# as published by the Free Software Foundation; either version 2
 
16
# of the License, or (at your option) any later version.
 
17
#
 
18
# This program is distributed in the hope that it will be useful,
 
19
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
20
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
21
# GNU General Public License for more details.
 
22
#
 
23
# You should have received a copy of the GNU General Public License
 
24
# along with this program; if not, write to the Free Software
 
25
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
26
#
 
27
##############################################################################
 
28
 
 
29
import gtk
 
30
from gtk import glade
 
31
import gettext
 
32
import xmlrpclib
 
33
 
 
34
import common
 
35
import service
 
36
import view_tree
 
37
import rpc
 
38
import options
 
39
 
 
40
class tree(object):
 
41
        def __init__(self, view, model, res_id=False, domain=[], context={}):
 
42
                self.glade = glade.XML(common.terp_path("terp.glade"),'win_tree_container',gettext.textdomain())
 
43
                self.widget = self.glade.get_widget('win_tree_container')
 
44
                self.widget.show_all()
 
45
                self.model = view['model']
 
46
                self.domain2 = domain
 
47
                if view.get('field_parent', False):
 
48
                        self.domain = []
 
49
                else:
 
50
                        self.domain = domain
 
51
                self.view = view
 
52
 
 
53
                ids = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'search', self.domain2)
 
54
                self.context=context
 
55
 
 
56
                self.tree_res = view_tree.view_tree(view, [], res_id, True, context=context)
 
57
                self.tree_res.view.connect('row-activated', self.sig_open)
 
58
 
 
59
                sel = self.tree_res.view.get_selection()
 
60
                sel.connect('changed', self.expand_one)
 
61
 
 
62
                self.name = self.tree_res.name
 
63
                self.vp = self.glade.get_widget('main_tree_sw')
 
64
                
 
65
                wid = self.glade.get_widget('widget_vbox')
 
66
                if options.options['client.modepda']:
 
67
                        wid.hide()
 
68
                else:
 
69
                        wid.show()
 
70
 
 
71
                widget_sc = self.glade.get_widget('win_tree_sc')
 
72
 
 
73
                imagename = 'tinyerp.png'
 
74
                
 
75
                widget_sc.connect('row-activated', self.sc_go)
 
76
                self.tree_sc = view_tree.view_tree_sc(widget_sc, self.model)
 
77
                self.handlers = {
 
78
                        'but_reload': (_('Reload'),self.sig_reload),
 
79
                        'but_switch': (_('Switch View'),self.sig_edit),
 
80
                        'but_chroot': (_('Changt root'),self.sig_chroot),
 
81
                        'but_open': (_('Open'),self.sig_open),
 
82
                        'but_action': (_('Open'),self.sig_action),
 
83
                        'but_print': (_('Print'),self.sig_print),
 
84
                        'but_print_html': (_('Print'),self.sig_print_html),
 
85
                        'but_close': (_('Close'),self.sig_close)
 
86
                }
 
87
                dict = {
 
88
                        'on_but_sc_go_clicked': self.sc_go,
 
89
                        'on_but_sc_add_clicked': self.sc_add,
 
90
                        'on_but_sc_del_clicked': self.sc_del
 
91
                }
 
92
 
 
93
                self.vp.add(self.tree_res.widget_get())
 
94
                if self.tree_res.toolbar:
 
95
                        
 
96
                        icon_name = 'icon'
 
97
                        wid = self.glade.get_widget('tree_toolbar')
 
98
                        c = {}
 
99
                        c.update(rpc.session.context)
 
100
                        res_ids = rpc.session.rpc_exec_auth_try('/object', 'execute', self.view['model'], 'read', ids, ['name',icon_name], c)
 
101
                        rb = None
 
102
                        for r in res_ids:
 
103
                                rb = gtk.RadioToolButton(group=rb)
 
104
                                l = gtk.Label(r['name'])
 
105
                                rb.set_label_widget(l)
 
106
 
 
107
                                icon = gtk.Image() 
 
108
                                if r[icon_name].startswith('STOCK_'):
 
109
                                        icon.set_from_stock(getattr(gtk, r[icon_name]), gtk.ICON_SIZE_BUTTON)
 
110
                                else:
 
111
                                        icon.set_from_stock(r[icon_name], gtk.ICON_SIZE_BUTTON)
 
112
 
 
113
                                hb = gtk.HBox(spacing=6)
 
114
                                hb.pack_start(icon)
 
115
                                hb.pack_start(gtk.Label(r['name']))
 
116
                                rb.set_icon_widget(hb)
 
117
                                rb.show_all()
 
118
                                rb.set_data('id', r['id'])
 
119
                                rb.connect('clicked', self.menu_main_clicked)
 
120
                                #rb.set_active(False)
 
121
                                self.menu_main_clicked(rb)
 
122
                                wid.insert(rb, -1)
 
123
                else:
 
124
                        self.tree_res.ids = ids
 
125
                        self.tree_res.reload()
 
126
                        wid = self.glade.get_widget('tree_toolbar')
 
127
                        wid.hide()
 
128
                        wid = self.glade.get_widget('tree_vpaned')
 
129
                        wid.set_position(-1)
 
130
 
 
131
 
 
132
                for signal in dict:
 
133
                        self.glade.signal_connect(signal, dict[signal])
 
134
 
 
135
        def menu_main_clicked(self, widget):
 
136
                if widget.get_active():
 
137
                        id = widget.get_data('id')
 
138
                        
 
139
                        ids = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'read', [id], [self.view['field_parent']])[0][self.view['field_parent']]
 
140
 
 
141
                        self.tree_res.ids = ids
 
142
                        self.tree_res.reload()
 
143
 
 
144
                        #self.tree_res = view_tree.view_tree(self.view, ids, id, True, context=self.context)
 
145
                        #self.tree_res.view.connect('row-activated', self.sig_open)
 
146
                        #sel = self.tree_res.view.get_selection()
 
147
                        #sel.connect('changed', self.expand_one)
 
148
                return False
 
149
 
 
150
        def menu_main_change(self):
 
151
                self.tree_res = view_tree.view_tree(view, ids, res_id, True, context=context)
 
152
                self.tree_res.view.connect('row-activated', self.sig_open)
 
153
                sel = self.tree_res.view.get_selection()
 
154
                sel.connect('changed', self.expand_one)
 
155
                self.name = self.tree_res.name
 
156
                self.vp.remove(self.vp.get_child())
 
157
 
 
158
 
 
159
 
 
160
        def expand_one(self, selection):
 
161
                model,iter = selection.get_selected_rows()
 
162
                if iter:
 
163
                        self.tree_res.view.expand_row(iter[0],False)
 
164
 
 
165
        def sig_print_html(self, widget=None, keyword='client_print_multi', id=None):
 
166
                self.sig_action(keyword='client_print_multi', report_type='html')
 
167
 
 
168
        def sig_print(self, widget=None, keyword='client_print_multi', id=None):
 
169
                self.sig_action(keyword='client_print_multi')
 
170
 
 
171
        def sig_action(self, widget=None, keyword='tree_but_action', id=None, report_type='pdf'):
 
172
                ids = self.ids_get()
 
173
                
 
174
                if not id and ids and len(ids):
 
175
                        id = ids[0]
 
176
                if id:
 
177
                        obj = service.LocalService('action.main')
 
178
                        obj.exec_keyword(keyword, {'model':self.model, 'id':id,
 
179
                                                          'ids':ids, 'report_type':report_type})
 
180
                else:
 
181
                        common.message(_('No resource selected!'))
 
182
 
 
183
        def sig_reload(self, widget=None):
 
184
                self.tree_res.reload()
 
185
 
 
186
        def sig_open(self, widget=None, *args):
 
187
                self.sig_action(widget, 'tree_but_open' )
 
188
 
 
189
        def sig_remove(self, widget=None):
 
190
                ids = self.ids_get()
 
191
                if len(ids):
 
192
                        if common.sur(_('Are you sure you want\nto remove this record?')):
 
193
                                try:
 
194
                                        rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'unlink', ids)
 
195
                                        self.sig_reload()
 
196
                                except xmlrpclib.Fault, err:
 
197
                                        common.message(_('Error removing resource!'))
 
198
 
 
199
        # TODO: improve with domain expr
 
200
        def sig_chroot(self, widget=None):
 
201
                ids = self.ids_get()
 
202
                if len(ids) and self.domain:
 
203
                        id = ids[0]
 
204
                        datas = {'domain_field': self.domain[0][0], 'domain_value': id[0], 'res_id':id[0]}
 
205
                        obj = service.LocalService('gui.window')
 
206
                        obj.create(self.view, self.model, id[0], (self.domain[0],id[0]) )
 
207
                else:
 
208
                        common.message(_('Unable to chroot: no tree resource selected'))
 
209
 
 
210
        def sig_new(self, widget=None):
 
211
                #datas = {'res_model':self.model, 'domain_field': self.domain[0], 'domain_value': self.id_get(), 'res_id':None}
 
212
#               domain = self.domain
 
213
#               if self.domain:
 
214
#                       id = self.id_get()
 
215
#                       if id:
 
216
#                               domain=(domain[0],id)
 
217
                obj = service.LocalService('gui.window')
 
218
                obj.create(None, self.model, None, self.domain)
 
219
 
 
220
        def sig_edit(self, widget=None):
 
221
                ids = self.ids_get()
 
222
                if len(ids):
 
223
                        obj = service.LocalService('gui.window')
 
224
                        obj.create(None, self.model, ids[0], self.domain)
 
225
                else:
 
226
                        common.message(_('No resource selected!'))
 
227
 
 
228
        def domain_id_get(self, tree=False):
 
229
                filter = []
 
230
                if self.domain and self.view.get('field_parent', False):
 
231
                        filter = self.domain
 
232
                res = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'search', filter)
 
233
                return res
 
234
 
 
235
        def sig_printscreen(self, widget=None):
 
236
                ids = self.tree_res.ids
 
237
                pass
 
238
 
 
239
        def sc_del(self, widget):
 
240
                id = self.tree_sc.sel_id_get()
 
241
                if id!=None:
 
242
                        sc_id = int(self.tree_sc.value_get(2))
 
243
                        rpc.session.rpc_exec_auth('/object', 'execute', 'ir.ui.view_sc', 'unlink', [sc_id])
 
244
                self.tree_sc.update()
 
245
 
 
246
        def sc_add(self, widget):
 
247
                ids = self.tree_res.sel_ids_get()
 
248
                if len(ids):
 
249
                        res = rpc.session.rpc_exec_auth('/object', 'execute', self.model, 'name_get', ids, rpc.session.context)
 
250
                        for (id,name) in res:
 
251
                                uid = rpc.session.uid
 
252
                                rpc.session.rpc_exec_auth('/object', 'execute', 'ir.ui.view_sc', 'create', {'resource':self.model, 'user_id':uid, 'res_id':id, 'name':name})
 
253
                self.tree_sc.update()
 
254
 
 
255
        def sc_go(self, widget=None, *args):
 
256
                id = self.tree_sc.sel_id_get()
 
257
                if id!=None:
 
258
                        self.sig_action(None, 'tree_but_open', id)
 
259
 
 
260
        def ids_get(self):
 
261
                res = self.tree_res.sel_ids_get()
 
262
                return res
 
263
 
 
264
        def id_get(self):
 
265
                try:
 
266
                        return self.search[self.search_pos]
 
267
                except IndexError:
 
268
                        return None
 
269
 
 
270
        def destroy(self):
 
271
                pass
 
272
 
 
273
        def sig_close(self, urgent=False):
 
274
                return True