Skip to content
Snippets Groups Projects
manageUsersTab.py 10.8 KiB
Newer Older
#!/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:
            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())
                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)