class ObsProjectsManager(ObsLightGuiObject, ProjectsManagerBase): ''' Manages the local project list widget and project-related buttons of the main window. ''' def __init__(self, gui): """ Initialize the ObsProjectsManager. `gui` must be a reference to the main `Gui` instance. """ ObsLightGuiObject.__init__(self, gui) ProjectsManagerBase.__init__(self, self.mainWindow.obsProjectsListWidget, self.manager.getLocalProjectList) self.__projectConfigManager = None self.__repoConfigManager = None self.loadProjectList() self.projectListWidget.currentTextChanged.connect( self.on_projectSelected) self.__packageManager = PackageManager(self.gui) self.__connectButtons() def __connectButtons(self): """ Connect project-related, chroot-related and repository-related buttons of the OBS project tab to the appropriate methods. """ mw = self.mainWindow mw.newObsProjectButton.clicked.connect(self.gui.runWizard) # mw.modifyObsProjectButton.clicked.connect(self.on_modifyObsProjectButton_clicked) mw.deleteObsProjectButton.clicked.connect( self.on_deleteObsProjectButton_clicked) # mw.loadObsProjectButton.clicked.connect(self.on_importObsProjectButton_clicked) # mw.saveObsProjectButton.clicked.connect(self.on_exportObsProjectButton_clicked) mw.newChrootButton.clicked.connect(self.on_newChrootButton_clicked) mw.openChrootButton.clicked.connect(self.on_openChrootButton_clicked) mw.deleteChrootButton.clicked.connect( self.on_deleteChrootButton_clicked) # @popupOnException # def on_modifyObsProjectButton_clicked(self): # projectName = self.currentProject # if projectName is None: # return # self.__projectConfigManager = ProjectConfigManager(self.gui, projectName) # self.__projectConfigManager.finished.connect(self.on_projectConfigManager_finished) @popupOnException def on_deleteObsProjectButton_clicked(self): projectName = self.currentProject if projectName is None: return result = QMessageBox.question( self.mainWindow, "Are you sure ?", "Are you sure you want to delete %s project ?" % projectName, buttons=QMessageBox.Yes | QMessageBox.No, defaultButton=QMessageBox.Yes) if result == QMessageBox.No: return progress = self.gui.getInfiniteProgressDialog() runnable = ProgressRunnable2(progress) runnable.setDialogMessage(u"Deleting project...") runnable.setRunMethod(self.manager.removeProject, projectName) runnable.finished.connect(self.refresh) runnable.caughtException.connect(self.gui.popupErrorCallback) runnable.runOnGlobalInstance() # @popupOnException # def on_importObsProjectButton_clicked(self): # filePath, _filter = QFileDialog.getOpenFileName(self.mainWindow, # u"Select project to import") # if len(filePath) < 1: # return # progress = self.gui.getInfiniteProgressDialog() # runnable = ProgressRunnable2(progress) # runnable.setDialogMessage(u"Importing project...") # runnable.setRunMethod(self.manager.importProject, filePath) # runnable.caughtException.connect(self.gui.popupErrorCallback) # runnable.finished.connect(self.refresh) # runnable.runOnGlobalInstance() # @popupOnException # def on_exportObsProjectButton_clicked(self): # project = self.currentProject # if project is None: # return # filePath, _filter = QFileDialog.getSaveFileName(self.mainWindow, # u"Select file to export") # if len(filePath) < 1: # return # progress = self.gui.getInfiniteProgressDialog() # runnable = ProgressRunnable2(progress) # runnable.setDialogMessage(u"Exporting project...") # runnable.setRunMethod(self.manager.exportProject, project, filePath) # runnable.caughtException.connect(self.gui.popupErrorCallback) # runnable.finished.connect(self.refresh) # runnable.runOnGlobalInstance() @popupOnException def on_projectConfigManager_finished(self, success): if success: self.loadProjectList() self.on_projectSelected(None) @popupOnException def on_newChrootButton_clicked(self): projectName = self.currentProject if projectName is None or self.manager.isChRootInit(projectName): return runnable = ProgressRunnable2(self.gui.getInfiniteProgressDialog()) runnable.setDialogMessage(u"Creating project file system...") runnable.setRunMethod(self.manager.createChRoot, projectName) runnable.caughtException.connect(self.gui.popupErrorCallback) runnable.finished.connect(self.refreshProject) runnable.runOnGlobalInstance() @popupOnException def on_openChrootButton_clicked(self): projectName = self.currentProject if projectName is None or not self.manager.isChRootInit(projectName): return currentPackage = self.__packageManager.currentPackage() runnable = ProgressRunnable2() useRootId = self.mainWindow.checkUserRootForChroot.isChecked() if useRootId: self.mainWindow.checkUserRootForChroot.setCheckState( Qt.CheckState(False)) if currentPackage is None: runnable.setRunMethod(self.manager.goToChRoot, projectName, useRootId=useRootId, detach=True) else: runnable.setRunMethod(self.manager.goToChRoot, projectName, currentPackage, useRootId=useRootId, detach=True) runnable.caughtException.connect(self.gui.popupErrorCallback) runnable.finished.connect(self.refreshProject) runnable.runOnGlobalInstance() @popupOnException def on_deleteChrootButton_clicked(self): projectName = self.currentProject if projectName is not None: result = QMessageBox.question( self.mainWindow, "Are you sure ?", "Are you sure you want to delete %s's file system ?" % projectName, buttons=QMessageBox.Yes | QMessageBox.No, defaultButton=QMessageBox.Yes) if result == QMessageBox.No: return progress = self.gui.getInfiniteProgressDialog() runnable = ProgressRunnable2(progress) runnable.setDialogMessage(u"Deleting file system") runnable.setRunMethod(self.manager.removeChRoot, projectName) runnable.finished.connect(self.refreshProject) runnable.caughtException.connect(self.gui.popupErrorCallback) runnable.runOnGlobalInstance() def on_projectSelected(self, _project): self.refreshProject() def refreshProject(self): """ Refresh the project, package and chroot views. """ project = self.currentProject self.__packageManager.setCurrentProject(project) self.updateProjectLabels() self.updateChrootPathAndButtons() @popupOnException def updateProjectLabels(self): ''' Update the different labels according to project parameters. ''' project = self.currentProject if project is not None: projectLink = self.manager.getProjectWebPage(project) projectObsName = self.manager.getProjectParameter( project, "projectObsName") target = self.manager.getProjectParameter(project, "projectTarget") obsRepoLink = self.manager.getProjectRepository(project) localRepoLink = self.manager.getLocalRepository(project) projectTitle = self.manager.getProjectParameter(project, "title") projectDescription = self.manager.getProjectParameter( project, "description") self.mainWindow.projectLabelValue.setText(project) self.mainWindow.projectTitleLabel.setText(projectTitle) self.mainWindow.projectDescriptionLabel.setText(projectDescription) self.mainWindow.projectPageLinkLabel.setText( u'<a href="%s">%s</a>' % (projectLink, projectObsName)) repoObsLink = u'<a href="%s">%s</a>' % (obsRepoLink, target) repoLocalLink = u'<a href="%s">%s</a>' % (localRepoLink, project) self.mainWindow.projectObsRepoPageLinkLabel.setText(repoObsLink) self.mainWindow.projectLocalRepoPageLinkLabel.setText( repoLocalLink) # self.mainWindow.saveObsProjectButton.setEnabled(True) # else: # self.mainWindow.saveObsProjectButton.setEnabled(False) @popupOnException def updateChrootPathAndButtons(self): ''' Update the chroot path displayed in the main window with the one of the currently selected project. Enable/disable some buttons according to the state of the chroot. ''' project = self.currentProject if project is not None: isChrootInit = self.manager.isChRootInit(project) if isChrootInit: chrootPath = self.manager.getChRootPath(project) self.mainWindow.chrootPathLineEdit.setText(chrootPath) self.mainWindow.newChrootButton.setEnabled(False) self.mainWindow.openChrootButton.setEnabled(True) else: self.mainWindow.newChrootButton.setEnabled(True) self.mainWindow.openChrootButton.setEnabled(False) self.mainWindow.chrootPathLineEdit.setText("") self.mainWindow.deleteChrootButton.setEnabled(isChrootInit)