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.status.setMaximumWidth(640)
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)