import calendar import datetime import os import re import sys import time from PyQt4.QtCore import * from PyQt4.QtGui import * from sface.config import config from sface.sfiprocess import SfiProcess from sface.screens.userscreen import UserView, UserModel class CreateWindow(QDialog): def __init__(self, parent=None): super(CreateWindow, self).__init__(parent) self.setWindowTitle("Create new Slice") self.renewProcess = None self.sliceWasCreated = False hrnLabel = QLabel("Slice HRN:") self.hrnEdit = QLineEdit() urlLabel = QLabel("Project URL:") self.urlEdit = QLineEdit() descLabel = QLabel("Description:") self.descEdit = QTextEdit() self.descEdit.setMinimumWidth(400) self.descEdit.setMaximumHeight(100) self.userLabel = QLabel("Researchers:") self.userView = UserView() self.status = QLabel("") self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.buttonBox.addButton("refresh", QDialogButtonBox.ActionRole) self.buttonBox.button(QDialogButtonBox.Ok).setDefault(True) layout = QVBoxLayout() layout.addWidget(hrnLabel) layout.addWidget(self.hrnEdit) layout.addWidget(urlLabel) layout.addWidget(self.urlEdit) layout.addWidget(descLabel) layout.addWidget(self.descEdit) layout.addWidget(self.userLabel) layout.addWidget(self.userView) layout.addWidget(self.status) layout.addWidget(self.buttonBox) self.setLayout(layout) self.userModel = UserModel(parent=self) self.connect(self.buttonBox, SIGNAL("accepted()"), self, SLOT("accept()")) self.connect(self.buttonBox, SIGNAL("rejected()"), self, SLOT("reject()")) self.connect(self.buttonBox, SIGNAL("clicked(QAbstractButton *)"), self.clicked) self.updateView() if (self.userModel.rowCount() == 0): self.refreshAuthority() def clicked(self, button): if button.text() == "refresh": self.refreshAuthority() def refreshAuthority(self): self.refreshProcess = SfiProcess(self) self.connect(self.refreshProcess, SIGNAL('finished()'), self.getAuthorityRecordFinished) self.refreshProcess.listRecords(config.getAuthority(), "user", config.getAuthorityListFile()) self.setStatus("Refreshing user list...") def accept(self): auth = config.getAuthority() desc = str(self.descEdit.toPlainText()) hrn = str(self.hrnEdit.text()) type = "slice" url = str(self.urlEdit.text()) researchers = self.userModel.getResearchers() if not hrn.startswith(auth): QMessageBox.warning(self, "Invalid HRN", "HRN must be within your current authority (%s)" % auth) return if not (url.startswith("http://") or url.startswith("https://")): QMessageBox.warning(self, "Invalid URL", "URL must start with http:// or https://") return if not desc: QMessageBox.warning(self, "Invalid Description", "Description is too short") return if not researchers: QMessageBox.warning(self, "Invalid Researchers", "Please add at least one researcher by double-clicking on a researcher name") return self.setStatus("Registering Slice...") self.createProcess = SfiProcess(self) self.connect(self.createProcess, SIGNAL('finished()'), self.createFinished) self.buttonBox.setEnabled(False) researcherXml = "" + "".join(researchers) + "" newSliceRecord = os.path.expanduser("~/.sfi/newslice.record") file(newSliceRecord, "w").write('%s' % (auth, desc, hrn, type, url, researcherXml)) self.createProcess.addRecord(newSliceRecord) def getAuthorityRecordFinished(self): self.setStatus("User list refreshed.") self.updateView() def setStatus(self, x): self.status.setText(x) def createFinished(self): faultString = self.createProcess.getFaultString() if not faultString: self.setStatus("Slice created.") self.sliceWasCreated = True self.buttonBox.setEnabled(True) self.buttonBox.clear() self.buttonBox.addButton(QDialogButtonBox.Close) else: self.setStatus("Slice creation failed: %s" % (faultString)) self.sliceWasCreated = False self.buttonBox.setEnabled(True) self.disconnect(self.createProcess, SIGNAL('finished()'), self.createFinished) self.createProcess = None def getHrn(self): return self.hrnEdit.text() def updateView(self): self.userModel.updateModel(None) self.userView.setModel(self.userModel) self.userView.hideUnusableColumns() self.userView.resizeColumnToContents(0)