add sliver_type column, sorting in mainscreen
[sface.git] / sface / sficreate.py
index b4db34a..adfba55 100644 (file)
@@ -9,6 +9,7 @@ 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):
@@ -23,12 +24,19 @@ class CreateWindow(QDialog):
         self.hrnEdit = QLineEdit()
         urlLabel = QLabel("Project URL:")
         self.urlEdit = QLineEdit()
-        descLabel = QLabel("Description")
+        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()
@@ -38,12 +46,33 @@ class CreateWindow(QDialog):
         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()
@@ -52,6 +81,8 @@ class CreateWindow(QDialog):
         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
@@ -64,6 +95,10 @@ class CreateWindow(QDialog):
             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)
@@ -71,23 +106,28 @@ class CreateWindow(QDialog):
 
         self.buttonBox.setEnabled(False)
 
+        researcherXml = "<researcher>" + "</researcher><researcher>".join(researchers) + "</researcher>"
+
         newSliceRecord = os.path.expanduser("~/.sfi/newslice.record")
-        file(newSliceRecord, "w").write('<record authority="%s" description="%s" hrn="%s" type="%s" url="%s"></record>' % (auth, desc, hrn, type, url))
+        file(newSliceRecord, "w").write('<record authority="%s" description="%s" hrn="%s" type="%s" url="%s">%s</record>' % (auth, desc, hrn, type, url, researcherXml))
         self.createProcess.addRecord(newSliceRecord)
 
+    def getAuthorityRecordFinished(self):
+        self.setStatus("<font color='green'>User list refreshed.</font>")
+        self.updateView()
+
     def setStatus(self, x):
         self.status.setText(x)
 
     def createFinished(self):
-        if self.createProcess.faults==[]:
-            # need to check for success/failure
+        faultString = self.createProcess.getFaultString()
+        if not faultString:
             self.setStatus("<font color='green'>Slice created.</font>")
             self.sliceWasCreated = True
             self.buttonBox.setEnabled(True)
             self.buttonBox.clear()
             self.buttonBox.addButton(QDialogButtonBox.Close)
         else:
-            faultString = self.createProcess.faults[0].get("faultString","")
             self.setStatus("<font color='red'>Slice creation failed: %s</font>" % (faultString))
             self.sliceWasCreated = False
             self.buttonBox.setEnabled(True)
@@ -98,3 +138,76 @@ class CreateWindow(QDialog):
     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)
+
+class RemoveWindow(QDialog):
+    def __init__(self, hrn, parent=None):
+        super(RemoveWindow, self).__init__(parent)
+        self.setWindowTitle("Remove Slice")
+
+        hrnLabel = QLabel("Slice HRN:")
+        self.hrnEdit = QLineEdit()
+        self.status = QLabel("")
+        self.status.setMaximumWidth(640)
+
+        if hrn:
+            self.hrnEdit.setText(hrn)
+
+        self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
+        self.buttonBox.button(QDialogButtonBox.Ok).setDefault(True)
+
+        layout = QVBoxLayout()
+        layout.addWidget(hrnLabel)
+        layout.addWidget(self.hrnEdit)
+        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()"))
+
+    def accept(self):
+        hrn = self.hrnEdit.text()
+
+        box = QMessageBox(parent=self)
+        box.setText("Confirm deletion of slice %s ?" % hrn)
+        box.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
+        ret = box.exec_()
+        if (ret != QMessageBox.Yes):
+            return
+
+        self.setStatus("Removing Slice...")
+
+        self.removeProcess = SfiProcess(self)
+        self.connect(self.removeProcess, SIGNAL('finished()'), self.removeFinished)
+
+        self.buttonBox.setEnabled(False)
+
+        self.removeProcess.removeRecord(hrn)
+
+    def setStatus(self, x):
+        self.status.setText(x)
+
+    def removeFinished(self):
+        faultString = self.removeProcess.getFaultString()
+        if not faultString:
+            self.setStatus("<font color='green'>Slice removed.</font>")
+            self.sliceWasCreated = True
+            self.buttonBox.setEnabled(True)
+            self.buttonBox.clear()
+            self.buttonBox.addButton(QDialogButtonBox.Close)
+        else:
+            self.setStatus("<font color='red'>Slice removal failed: %s</font>" % (faultString))
+            self.buttonBox.setEnabled(True)
+
+        self.disconnect(self.removeProcess, SIGNAL('finished()'), self.removeFinished)
+        self.removeProcess = None
+
+