Skip to content
Snippets Groups Projects
Commit ae60da81 authored by Collin A. Schmitz's avatar Collin A. Schmitz
Browse files

Implemented manage users tab. Parent storage for user dictionary added.

parent 7e4ffc76
No related branches found
No related tags found
No related merge requests found
...@@ -40,7 +40,7 @@ class AddExperimentTab(QWidget): ...@@ -40,7 +40,7 @@ class AddExperimentTab(QWidget):
grid.addItem(QSpacerItem(20, 1000, QSizePolicy.Minimum, QSizePolicy.Expanding), 3, 1, 5, 1) grid.addItem(QSpacerItem(20, 1000, QSizePolicy.Minimum, QSizePolicy.Expanding), 3, 1, 5, 1)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum), 3, 4) grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum), 3, 4)
self.detailBtn = QPushButton('Proposal Details', self) self.detailBtn = QPushButton('Show Details', self)
self.detailBtn.clicked.connect(self.toggleDetails) self.detailBtn.clicked.connect(self.toggleDetails)
self.detailBtn.setFixedSize(150, 100) self.detailBtn.setFixedSize(150, 100)
grid.addWidget(self.detailBtn, 3, 5) grid.addWidget(self.detailBtn, 3, 5)
...@@ -56,7 +56,7 @@ class AddExperimentTab(QWidget): ...@@ -56,7 +56,7 @@ class AddExperimentTab(QWidget):
grid.addItem(QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding), 6, 5) grid.addItem(QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding), 6, 5)
modBtn = QPushButton('Continue Manually', self) modBtn = QPushButton('Continue Manually', self)
modBtn.clicked.connect(lambda: self.setTab(0)) modBtn.clicked.connect(lambda: self.setTab(5))
modBtn.setFixedSize(150, 100) modBtn.setFixedSize(150, 100)
grid.addWidget(modBtn, 7, 5) grid.addWidget(modBtn, 7, 5)
...@@ -93,14 +93,17 @@ class AddExperimentTab(QWidget): ...@@ -93,14 +93,17 @@ class AddExperimentTab(QWidget):
table.resizeRowToContents(row) table.resizeRowToContents(row)
def startProposal(self): def startProposal(self):
row = self.tableWidget.currentRow() id = self.tableWidget.item(self.tableWidget.currentRow(), 0).data(Qt.UserRole)
name = self.tableWidget.item(row, 0).text() proposal = self.experimentPropApi.getBeamlineProposal(id)
print "Starting " + name self.parent.currentUsers = proposal
self.setTab(0) self.setTab(5)
# Resizes the horizontal headers to fit the screen # Resizes the horizontal headers to fit the screen
def resizeTable(self, width): def resizeTable(self, width):
totalWidths = sum(self.colWidths) try:
totalWidths = sum(self.colWidths)
except AttributeError:
return
if self.detailsTable.verticalScrollBar().isVisible(): if self.detailsTable.verticalScrollBar().isVisible():
newSize = [column * (width - 204) / totalWidths for column in self.colWidths] newSize = [column * (width - 204) / totalWidths for column in self.colWidths]
else: else:
...@@ -109,15 +112,15 @@ class AddExperimentTab(QWidget): ...@@ -109,15 +112,15 @@ class AddExperimentTab(QWidget):
self.detailsTable.horizontalHeader().resizeSection(i, column) self.detailsTable.horizontalHeader().resizeSection(i, column)
def toggleDetails(self): def toggleDetails(self):
if self.detailBtn.isChecked(): if self.detailBtn.text() == 'Hide Details':
self.tableWidget.show() self.tableWidget.show()
self.detailsTable.hide() self.detailsTable.hide()
self.detailBtn.setChecked(False) self.detailBtn.setText('Show Details')
else: else:
self.tableWidget.hide() self.tableWidget.hide()
self.proposalDetails() self.proposalDetails()
self.detailsTable.show() self.detailsTable.show()
self.detailBtn.setChecked(True) self.detailBtn.setText('Hide Details')
def proposalDetails(self): def proposalDetails(self):
id = self.tableWidget.item(self.tableWidget.currentRow(), 0).data(Qt.UserRole) id = self.tableWidget.item(self.tableWidget.currentRow(), 0).data(Qt.UserRole)
......
...@@ -15,6 +15,7 @@ from daqsTab import DaqsTab ...@@ -15,6 +15,7 @@ from daqsTab import DaqsTab
from uploadsTab import UploadsTab from uploadsTab import UploadsTab
from initialTab import InitialTab from initialTab import InitialTab
from addExperiment import AddExperimentTab from addExperiment import AddExperimentTab
from manageUsersTab import ManageUsersTab
class DmStationUi(QMainWindow): class DmStationUi(QMainWindow):
...@@ -25,6 +26,9 @@ class DmStationUi(QMainWindow): ...@@ -25,6 +26,9 @@ class DmStationUi(QMainWindow):
self.setWindowTitle('DM Station: %s' % self.stationName) self.setWindowTitle('DM Station: %s' % self.stationName)
self.setGeometry(0, 0, 800, 400) self.setGeometry(0, 0, 800, 400)
# Variable to hold the user instances
self.currentUsers = {} ####HOW DO I MAKE THIS AN INSTANCE OF A PROPOSAL WITH NO DATA
# Create a stacked layout to connect the various pages # Create a stacked layout to connect the various pages
self.stackedLayout = QStackedLayout() self.stackedLayout = QStackedLayout()
...@@ -36,6 +40,7 @@ class DmStationUi(QMainWindow): ...@@ -36,6 +40,7 @@ class DmStationUi(QMainWindow):
self.daqsTab = DaqsTab(self.stationName, self) self.daqsTab = DaqsTab(self.stationName, self)
self.uploadsTab = UploadsTab(self.stationName, self) self.uploadsTab = UploadsTab(self.stationName, self)
self.addExperimentTab = AddExperimentTab(self.stationName, self) self.addExperimentTab = AddExperimentTab(self.stationName, self)
self.manageUsersTab = ManageUsersTab(self.stationName, self)
# Add the windows to the stack. # Add the windows to the stack.
self.stackedLayout.addWidget(self.initialTab.initialTabWidget) self.stackedLayout.addWidget(self.initialTab.initialTabWidget)
...@@ -43,6 +48,7 @@ class DmStationUi(QMainWindow): ...@@ -43,6 +48,7 @@ class DmStationUi(QMainWindow):
self.stackedLayout.addWidget(self.daqsTab.daqsTabWidget) self.stackedLayout.addWidget(self.daqsTab.daqsTabWidget)
self.stackedLayout.addWidget(self.uploadsTab.uploadsTabWidget) self.stackedLayout.addWidget(self.uploadsTab.uploadsTabWidget)
self.stackedLayout.addWidget(self.addExperimentTab.addExperimentTabWidget) self.stackedLayout.addWidget(self.addExperimentTab.addExperimentTabWidget)
self.stackedLayout.addWidget(self.manageUsersTab.manageUsersTabWidget)
# Set a central widget to hold everything # Set a central widget to hold everything
self.centralWidget = QWidget() self.centralWidget = QWidget()
...@@ -82,6 +88,8 @@ class DmStationUi(QMainWindow): ...@@ -82,6 +88,8 @@ class DmStationUi(QMainWindow):
UploadsTab.resizeTable(self.uploadsTab, windowSize) UploadsTab.resizeTable(self.uploadsTab, windowSize)
elif currentIndex == 4: elif currentIndex == 4:
AddExperimentTab.resizeTable(self.addExperimentTab, windowSize) AddExperimentTab.resizeTable(self.addExperimentTab, windowSize)
elif currentIndex == 5:
ManageUsersTab.resizeTable(self.manageUsersTab, windowSize)
def currentChanged(self, index): def currentChanged(self, index):
newIndex = index newIndex = index
...@@ -91,6 +99,11 @@ class DmStationUi(QMainWindow): ...@@ -91,6 +99,11 @@ class DmStationUi(QMainWindow):
DaqsTab.resizeTable(self.daqsTab, self.geometry().width()) DaqsTab.resizeTable(self.daqsTab, self.geometry().width())
elif newIndex == 3: elif newIndex == 3:
UploadsTab.resizeTable(self.uploadsTab, self.geometry().width()) UploadsTab.resizeTable(self.uploadsTab, self.geometry().width())
elif newIndex == 4:
AddExperimentTab.resizeTable(self.addExperimentTab, self.geometry().width())
elif newIndex == 5:
ManageUsersTab.updateUsers(self.manageUsersTab)
ManageUsersTab.resizeTable(self.manageUsersTab, self.geometry().width())
def getTab(self): def getTab(self):
return self.stackedLayout.currentIndex() return self.stackedLayout.currentIndex()
......
...@@ -39,15 +39,17 @@ class ExperimentsTab(QWidget): ...@@ -39,15 +39,17 @@ class ExperimentsTab(QWidget):
addBtn = QPushButton('Add Experiment', self) addBtn = QPushButton('Add Experiment', self)
addBtn.clicked.connect(lambda: self.setTab(4)) addBtn.clicked.connect(lambda: self.setTab(4))
addBtn.setMinimumWidth(150) addBtn.setMinimumWidth(150)
addBtn.setFixedHeight(40)
grid.addWidget(addBtn, 4, 1) grid.addWidget(addBtn, 4, 1)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 2) grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 2)
modBtn = QPushButton('Modify Selected', self) modBtn = QPushButton('Modify Selected', self)
modBtn.clicked.connect(lambda: self.setTab(5)) modBtn.clicked.connect(lambda: self.setTab(5))
modBtn.setMinimumWidth(150) modBtn.setMinimumWidth(150)
modBtn.setFixedHeight(40)
grid.addWidget(modBtn, 4, 3) grid.addWidget(modBtn, 4, 3)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 4) grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 4)
grid.addItem(QSpacerItem(20, 40, QSizePolicy.Expanding), 5, 0) grid.addItem(QSpacerItem(20, 10, QSizePolicy.Expanding), 5, 0)
self.experimentsTabWidget = QWidget() self.experimentsTabWidget = QWidget()
self.experimentsTabWidget.setLayout(grid) self.experimentsTabWidget.setLayout(grid)
......
#!/usr/bin/env python #!/usr/bin/env python
from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWidget, \ from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWidget, \
QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView, QComboBox
from PyQt4.QtCore import Qt from PyQt4.QtCore import Qt
from dmApiFactory import DmApiFactory from dmApiFactory import DmApiFactory
...@@ -11,5 +11,172 @@ class ManageUsersTab(QWidget): ...@@ -11,5 +11,172 @@ class ManageUsersTab(QWidget):
super(ManageUsersTab, self).__init__(parent) super(ManageUsersTab, self).__init__(parent)
self.stationName = stationName self.stationName = stationName
self.parent = parent self.parent = parent
self.experimentDsApi = DmApiFactory.getInstance().getExperimentDsApi() self.experimentPropApi = DmApiFactory.getInstance().getBeamlineProposalApi()
self.experimentsTabLayout() self.userApi = DmApiFactory.getInstance().getUserDsApi()
\ No newline at end of file self.manageUsersTabLayout()
# Sets up the tab's layout, each block is a row
def manageUsersTabLayout(self):
grid = QGridLayout()
labelFont = QFont('Arial', 18, QFont.Bold)
lbl = QLabel(self.stationName + ' User Management', self)
lbl.setAlignment(Qt.AlignCenter)
lbl.setFont(labelFont)
grid.addWidget(lbl, 0, 0, 1, 7)
backBtn = QPushButton('Back', self)
backBtn.clicked.connect(lambda: self.setTab(1))
backBtn.setMinimumWidth(100)
grid.addWidget(backBtn, 1, 5, 1, 2, Qt.AlignCenter)
grid.addItem(QSpacerItem(750, 40, QSizePolicy.Expanding, QSizePolicy.Minimum), 2, 0)
grid.addItem(QSpacerItem(950, 40, QSizePolicy.Expanding, QSizePolicy.Minimum), 2, 2, 1, 5)
currentLabel = QLabel('Current Users', self)
currentLabel.setAlignment(Qt.AlignCenter)
grid.addWidget(currentLabel, 3, 0)
self.userDropdown = QComboBox(self)
self.userDropdown.setMaximumWidth(400)
self.updateDropdown()
grid.addWidget(self.userDropdown, 3, 2, 1, 5, Qt.AlignCenter)
self.currentUserTable = QTableWidget()
self.availableUserTable = QTableWidget()
grid.addWidget(self.currentUserTable, 4, 0, 1, 1)
moveUserBtn = QPushButton('<->', self)
moveUserBtn.setFixedSize(40, 40)
moveUserBtn.clicked.connect(self.moveUsers)
grid.addWidget(moveUserBtn, 4, 1)
grid.addWidget(self.availableUserTable, 4, 2, 1, 5)
grid.addItem(QSpacerItem(20, 1000, QSizePolicy.Minimum, QSizePolicy.Expanding), 4, 3, 1, 1)
startDaqBtn = QPushButton('Start DAQ', self)
startDaqBtn.clicked.connect(lambda: self.setTab(0))
startDaqBtn.setMinimumWidth(150)
startDaqBtn.setMaximumWidth(200)
startDaqBtn.setFixedHeight(40)
grid.addWidget(startDaqBtn, 5, 0, Qt.AlignCenter)
startUploadBtn = QPushButton('Start Upload', self)
startUploadBtn.clicked.connect(lambda: self.setTab(0))
startUploadBtn.setMinimumWidth(150)
startUploadBtn.setMaximumWidth(200)
startUploadBtn.setFixedHeight(40)
grid.addWidget(startUploadBtn, 5, 2, 1, 5, Qt.AlignCenter)
grid.addItem(QSpacerItem(20, 10, QSizePolicy.Expanding, QSizePolicy.Minimum), 6, 0)
self.manageUsersTabWidget = QWidget()
self.manageUsersTabWidget.setLayout(grid)
def updateDropdown(self):
self.proposalList = self.experimentPropApi.listBeamlineProposals()
self.userDropdown.addItem('All Users', -1)
for proposal in self.proposalList:
self.userDropdown.addItem(proposal['title'], proposal['id'])
# Resizes the horizontal headers to fit the screen
def resizeTable(self, width):
totalWidths = sum(self.colWidths)
if self.availableUserTable.verticalScrollBar().isVisible():
newSize = [column * (width - 490) / totalWidths for column in self.colWidths]
else:
newSize = [column * (width - 480) / totalWidths for column in self.colWidths]
for i, column in enumerate(newSize):
self.availableUserTable.horizontalHeader().resizeSection(i, column)
if self.currentUserTable.verticalScrollBar().isVisible():
newSize = [column * (width - 490) / totalWidths for column in self.colWidths]
else:
newSize = [column * (width - 480) / totalWidths for column in self.colWidths]
for i, column in enumerate(newSize):
self.currentUserTable.horizontalHeader().resizeSection(i, column)
# Used to change between tabs
def setTab(self, tab):
self.parent.stackedLayout.setCurrentIndex(tab)
# Expands the given row to fit the size of its content
def expandRow(self, row, column, table):
table.resizeRowToContents(row)
def updateUsers(self):
# Setup the available users table
id = self.userDropdown.itemData(self.userDropdown.currentIndex(), Qt.UserRole)
if id != -1:
proposal = self.experimentPropApi.getBeamlineProposal(id)
self.availableUserTable.setRowCount(len(proposal['experimenters']))
allUsers = proposal['experimenters']
else:
allUsers = self.userApi.getUsers()
self.availableUserTable.setRowCount(len(allUsers))
self.availableUserTable.setColumnCount(4)
self.colWidths = (70, 70, 70, 125)
for i, size in enumerate(self.colWidths):
self.availableUserTable.horizontalHeader().resizeSection(i, size)
self.availableUserTable.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.availableUserTable.setHorizontalHeaderLabels('Badge;First Name;Last Name;Email;'.split(';'))
self.availableUserTable.cellDoubleClicked.connect(lambda row, column: self.expandRow(row, column, self.availableUserTable))
i = 0
currentIDs = [x['id'] for x in self.parent.currentUsers['experimenters']]
for experimenter in allUsers:
if experimenter['id'] in currentIDs:
self.availableUserTable.removeRow(i)
continue
try:
rowBadge = QTableWidgetItem(experimenter['badge'])
except KeyError:
continue
rowFirstName = QTableWidgetItem(experimenter['firstName'])
rowLastName = QTableWidgetItem(experimenter['lastName'])
try:
rowEmail = QTableWidgetItem(experimenter['email'])
except KeyError:
rowEmail = QTableWidgetItem('')
self.availableUserTable.setItem(i, 0, rowBadge)
self.availableUserTable.setItem(i, 1, rowFirstName)
self.availableUserTable.setItem(i, 2, rowLastName)
self.availableUserTable.setItem(i, 3, rowEmail)
if (i % 2) == 0:
rowBadge.setBackground(QColor.fromRgb(230, 241, 245))
rowFirstName.setBackground(QColor.fromRgb(230, 241, 245))
rowLastName.setBackground(QColor.fromRgb(230, 241, 245))
rowEmail.setBackground(QColor.fromRgb(230, 241, 245))
i += 1
# Set up the current users table
self.currentUserTable.setRowCount(len(self.parent.currentUsers['experimenters']))
self.currentUserTable.setColumnCount(4)
for i, size in enumerate(self.colWidths):
self.currentUserTable.horizontalHeader().resizeSection(i, size)
self.currentUserTable.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.currentUserTable.setHorizontalHeaderLabels('Badge;First Name;Last Name;Email;'.split(';'))
self.currentUserTable.cellDoubleClicked.connect(lambda row, column: self.expandRow(row, column, self.currentUserTable))
i = 0
for experimenter in self.parent.currentUsers['experimenters']:
rowBadge = QTableWidgetItem(experimenter['badge'])
rowFirstName = QTableWidgetItem(experimenter['firstName'])
rowLastName = QTableWidgetItem(experimenter['lastName'])
try:
rowEmail = QTableWidgetItem(experimenter['email'])
except KeyError:
rowEmail = QTableWidgetItem('')
self.currentUserTable.setItem(i, 0, rowBadge)
self.currentUserTable.setItem(i, 1, rowFirstName)
self.currentUserTable.setItem(i, 2, rowLastName)
self.currentUserTable.setItem(i, 3, rowEmail)
if (i % 2) == 0:
rowBadge.setBackground(QColor.fromRgb(230, 241, 245))
rowFirstName.setBackground(QColor.fromRgb(230, 241, 245))
rowLastName.setBackground(QColor.fromRgb(230, 241, 245))
rowEmail.setBackground(QColor.fromRgb(230, 241, 245))
i += 1
def moveUsers(self):
temp = self.availableUserTable.selectedItems()[0].row()
temp2 = self.availableUserTable.item(temp, 0)
selectedAvailable = [x.row(0).text() for x in self.availableUserTable.selectedItems()]
currentAvailable = self.currentUserTable.item(self.currentUserTable.currentRow(), 0)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment