From: smbaker Date: Mon, 12 Sep 2011 23:49:51 +0000 (-0700) Subject: refactor userscreen for easier re-use X-Git-Tag: sface-0.1-19~9 X-Git-Url: http://git.onelab.eu/?p=sface.git;a=commitdiff_plain;h=908ac46c4760618de030e0cad35479acc06dd22a refactor userscreen for easier re-use --- diff --git a/sface/screens/userscreen.py b/sface/screens/userscreen.py index 9adf116..9eb2e6c 100644 --- a/sface/screens/userscreen.py +++ b/sface/screens/userscreen.py @@ -59,6 +59,81 @@ class UserView(QTableView): node_data = node_index.data().toString() self.emit(SIGNAL('hostnameClicked(QString)'), node_data) +class UserModel(QStandardItemModel): + def __init__(self, rows=0, columns=4, parent=None): + QStandardItemModel.__init__(self, rows, columns, parent) + + def updateModel(self, sliceRec): + self.clear() + + added_persons = [] + slice_persons = [] + + if sliceRec: + #for pi in sliceRec.get_field("PI", default=[]): + # name = str(pi) + # if not name in added_persons: + # slice_persons.append({"name": name, "role": "PI", "member": user_status["in"]}) + # added_persons.append(name) + + for researcher in sliceRec.get_field("researcher", default=[]): + name = str(researcher) + if not name in added_persons: + slice_persons.append({"name": name, "role": "researcher", "member": user_status["in"]}) + added_persons.append(name) + + i=1 + while (os.path.exists(config.getAuthorityListFile(i))): + rec = self.readUserRecord(i) + if rec: + name = str(rec.get_name()) + if not name in added_persons: + slice_persons.append({"name": name, "role": "", "member": user_status["out"]}) + added_persons.append(name) + i=i+1 + + rootItem = self.invisibleRootItem() + + for person in slice_persons: + rootItem.appendRow([QStandardItem(QString(person["name"])), + #QStandardItem(QString(person["role"])), + QStandardItem(QString(person["member"])), + QStandardItem(QString(person["member"]))]) + + headers = QStringList() << "User Name" << "Status" << "ServerStatus" + self.setHorizontalHeaderLabels(headers) + + def updateRecord(self, slicerec): + change = False + + item = self.invisibleRootItem() + children = item.rowCount() + for row in range(0, children): + childName = str(item.child(row, NAME_COLUMN).data(Qt.DisplayRole).toString()) + childStatus = str(item.child(row, MEMBERSHIP_STATUS_COLUMN).data(Qt.DisplayRole).toString()) + + if (childStatus == user_status['add']): + researcher = slicerec.get_field("researcher", []) + researcher.append(childName) + slicerec["researcher"] = researcher + change = True + elif (childStatus == user_status['remove']): + if childName in slicerec.get_field("PI"): + slicerec.get_field("PI").remove(childName) + if childName in slicerec.get_field("researcher"): + slicerec.get_field("researcher").remove(childName) + change = True + + return change + + def readUserRecord(self, i): + rec_file = config.getAuthorityListFile(i) + if os.path.exists(rec_file): + xml = open(rec_file).read() + rec = UserRecord() + rec.load_from_string(xml) + return rec + return None class UsersWidget(QWidget): def __init__(self, parent): @@ -81,8 +156,6 @@ class UsersWidget(QWidget): toplayout.addWidget(searchbox, 0, Qt.AlignRight) self.userView = UserView() - #self.userView.setSelectionBehavior(QAbstractItemView.SelectRows) - #self.userView.setSelectionMode(QAbstractItemView.SingleSelection) refresh = QPushButton("Refresh", self) refresh.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) @@ -101,7 +174,7 @@ class UsersWidget(QWidget): self.setLayout(layout) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - self.userModel = QStandardItemModel(0, 4, self) + self.userModel = UserModel(parent=self) self.connect(refresh, SIGNAL('clicked()'), self.refresh) self.connect(submit, SIGNAL('clicked()'), self.submit) @@ -139,15 +212,6 @@ class UsersWidget(QWidget): return rec return None - def readUserRecord(self, i): - rec_file = config.getAuthorityListFile(i) - if os.path.exists(rec_file): - xml = open(rec_file).read() - rec = UserRecord() - rec.load_from_string(xml) - return rec - return None - def setStatus(self, msg, timeout=None): self.parent().setStatus(msg, timeout) @@ -162,7 +226,7 @@ class UsersWidget(QWidget): return rec = self.readSliceRecord() - change = self.process_table(rec) + change = self.userModel.updateRecord(rec) if not change: self.setStatus("No change in slice data. Not submitting!", timeout=3000) @@ -199,61 +263,15 @@ class UsersWidget(QWidget): self.process.listRecords(config.getAuthority(), "user", config.getAuthorityListFile()) self.setStatus("Refreshing user records. This will take some time...") - def addTableItem(self, table, row, col, val, data=None, readonly=True): - item = QTableWidgetItem(str(val)) - if readonly: - item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) - if data: - if not isinstance(data, str): - data = pickle.dumps(data) - item.setData(Qt.UserRole, QVariant(data)) - table.setItem(row, col, item) - - def updateModel(self): - self.userModel.clear() - + def updateView(self): sliceRec = self.readSliceRecord() - if not sliceRec: - return None - - added_persons = [] - slice_persons = [] - - #for pi in sliceRec.get_field("PI", default=[]): - # name = str(pi) - # if not name in added_persons: - # slice_persons.append({"name": name, "role": "PI", "member": user_status["in"]}) - # added_persons.append(name) - for researcher in sliceRec.get_field("researcher", default=[]): - name = str(researcher) - if not name in added_persons: - slice_persons.append({"name": name, "role": "researcher", "member": user_status["in"]}) - added_persons.append(name) - - i=1 - while (os.path.exists(config.getAuthorityListFile(i))): - rec = self.readUserRecord(i) - if rec: - name = str(rec.get_name()) - if not name in added_persons: - slice_persons.append({"name": name, "role": "", "member": user_status["out"]}) - added_persons.append(name) - i=i+1 - - rootItem = self.userModel.invisibleRootItem() - - for person in slice_persons: - rootItem.appendRow([QStandardItem(QString(person["name"])), - #QStandardItem(QString(person["role"])), - QStandardItem(QString(person["member"])), - QStandardItem(QString(person["member"]))]) - - headers = QStringList() << "User Name" << "Status" << "ServerStatus" - self.userModel.setHorizontalHeaderLabels(headers) - - def updateView(self): - self.updateModel() + if not sliceRec: + # wait until we've resolved the slicerecord before displaying + # anything to the user. + self.userModel.clear() + else: + self.userModel.updateModel(sliceRec) self.userView.setModel(self.userModel) self.userView.hideColumn(SERVER_MEMBERSHIP_STATUS_COLUMN) @@ -262,31 +280,7 @@ class UsersWidget(QWidget): def updateSliceName(self): self.slicename.setText("Slice : %s" % (config.getSlice() or "None")) - def nodeSelectionChanged(self, hostname): - self.parent().nodeSelectionChanged(hostname) - - def process_table(self, slicerec): - change = False - - item = self.userModel.invisibleRootItem() - children = item.rowCount() - for row in range(0, children): - childName = str(item.child(row, NAME_COLUMN).data(Qt.DisplayRole).toString()) - childStatus = str(item.child(row, MEMBERSHIP_STATUS_COLUMN).data(Qt.DisplayRole).toString()) - - if (childStatus == user_status['add']): - researcher = slicerec.get_field("researcher", []) - researcher.append(childName) - slicerec["researcher"] = researcher - change = True - elif (childStatus == user_status['remove']): - if childName in slicerec.get_field("PI"): - slicerec.get_field("PI").remove(childName) - if childName in slicerec.get_field("researcher"): - slicerec.get_field("researcher").remove(childName) - change = True - return change class UserScreen(SfaScreen):