Last update of gforge repository
[tablet-suite] / src / backup / pcsbackupwizard.py
1 from time import sleep
2 import threading
3
4 from functools import partial
5
6 from PyQt4.QtCore import *
7 from PyQt4.QtGui import *
8
9 from ui.pcsuiutils import *
10
11 from pcsprogresswizard import *
12
13 from pcscheckboxwizard import *
14 from pcsopenfilewizard import *
15 from pcspcbackupmanager import *
16 from pcsdevicemanager import *
17
18 class PcsBackupWizard(QWizard):
19     
20     ''' Class that creates a wizard responsible for doing backup '''
21     
22     def __init__(self, deviceInfo, windowManager, parent = None):
23         QWizard.__init__(self, parent)
24         self.windowManager = windowManager
25         self.deviceInfo = deviceInfo
26         stylesheet = '''QWizard{background-image:url('''+ BACKUP_BG + ''')};'''
27         self.setStyleSheet(stylesheet)       
28         self.setWindowIcon(QIcon(BACKUP_IMAGE))
29         self.setWindowTitle("%s Backup" % APPLICATION_NAME)
30         self.setFixedSize(WINDOW_WIDTH,WINDOW_HEIGHT)
31         
32         self.setButtonLayout([])
33         self.setWizardStyle(4)
34         
35         self.checkboxPage = PcsCheckboxWizard(self.deviceInfo, windowManager, self)
36         self.addPage(self.checkboxPage)
37         
38         self.chooseFilePage = PcsOpenFileWizard(self.deviceInfo, windowManager, self)
39         self.connect(self.chooseFilePage.finishButton, SIGNAL("clicked()"), 
40                      self.noNameTest)
41         self.addPage(self.chooseFilePage)
42         
43         self.progressWizard = PcsProgressWizard(self.deviceInfo,self, windowManager, self)
44
45
46
47         self.connect(self.progressWizard.cancelButton, SIGNAL("clicked()"), 
48                      self._onBackupCancel)
49
50         self.connect(self.progressWizard.doneButton, SIGNAL("clicked()"), self._done)
51         self.addPage(self.progressWizard)
52     
53
54
55     def noNameTest(self):
56         if(str(self.chooseFilePage.getBackupName()).strip() == ""):
57             message = "Your backup name can't be blank."
58             showMessageBox(message, "Backup name blank")
59         else:
60             self.doNewBackup()
61             self.next()
62     
63     def _done(self):
64         self.done(0)
65         self.progressWizard._resetPage()
66         self.chooseFilePage._resetPage()
67     
68     def doNewBackup(self):
69         
70         hostIp = self.deviceInfo.ip
71         backupName = self.chooseFilePage.getBackupName()
72         backupPath = self.chooseFilePage.getPath()
73         categories = self.checkboxPage.getCategories()
74         self.backupManager = PcsPcBackupManager()
75         self.backupManager.loadBackups()
76         comments = ""
77         
78         self._updateThread = UpdateBackupProgress(backupName, backupPath, 
79                                                   hostIp,categories, comments, 
80                                                   self.backupManager, 
81                                                   self.progressWizard)
82         self.connect(self._updateThread, SIGNAL("backupFinished"),
83                       self._onBackupDone)        
84         self.connect(self._updateThread, SIGNAL("backupCanceled"),
85                       self._onBackupCancel)
86         self.connect(self._updateThread, SIGNAL("backupNameChanged"),
87                       self._onBackupNameChanged)
88         self.connect(self._updateThread, SIGNAL("backupProgress"),
89                       self._updateCategoriesAndProgress)
90         
91         self._updateThread.start()
92         
93     def _updateCategoriesAndProgress(self, information):
94         progress, category = information
95         self.progressWizard.setProgress(progress)
96         self.progressWizard.setCategory(category)
97         
98         
99     def _onBackupDone(self, info):
100         self.progressWizard.updateInfo(info[0], info[1])
101         self.progressWizard.progressDone()
102         self.windowManager.getBackupManager().pcListView.updateBackupList()
103
104     def _onBackupNameChanged(self, correct_name):
105         """
106         Check if backup name was changed and show message case positive.
107         """
108         nameChangeMessage = "Backup with same name was found in" + \
109                                     " backup list, Backup name changed to %s" \
110                                      % correct_name
111         showMessageBox(nameChangeMessage, "Backup name changed")
112     
113     def _onBackupCancel(self):
114         """
115         Stops current backup process in backup manager.
116         Also, shows a message box informing about canceling.
117         
118         """
119         self.progressWizard.progressCanceled()
120         self.backupManager.setBackupInProgress(False)
121         
122 class UpdateBackupProgress(QThread):
123     
124     def __init__(self, backupName, path, hostIp, categories, comment, 
125                  backupManager, progressWizard):
126         QThread.__init__(self)
127
128         self.backupName = backupName
129         self.path = path
130         self.hostIp = hostIp
131         self.categories = categories
132         self.comment = comment
133         self.backupManager = backupManager
134         
135         
136     def run(self):
137         self._backupFlag = True
138         
139         self.correctName = self.backupManager._verify_backup_name(self.backupName)
140         self.nameChanged = self.correctName != self.backupName
141         
142         self.connect(self.backupManager, SIGNAL("backupProgress"), self._reEmitSignal)
143         self.connect(self.backupManager, SIGNAL("backupDone"), self._onBackupDone)
144         res = self.backupManager.createBackup(self.correctName, self.path,
145                                          self.hostIp, self.categories, 
146                                          self.comment)
147         
148         while (self._backupFlag):
149             sleep(0.1)
150             
151     def _reEmitSignal(self, informations):
152         self.emit(SIGNAL("backupProgress"), informations)
153     
154     def _onBackupDone(self, res, info):
155         self._backupFlag = False
156         # If backup was not canceled, emit done signal
157         if res != 0:
158             if self.nameChanged:
159                 self.emit(SIGNAL("backupNameChanged"), self.correctName)
160             self.emit(SIGNAL("backupFinished"), info)
161         else:
162             self.emit(SIGNAL("backupCanceled"))
163
164