X-Git-Url: http://git.onelab.eu/?p=sface.git;a=blobdiff_plain;f=sface%2Fsliceview.py;h=2914c0422c49b959b7c745a1b034aaa41e04dbaf;hp=92dd844b3cb53bfe6ce109f2e49b534db5df88fc;hb=5a487f5551aff6228d7615a85ff4c84a54d98e85;hpb=1123a48de43e859c145f1489257b92ad79323e14 diff --git a/sface/sliceview.py b/sface/sliceview.py index 92dd844..2914c04 100644 --- a/sface/sliceview.py +++ b/sface/sliceview.py @@ -4,8 +4,9 @@ import pickle from PyQt4.QtCore import * from PyQt4.QtGui import * -from sfa.util.record import SfaRecord, SliceRecord, AuthorityRecord from sface.config import config +from sface.sfidata import SfiData +from sface.sfiprocess import SfiProcess NAME_COLUMN = 0 MEMBERSHIP_STATUS_COLUMN = 1 @@ -13,6 +14,10 @@ MEMBERSHIP_STATUS_COLUMN = 1 # maximum length of a name to display before clipping NAME_MAX_LEN = 48 +MODE_AUTHORITY_SLICES = 0x01 +MODE_USER_SLICES = 0x02 +MODE_SELECT_SINGLE = 0x10 + slice_status = { "in": "Selected", "out": "Not Selected"} @@ -70,8 +75,9 @@ class SliceNameDelegate(QStyledItemDelegate): painter.restore() class SliceView(QTableView): - def __init__(self, parent=None): + def __init__(self, mode=0, parent=None): QTableView.__init__(self, parent) + self.mode = mode self.setSelectionBehavior(QAbstractItemView.SelectRows) self.setSelectionMode(QAbstractItemView.SingleSelection) @@ -88,9 +94,26 @@ class SliceView(QTableView): else: QTableView.keyPressEvent(self, event) + def selectionChanged(self, selected, deselected): + QTableView.selectionChanged(self, selected, deselected) + if (self.mode & MODE_SELECT_SINGLE) != 0: + self.unselectAll() + self.toggleSelection() + def mouseDoubleClickEvent(self, event): self.toggleSelection() + def unselectAll(self): + index = self.currentIndex() + model = index.model() + for row in range(0, model.rowCount()): + status_index = model.index(row, MEMBERSHIP_STATUS_COLUMN, index.parent()) + model.setData(status_index, QString(slice_status['out'])) + + #model.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"), + # model.index(0, MEMBERSHIP_STATUS_COLUMN, index.parent()), + # model.index(model.rowCount(), MEMBERSHIP_STATUS_COLUMN, index.parent())) + def toggleSelection(self): index = self.currentIndex() model = index.model() @@ -112,22 +135,17 @@ class SliceView(QTableView): node_data = node_index.data().toString() class SliceModel(QStandardItemModel): - def __init__(self, rows=0, columns=4, parent=None): + def __init__(self, rows=0, columns=4, parent=None, mode=MODE_AUTHORITY_SLICES): QStandardItemModel.__init__(self, rows, columns, parent) + self.mode = mode def updateModel(self): self.clear() - slice_names = [] - - i=0 - while (os.path.exists(config.getAuthorityListFile(i))): - rec = self.readSliceRecord(i) - if rec: - name = str(rec.get_name()) - if (rec.get_type() == "slice"): - slice_names.append(name) - i=i+1 + if (self.mode & MODE_AUTHORITY_SLICES) != 0: + slice_names = SfiData().getAuthorityHrns(type="slice") + else: # MODE_USER_SLICES + slice_names = SfiData().getUserSliceHrns() rootItem = self.invisibleRootItem() @@ -156,12 +174,88 @@ class SliceModel(QStandardItemModel): return slices - def readSliceRecord(self, i): - rec_file = config.getAuthorityListFile(i) - if os.path.exists(rec_file): - xml = open(rec_file).read() - rec = SliceRecord() - rec.load_from_string(xml) - return rec - return None +class SlicePickerWindow(QDialog): + def __init__(self, mode=MODE_AUTHORITY_SLICES, parent=None): + super(SlicePickerWindow, self).__init__(parent) + self.mode = mode + self.slices = None + + self.setWindowTitle("Slice Picker") + + sliceLabel = QLabel("Slices:") + self.sliceView = SliceView(mode=self.mode) + + self.status = QLabel("") + self.status.setMaximumWidth(640) + + self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + self.buttonBox.button(QDialogButtonBox.Ok).setDefault(True) + + layout = QVBoxLayout() + layout.addWidget(sliceLabel) + layout.addWidget(self.sliceView) + layout.addWidget(self.status) + layout.addWidget(self.buttonBox) + self.setLayout(layout) + + self.connect(self.buttonBox, SIGNAL("accepted()"), self, SLOT("accept()")) + self.connect(self.buttonBox, SIGNAL("rejected()"), self, SLOT("reject()")) + + self.sliceModel = SliceModel(mode=mode) + + self.refresh() + + def accept(self): + self.slices = self.sliceModel.getSelectedSlices() + print self.slices + QDialog.accept(self) + + def setStatus(self, x): + self.status.setText(x) + + def refresh(self): + if (self.mode & MODE_AUTHORITY_SLICES) != 0: + self.refreshAuthority() + else: + self.refreshUser() + + def refreshUser(self): + self.process = SfiProcess(self) + self.connect(self.process, SIGNAL('finished()'), self.getUserRecordFinished) + + self.process.getRecord(hrn=config.getUser(), type="user", filename=config.getUserRecordFile()) + self.setStatus("Refreshing user record. This will take a moment...") + + def getUserRecordFinished(self): + self.disconnect(self.process, SIGNAL('finished()'), self.getUserRecordFinished) + + faultString = self.process.getFaultString() + if not faultString: + self.setStatus("Slice list refreshed.") + self.updateSliceView() + else: + self.setStatus("User rec refresh error: %s" % (faultString)) + + def refreshAuthority(self): + self.process = SfiProcess(self) + self.connect(self.process, SIGNAL('finished()'), self.getAuthorityRecordFinished) + + self.process.listRecords(config.getAuthority(), None) + self.setStatus("Refreshing slice list. This will take a moment...") + + def getAuthorityRecordFinished(self): + self.disconnect(self.process, SIGNAL('finished()'), self.getAuthorityRecordFinished) + + faultString = self.process.getFaultString() + if not faultString: + self.setStatus("Slice list refreshed.") + self.updateSliceView() + else: + self.setStatus("Authority rec refresh error: %s" % (faultString)) + + def updateSliceView(self): + self.sliceModel.updateModel() + + self.sliceView.setModel(self.sliceModel) + self.sliceView.resizeColumnToContents(0)