#!/usr/bin/env python from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWidget, \ QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView, QComboBox, QVBoxLayout from PyQt4.QtCore import Qt from dmApiFactory import DmApiFactory from objects.userInfo import UserInfo # 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 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)