8 from PyQt4.QtCore import *
9 from PyQt4.QtGui import *
10 from sface.config import config
11 from sface.sfiprocess import SfiProcess
12 from sface.screens.userscreen import UserView, UserModel
14 class CreateWindow(QDialog):
15 def __init__(self, parent=None):
16 super(CreateWindow, self).__init__(parent)
17 self.setWindowTitle("Create new Slice")
19 self.renewProcess = None
21 self.sliceWasCreated = False
23 hrnLabel = QLabel("Slice HRN:")
24 self.hrnEdit = QLineEdit()
25 urlLabel = QLabel("Project URL:")
26 self.urlEdit = QLineEdit()
27 descLabel = QLabel("Description:")
28 self.descEdit = QTextEdit()
29 self.descEdit.setMinimumWidth(400)
30 self.descEdit.setMaximumHeight(100)
32 self.userLabel = QLabel("Researchers:")
33 self.userView = UserView()
35 self.status = QLabel("")
36 self.status.setMaximumWidth(640)
38 self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
39 self.buttonBox.addButton("refresh", QDialogButtonBox.ActionRole)
40 self.buttonBox.button(QDialogButtonBox.Ok).setDefault(True)
42 layout = QVBoxLayout()
43 layout.addWidget(hrnLabel)
44 layout.addWidget(self.hrnEdit)
45 layout.addWidget(urlLabel)
46 layout.addWidget(self.urlEdit)
47 layout.addWidget(descLabel)
48 layout.addWidget(self.descEdit)
49 layout.addWidget(self.userLabel)
50 layout.addWidget(self.userView)
51 layout.addWidget(self.status)
52 layout.addWidget(self.buttonBox)
53 self.setLayout(layout)
55 self.userModel = UserModel(parent=self)
57 self.connect(self.buttonBox, SIGNAL("accepted()"), self, SLOT("accept()"))
58 self.connect(self.buttonBox, SIGNAL("rejected()"), self, SLOT("reject()"))
59 self.connect(self.buttonBox, SIGNAL("clicked(QAbstractButton *)"), self.clicked)
63 if (self.userModel.rowCount() == 0):
64 self.refreshAuthority()
66 def clicked(self, button):
67 if button.text() == "refresh":
68 self.refreshAuthority()
70 def refreshAuthority(self):
71 self.refreshProcess = SfiProcess(self)
72 self.connect(self.refreshProcess, SIGNAL('finished()'), self.getAuthorityRecordFinished)
74 self.refreshProcess.listRecords(config.getAuthority(), "user", config.getAuthorityListFile())
75 self.setStatus("Refreshing user list...")
78 auth = config.getAuthority()
79 desc = str(self.descEdit.toPlainText())
80 hrn = str(self.hrnEdit.text())
82 url = str(self.urlEdit.text())
84 researchers = self.userModel.getResearchers()
86 if not hrn.startswith(auth):
87 QMessageBox.warning(self, "Invalid HRN", "HRN must be within your current authority (%s)" % auth)
90 if not (url.startswith("http://") or url.startswith("https://")):
91 QMessageBox.warning(self, "Invalid URL", "URL must start with http:// or https://")
95 QMessageBox.warning(self, "Invalid Description", "Description is too short")
99 QMessageBox.warning(self, "Invalid Researchers", "Please add at least one researcher by double-clicking on a researcher name")
102 self.setStatus("Registering Slice...")
104 self.createProcess = SfiProcess(self)
105 self.connect(self.createProcess, SIGNAL('finished()'), self.createFinished)
107 self.buttonBox.setEnabled(False)
109 researcherXml = "<researcher>" + "</researcher><researcher>".join(researchers) + "</researcher>"
111 newSliceRecord = os.path.expanduser("~/.sfi/newslice.record")
112 file(newSliceRecord, "w").write('<record authority="%s" description="%s" hrn="%s" type="%s" url="%s">%s</record>' % (auth, desc, hrn, type, url, researcherXml))
113 self.createProcess.addRecord(newSliceRecord)
115 def getAuthorityRecordFinished(self):
116 self.setStatus("<font color='green'>User list refreshed.</font>")
119 def setStatus(self, x):
120 self.status.setText(x)
122 def createFinished(self):
123 faultString = self.createProcess.getFaultString()
125 self.setStatus("<font color='green'>Slice created.</font>")
126 self.sliceWasCreated = True
127 self.buttonBox.setEnabled(True)
128 self.buttonBox.clear()
129 self.buttonBox.addButton(QDialogButtonBox.Close)
131 self.setStatus("<font color='red'>Slice creation failed: %s</font>" % (faultString))
132 self.sliceWasCreated = False
133 self.buttonBox.setEnabled(True)
135 self.disconnect(self.createProcess, SIGNAL('finished()'), self.createFinished)
136 self.createProcess = None
139 return self.hrnEdit.text()
141 def updateView(self):
142 self.userModel.updateModel(None)
144 self.userView.setModel(self.userModel)
145 self.userView.hideUnusableColumns()
146 self.userView.resizeColumnToContents(0)