Newer
Older
Collin A. Schmitz
committed
#!/usr/bin/env python
from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWidget, \
QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView, QComboBox, QVBoxLayout
Collin A. Schmitz
committed
from PyQt4.QtCore import Qt
from dmApiFactory import DmApiFactory
from objects.userInfo import UserInfo
Collin A. Schmitz
committed
# Define the experiments tab content:
class ManageUsersTab(QWidget):
def __init__(self, stationName, parent, id=-1):
super(ManageUsersTab, self).__init__(parent)
self.stationName = stationName
self.parent = parent
self.experimentPropApi = DmApiFactory.getInstance().getBeamlineProposalApi()
self.userApi = DmApiFactory.getInstance().getUserDsApi()
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, 4)
backBtn = QPushButton('Back', self)
backBtn.clicked.connect(lambda: self.setTab(1))
backBtn.setMinimumWidth(100)
grid.addWidget(backBtn, 1, 2, Qt.AlignRight)
#grid.addItem(QSpacerItem(750, 40, QSizePolicy.Maximum, QSizePolicy.Minimum), 2, 0)
#grid.addItem(QSpacerItem(750, 40, QSizePolicy.Maximum, 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()
self.currentUserTable = QTableWidget()
self.availableUserTable = QTableWidget()
moveUserBtn = QPushButton('<->', self)
moveUserBtn.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)
#moveUserBtn.clicked.connect(self.moveUsers)
#grid.addWidget(moveUserBtn, 4, 1)
#grid.addWidget(self.availableUserTable, 4, 2, 1, 2)
#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)
vColumn1 = QVBoxLayout()
vColumn1.addWidget(currentLabel)
vColumn1.addWidget(self.currentUserTable)
vColumn1.addWidget(startDaqBtn)
vColumn1.setAlignment(startDaqBtn, Qt.AlignCenter)
grid.addLayout(vColumn1, 2, 0)
vColumn2 = QVBoxLayout()
vColumn2.addWidget(moveUserBtn)
grid.addLayout(vColumn2, 2, 1)
vColumn3 = QVBoxLayout()
vColumn3.addWidget(self.userDropdown, Qt.AlignCenter)
vColumn3.addWidget(self.availableUserTable)
vColumn3.addWidget(startUploadBtn)
vColumn3.setAlignment(startUploadBtn, Qt.AlignCenter)
grid.addLayout(vColumn3, 2, 2)
self.manageUsersTabWidget = QWidget()
self.manageUsersTabWidget.setLayout(grid)
# Populates the dropdown with available proposals
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 - 470) / totalWidths for column in self.colWidths]
#for i, column in enumerate(newSize):
# self.availableUserTable.horizontalHeader().resizeSection(i, column)
#print 4
#if self.currentUserTable.verticalScrollBar().isVisible():
# newSize = [column * (width - 470) / totalWidths for column in self.colWidths]
#else:
# newSize = [column * (width - 489) / 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)
# Populates both user tables with their corresponding users
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(min(len(proposal['experimenters'] + 1, 101)))
allUsers = proposal['experimenters']
else:
allUsers = self.userApi.getUsers()
self.availableUserTable.setRowCount(len(allUsers))
objectAllUsers = []
for x in allUsers:
try:
objectAllUsers.append(UserInfo(x['badge'], x['firstName'], x['id'], x['lastName'], x['email']))
except KeyError, key:
if key.message == 'badge':
continue
else:
objectAllUsers.append(UserInfo(x['badge'], x['firstName'], x['id'], x['lastName'], ''))
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;Last;Email;'.split(';'))
self.availableUserTable.cellDoubleClicked.connect(lambda row, column: self.expandRow(row, column, self.availableUserTable))
i = 0
currentIDs = [x.getID() for x in self.parent.currentUsers]
for experimenter in objectAllUsers:
if experimenter.getID() in currentIDs:
self.availableUserTable.removeRow(i)
continue
rowBadge = QTableWidgetItem(experimenter.getBadge())
if rowBadge is None:
continue
rowBadge.setData(Qt.UserRole, experimenter.getID())
rowFirstName = QTableWidgetItem(experimenter.getFirstName())
rowLastName = QTableWidgetItem(experimenter.getLastName())
rowEmail = QTableWidgetItem(experimenter.getEmail())
if rowEmail is None:
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))
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;Last;Email;'.split(';'))
self.currentUserTable.cellDoubleClicked.connect(lambda row, column: self.expandRow(row, column, self.currentUserTable))
i = 0
for experimenter in self.parent.currentUsers:
rowBadge = QTableWidgetItem(experimenter.getBadge())
rowBadge.setData(Qt.UserRole, experimenter.getID())
rowFirstName = QTableWidgetItem(experimenter.getFirstName())
rowLastName = QTableWidgetItem(experimenter.getLastName())
try:
rowEmail = QTableWidgetItem(experimenter.getEmail())
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
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
self.currentUserTable.horizontalHeader().setStretchLastSection(True)
self.availableUserTable.horizontalHeader().setStretchLastSection(True)
# Moves users from one table to the other
#def moveUsers(self):
#for selection in self.availableUserTable.selectedItems():
# userID = self.availableUserTable.item(selection.row(), 0).data(Qt.UserRole)
#selectedAvailable = [self.availableUserTable.item(x.row(), 0).data(Qt.UserRole) for x in self.availableUserTable.selectedItems()]
#currentAvailable = [self.currentUserTable.item(x.row(), 0).data(Qt.UserRole) for x in self.currentUserTable.selectedItems()]
#for id in selectedAvailable:
# SHOULD I GET THE USER FROM THE ALLUSERS LIST, IF SO HOW SHOULD I PARSE BY ID?
# self.parent.currentUsers.append(self.userApi.getUserById(id))
# for id in currentAvailable:
# AGAIN A PARSING PROBLEM, SHOULD I INSTEAD HAVE THE LIST ONLY BE OF IDs?
# THIS WOULD HANDLE PARSING BUT WOULD CAUSE THE NEED FOR DYNAMIC API CALLS.(Probably the best way to do this)
# self.parent.currentUsers.remove(
#selectedAvailable = [x.row(0).text() for x in self.availableUserTable.selectedItems()]
#currentAvailable = self.currentUserTable.item(self.currentUserTable.currentRow(), 0)