~ubuntu-branches/ubuntu/trusty/aptoncd/trusty

« back to all changes in this revision

Viewing changes to restore.py

  • Committer: Bazaar Package Importer
  • Author(s): Fabrice Coutadeur
  • Date: 2009-08-19 21:41:06 UTC
  • mfrom: (3 sid) (1.2.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 4.
  • Revision ID: james.westby@ubuntu.com-20090819214106-7g72fpzgvl722w6k
* New maintainer (Closes: #542459, #484637, #542501)
* New upstream release
  - Fix the executable flag on non executable files. This fix last lintian
    warnings
* debian/rules: prepared for python2.6 (include of python.mk and use of 
  $(py_setup_install_args) )

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/env python
2
 
# -*- coding: utf-8 -*-
3
 
# restore.py
4
 
#  
5
 
#  Author: Laudeci Oliveira <laudeci@gmail.com>
6
 
#          Rafael Proença   <cypherbios@ubuntu.com>
7
 
8
 
#  This program is free software; you can redistribute it and/or 
9
 
#  modify it under the terms of the GNU General Public License as 
10
 
#  published by the Free Software Foundation; either version 2 of the
11
 
#  License, or (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, write to the Free Software
20
 
#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21
 
#  USA
22
 
 
23
 
from messageBox import MessageBox
24
 
import ProgressWindow
25
 
import apt_inst
26
 
import apt_pkg
27
 
import config
28
 
import gnomevfs
29
 
import gobject
30
 
import gtk
31
 
import gtk.glade
32
 
import metaPackage
33
 
import os
34
 
import pango
35
 
import pygtk
36
 
import shutil
37
 
import utils
38
 
import msg
39
 
 
40
 
class restoreAptOnCd:
41
 
    
42
 
    def __init__(self, gladeFileName,mediaPath=""):
43
 
        self.formName = "frmRestoreCD"
44
 
        self.gladeFile = gtk.glade.XML(gladeFileName, self.formName)
45
 
        self.cursorManager = utils.cursorManager()
46
 
        self.mediaPath = mediaPath
47
 
        self.checkOldVersions = False
48
 
        
49
 
    def run(self):
50
 
        """This function will show the Create frmRestoreCD"""
51
 
        #Get the  dialog widget
52
 
        self.frmRestoreCD = self.gladeFile.get_widget(self.formName)
53
 
        self.frmRestoreCD.set_position(gtk.WIN_POS_CENTER)
54
 
        self.frmRestoreCD.set_modal(True)
55
 
        self.frmRestoreCD.set_sensitive(False)
56
 
        
57
 
        # ---- dictionary ----
58
 
        dic = { 'on_btnRestoreGo_clicked':self.on_btnRestoreGo_clicked }
59
 
        self.gladeFile.signal_autoconnect(dic)
60
 
        
61
 
        #Holds a Variable to use with progressWindos
62
 
        self.wProgress = None
63
 
        
64
 
        self.cmdRestoreGo = self.gladeFile.get_widget("btnRestoreGo")
65
 
        self.cmdCancel = self.gladeFile.get_widget("btnCancel")
66
 
        self.ckbtnOldVersions = self.gladeFile.get_widget("ckbtnOldVersions")
67
 
        self.ckbtnOldVersions.connect('toggled',self.on_ckbtnOldVersions_toggled)
68
 
        
69
 
        self.ckbtnAutoSelectDepends = self.gladeFile.get_widget('ckbtnAutoSelectDepends')
70
 
 
71
 
        self.comboBox = self.gladeFile.get_widget('drivesComboBox')
72
 
        
73
 
        ret = metaPackage.updatePackageCount(None,False)
74
 
        self.updateCountView(ret)
75
 
        
76
 
        self.createPackageViewList()
77
 
        ret = metaPackage.updatePackageCount(self.packageList)
78
 
        self.updateCountView(ret)
79
 
        
80
 
        self.frmRestoreCD.set_sensitive(True)
81
 
        result = self.frmRestoreCD.run()
82
 
 
83
 
        #we are done with the dialog, destory it
84
 
        self.frmRestoreCD.destroy()
85
 
 
86
 
        #return the result
87
 
        return     result
88
 
        
89
 
    def createDebFileList(self):
90
 
        #fileNames = [nFile for nFile in os.listdir(self.mediaPath) if nFile.endswith(".deb")]
91
 
        recursive = utils.RecursiveSearch
92
 
        fileNames = [nFile for nFile in recursive(self.mediaPath, "*.deb")]
93
 
        mLen = len(fileNames)
94
 
        self.wProgress.TaskLenght(mLen)
95
 
        for iIndex in range(mLen):
96
 
            #if '.deb' in fileName:
97
 
            self.wProgress.update(iIndex)
98
 
            iList = metaPackage.createNewItem(fileNames[iIndex],False, self.mediaPath)
99
 
            metaPackage.addNewListItem(self.packageList,iList)
100
 
        self.wProgress.Task(msg.MESSAGE_0045)
101
 
        metaPackage.uncheckMinorVersion(self.packageList)        
102
 
        ret = metaPackage.updatePackageCount(self.packageList)
103
 
        self.updateCountView(ret)
104
 
        if metaPackage.get_ErrorCount() > 0:
105
 
            if metaPackage.get_ErrorCount() >1:
106
 
                strMsg = msg.MESSAGE_0032 % metaPackage.get_ErrorCount()
107
 
            else:
108
 
                strMsg = msg.MESSAGE_0033 % metaPackage.get_ErrorCount()
109
 
                
110
 
            mReturn = MessageBox().ShowError(strMsg,self.frmRestoreCD)
111
 
        return
112
 
    
113
 
    def addListColumn(self, title, columnId, activatable = False):
114
 
        """This function adds a column to the list view.
115
 
        First it create the gtk.TreeViewColumn and then set
116
 
        some needed properties"""
117
 
        if activatable:
118
 
            cell = gtk.CellRendererToggle()
119
 
            cell.set_property('activatable', activatable)
120
 
            cell.connect('toggled',self.on_Column_toggled, self.packageList)
121
 
            column = gtk.TreeViewColumn(title, cell)
122
 
            column.add_attribute( cell, "active", 0)
123
 
        else :
124
 
            cell = gtk.CellRendererText()
125
 
            column = gtk.TreeViewColumn(title, cell, markup=config.LIST_CONTENTS)
126
 
 
127
 
        column.set_resizable(True)
128
 
        column.set_sort_column_id(columnId)
129
 
        self.packageView.append_column(column)
130
 
        
131
 
        return
132
 
    
133
 
    def createPackageViewList(self):
134
 
        #Get the listView from the widget Tree
135
 
        self.packageView = self.gladeFile.get_widget("tvwPackages")
136
 
        self.packageView.connect('row-activated',self.on_double_Click)
137
 
        self.cursorManager.setBusy(self.frmRestoreCD,True)
138
 
        self.packageView.set_sensitive(False)
139
 
        
140
 
        self.wProgress = ProgressWindow.AptOnCDProgressDialog(self.frmRestoreCD)
141
 
        self.wProgress.Title("APTonCD")
142
 
        self.wProgress.TaskTitle(msg.MESSAGE_0034)
143
 
        self.wProgress.Task(msg.MESSAGE_0002)
144
 
        self.wProgress.Description(msg.MESSAGE_0035)
145
 
        
146
 
        self.cursorManager.setBusy(self.wProgress,True)
147
 
        self.wProgress.isCancelEnabled(False)
148
 
 
149
 
        # filename, fullfilename with path, and a bool value
150
 
        # indicating if it is a custom deb file
151
 
        # stores deb information
152
 
 
153
 
        #changed to add the last param.. to show deb description
154
 
        self.packageList = gtk.ListStore(bool, str, bool, object, bool,bool)
155
 
        
156
 
        self.addListColumn('   ', 0,True)
157
 
        self.addListColumn('Package',1,False)
158
 
        
159
 
        #this will create a tooltip object    
160
 
        self.toolTip = gtk.Tooltips() 
161
 
        self.toolTip.set_tip(self.packageView, "")
162
 
 
163
 
        # this will turn searchable on
164
 
        self.packageView.set_enable_search(True)
165
 
        self.packageView.set_search_column(1)
166
 
        self.packageView.set_search_equal_func(utils.TreeViewSearch, None)
167
 
 
168
 
        # prepares list for drag and drop operations
169
 
        self.packageView.enable_model_drag_dest([('text/plain', 0, 0), ('text/uri-list', 0, 1)],
170
 
                        gtk.gdk.ACTION_DEFAULT | gtk.gdk.ACTION_MOVE)
171
 
        #packages events to show tooltips
172
 
        self.packageView.connect("motion-notify-event", utils.packageTooltip, self.toolTip, 1)
173
 
        
174
 
        # this will start the list sorted by name
175
 
        self.packageList.set_sort_column_id(1, gtk.SORT_ASCENDING)
176
 
        
177
 
        self.createDebFileList()
178
 
        # this will create the main list and store it in the view
179
 
        self.packageView.set_model(self.packageList)
180
 
        
181
 
        self.wProgress.destroy()
182
 
        
183
 
        self.packageView.connect("button_press_event", self.on_button_press_event)
184
 
        self.packageView.set_sensitive(True)
185
 
        self.cursorManager.setBusy(self.frmRestoreCD,False)
186
 
        return
187
 
    
188
 
    def updateCountView(self,value):
189
 
        self.gladeFile.get_widget("lblPackageList").set_text(value[0])
190
 
        self.gladeFile.get_widget("lblSelected").set_text(value[2])
191
 
        
192
 
    # Signals Handlers
193
 
    def on_double_Click(self, treeview, path, view_column):
194
 
        renderer = treeview.get_column(0).get_cell_renderers()[0]
195
 
        renderer.emit('toggled',path[0])
196
 
                
197
 
    def on_ckbtnOldVersions_toggled(self,widget):
198
 
        self.checkOldVersions = self.ckbtnOldVersions.get_active()
199
 
        
200
 
 
201
 
    def on_button_press_event(self, widget, event):
202
 
        if event.button == 3 and event.type == gtk.gdk.BUTTON_PRESS:
203
 
            c = utils.ContextMenu(self)
204
 
            c.addMenuItem(msg.MESSAGE_0036, self.on_checkAll)
205
 
            c.addMenuItem(msg.MESSAGE_0037, self.on_uncheckAll)
206
 
            c.addMenuItem("-")
207
 
            c.addMenuItem(msg.MESSAGE_0038, self.on_removePackage)
208
 
            c.addMenuItem("-")
209
 
            c.addMenuItem(msg.MESSAGE_0039, self.on_invertcheckAll)
210
 
            c.popup(None, None, None, event.button, event.get_time())
211
 
        return
212
 
    
213
 
    def checkUncheck(self,iType,path = None, model = None):
214
 
        self.cursorManager.setBusy(self.frmRestoreCD,True)
215
 
        
216
 
        if iType == 0:
217
 
            metaPackage.removePackage(self.packageView)
218
 
        elif iType == 1:
219
 
            metaPackage.checkAll(self.packageList,self.checkOldVersions)
220
 
        elif iType == 2:
221
 
            metaPackage.uncheckAll(self.packageList)
222
 
        elif iType == 3:
223
 
            metaPackage.invertcheckAll(self.packageList,self.checkOldVersions)
224
 
        elif iType == 4:
225
 
            metaPackage.Column_toggled(path,model,self.checkOldVersions)
226
 
            # if user wants, aptoncd will check dependets packages 
227
 
            if self.ckbtnAutoSelectDepends.get_active():
228
 
                if model[path][config.C_CHECKED]:
229
 
                    metaPackage.checkDepends(self.packageList,model[path][config.C_PKG].get_pkg_depends())
230
 
            
231
 
        ret =metaPackage.updatePackageCount(self.packageList)    
232
 
        self.updateCountView(ret)
233
 
        self.cursorManager.setBusy(self.frmRestoreCD,False)
234
 
    
235
 
    def on_removePackage(self, *args):
236
 
        self.checkUncheck(0)
237
 
        return
238
 
    
239
 
    def on_checkAll(self,*args):
240
 
        self.checkUncheck(1)
241
 
        return
242
 
    
243
 
    def on_uncheckAll(self,*args):
244
 
        self.checkUncheck(2)
245
 
        return
246
 
    
247
 
    def on_invertcheckAll(self,*args):
248
 
        self.checkUncheck(3)
249
 
        return
250
 
    
251
 
    def on_Column_toggled(self, cell, path, model):
252
 
        self.checkUncheck(4, path, model)
253
 
        cell.set_active(False)
254
 
        return
255
 
    
256
 
    def addMediaAsSource(self,*args):
257
 
        os.system("gksu --desktop /usr/share/applications/aptoncd.desktop 'synaptic --hide-main-window --ask-cdrom' &")
258
 
       
259
 
    # Restore APTonCD
260
 
    def on_btnRestoreGo_clicked(self,*args):
261
 
        self.cmdRestoreGo.set_sensitive(False)
262
 
        self.cmdCancel.set_sensitive(False)
263
 
 
264
 
        aptcache = config.LOCAL_APT_FOLDER
265
 
        if not utils.checkAccess(aptcache):
266
 
                MessageBox().ShowError((msg.MESSAGE_0040))
267
 
                return
268
 
        
269
 
        self.wProgress = ProgressWindow.AptOnCDProgressDialog(self.frmRestoreCD)
270
 
        self.wProgress.Title("APTonCD")
271
 
        self.wProgress.TaskTitle(msg.MESSAGE_0041)
272
 
        self.wProgress.Task(msg.MESSAGE_0002)
273
 
        self.wProgress.Description(msg.MESSAGE_0014)
274
 
        self.restoreAptOnCD()
275
 
        
276
 
        self.wProgress.destroy()
277
 
        
278
 
        self.cmdRestoreGo.set_sensitive(True)
279
 
        self.cmdCancel.set_sensitive(True)
280
 
        
281
 
    def restoreAptOnCD(self):
282
 
        errorMsg=""
283
 
        
284
 
        self.wProgress.show()
285
 
        
286
 
        iIndex = 0
287
 
       
288
 
        filesToCopy = [files for files in self.packageList if files[config.C_CHECKED]]
289
 
        self.wProgress.TaskLenght(len(filesToCopy)-1)
290
 
        
291
 
        for cds in filesToCopy:                    
292
 
            iIndex +=1
293
 
            self.wProgress.update(iIndex)
294
 
            
295
 
            pkg = cds[config.C_PKG]
296
 
            filedestination = os.path.join(config.LOCAL_APT_FOLDER  , pkg.get_pkg_FileName())
297
 
            
298
 
            if self.wProgress.cancel_status:
299
 
                errorMsg = msg.MESSAGE_0016
300
 
                break
301
 
                    
302
 
            pkg.copyTo(filedestination )
303
 
            self.wProgress.Task(msg.MESSAGE_0044 + pkg.get_pkg_FileName())
304
 
                
305
 
            
306
 
        if self.wProgress.cancel_status or len(errorMsg)>0:
307
 
            self.wProgress.hide()
308
 
        
309
 
        if len(errorMsg) > 0 :
310
 
            strMsg = msg.MESSAGE_0042
311
 
            mReturn = MessageBox().ShowInfo(strMsg,self.frmRestoreCD)
312
 
        else :
313
 
            mReturn = MessageBox().ShowInfo((msg.MESSAGE_0043))