コード例 #1
0
class OverrideTool(QtGui.QWidget):
    """Opens an override dialog."""
    def __init__(self, user_id, password):
        """"""
        super(OverrideTool, self).__init__()
        self.user_id = user_id
        self.password = password
        self.getOverrideTable()
        self.createUI()
        self.mapEvents()
        self.override_date.setDate(datetime.date.today())
        #self.getFSNs()

    def getOverrideTable(self):
        self.override_table = MOSES.getOverrideTable(self.user_id,
                                                     self.password)

    def createUI(self):
        self.fsn_text_edit = FSNTextEdit()
        self.override_date = FormattedDateEdit()
        self.override_logo = ImageButton(
            os.path.join(MOSES.getPathToImages(), "override.png"), 64, 64,
            os.path.join(MOSES.getPathToImages(), "override_mouseover.png"))
        self.override_logo.setFlat(True)
        self.override_logo.setToolTip(
            "If you can't do something once, do it again, and again.")
        self.override_button = QtGui.QPushButton("Override")
        self.override_comment_label = QtGui.QLabel("Reason:")
        self.override_comment_field = QtGui.QLineEdit()
        self.override_comment_field.setToolTip(
            "Enter a reason for the override here.")
        self.data_tabulator = CopiableQTableWidget()

        column2 = QtGui.QVBoxLayout()
        column2.addWidget(self.override_logo, 1,
                          QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
        column2.addWidget(self.override_date, 1)
        column2.addWidget(self.override_button, 1)
        column2.addWidget(self.override_comment_label, 1)
        column2.addWidget(self.override_comment_field, 1)
        column2.addStretch(2)

        options_layout = QtGui.QHBoxLayout()
        options_layout.addWidget(self.fsn_text_edit, 2, QtCore.Qt.AlignTop)
        options_layout.addLayout(column2, 1)

        layout = QtGui.QVBoxLayout()
        layout.addLayout(options_layout, 1)
        layout.addWidget(self.data_tabulator, 3)

        self.setLayout(layout)
        self.setWindowIcon(
            QtGui.QIcon(os.path.join(MOSES.getPathToImages(),
                                     "PORK_Icon.png")))
        self.setWindowTitle("Override Tool")
        self.show()

    def mapEvents(self):
        """"""
        self.override_button.clicked.connect(self.createOverride)
        self.override_date.dateChanged.connect(self.changedDate)

    def changedDate(self):
        query_date = self.override_date.date().toPyDate()
        resultant_data_frame = self.override_table[
            self.override_table["Override Date"] == query_date]
        self.showDataFrame(resultant_data_frame)

    def showDataFrame(self, data_frame):
        self.data_tabulator.showDataFrame(data_frame)
        self.data_tabulator.verticalHeader().setResizeMode(
            QtGui.QHeaderView.ResizeToContents)
        self.data_tabulator.verticalHeader().setStretchLastSection(False)
        self.data_tabulator.verticalHeader().setVisible(True)

        self.data_tabulator.horizontalHeader().setResizeMode(
            QtGui.QHeaderView.ResizeToContents)
        self.data_tabulator.horizontalHeader().setStretchLastSection(False)
        self.data_tabulator.horizontalHeader().setVisible(True)

    def createOverride(self):
        """"""
        fsn_list = self.fsn_text_edit.getFSNs()

        if len(fsn_list) > 0:
            comment = str(self.override_comment_field.text()).strip()
            if len(comment) == 0:
                self.ask_comment = QtGui.QMessageBox.question(
                    self, 'No reason for override?',
                    "Hi there! You seem to be trying to override an FSN without giving a reason for doing so. Are you sure you want to do that? If you don't want to type a reason, go on ahead. I suggest typing one, because you'll have a neat record of that here.",
                    QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
                    QtGui.QMessageBox.No)
                if self.ask_comment == QtGui.QMessageBox.Yes:
                    allow = True
                else:
                    allow = False
            else:
                allow = True
            if allow:
                self.override_button.setEnabled(False)
                if len(fsn_list) > 1:
                    self.alertMessage(
                        "Please Wait",
                        "Looks like you're trying to override more than one FSN so this step could take a second or a minute, though definitely not more than that. Please wait, and remember, <i>Roma die uno non aedificata est</i>."
                    )
                failures = []
                for FSN in fsn_list:
                    trial_status = MOSES.addOverride(
                        FSN,
                        self.override_date.date().toPyDate(), self.user_id,
                        self.password, comment)
                    if not trial_status:
                        failures.append(FSN)
                if len(failures) == 0:
                    self.alertMessage(
                        "Success!",
                        "Successfully overrided the requested %d FSN(s)." %
                        len(fsn_list))
                else:
                    self.alertMessage(
                        "Failed!",
                        "Failed in overriding %d of the %d FSN(s)." %
                        (len(failures), len(fsn_list)))
                self.getOverrideTable()
                self.changedDate()
        else:
            self.alertMessage(
                "No FSNs Provided",
                "You don't seem to have pasted any valid FSNs. Could you try that again?"
            )
        self.override_button.setEnabled(True)
        return True

    def alertMessage(self, title, message):
        QtGui.QMessageBox.about(self, title, message)
コード例 #2
0
ファイル: DailyPorker.py プロジェクト: stonecharioteer/oink
class DailyPorker(QtGui.QWidget):
    def __init__(self, user_id, password, category_tree=None):
        super(DailyPorker, self).__init__()
        self.user_id, self.password = user_id, password
        self.report_list = []
        if category_tree is None:
            self.category_tree = MOSES.getCategoryTree(self.user_id, self.password)
        else:
            self.category_tree = category_tree
        #self.pork_kent = PorkKent(self.user_id, self.password)
        style_string = """
        .QTableWidget {
            gridline-color: rgb(0, 0, 0);
        }
        """
        self.setStyleSheet(style_string)
        self.clip = QtGui.QApplication.clipboard()
        self.createUI()
        self.mapEvents()
        self.initiate()
        self.show()

    def initiate(self):
        self.center()
        self.populateWritersComboBox()
        self.writers_combobox.selectAll()
        self.refreshSortFilter()

    def center(self):
        #frameGm = self.frameGeometry()
        #screen = QtGui.QApplication.desktop().screenNumber(QtGui.QApplication.desktop().cursor().pos())
        #centerPoint = QtGui.QApplication.desktop().screenGeometry(screen).center()
        #frameGm.moveCenter(centerPoint)
        #self.move(frameGm.topLeft())
        self.move(70,50)

    def createUI(self):
        self.start_date_label = QtGui.QLabel("<b>Date:</b>")
        self.start_date_edit = QtGui.QDateTimeEdit()
        self.start_date_edit.setToolTip("Set the date for which you want to generate the report.")
        lwd = MOSES.getLastWorkingDate(self.user_id, self.password, queryUser="******")
        self.start_date_edit.setDate(lwd)
        self.start_date_edit.setDisplayFormat("MMMM dd, yyyy")
        self.start_date_edit.setMinimumDate(QtCore.QDate(2015,1,1))
        self.start_date_edit.setCalendarPopup(True)

        self.end_date_edit = QtGui.QDateTimeEdit()
        self.end_date_edit.setToolTip("Select an end date. Only working days will be considered for the calculation.\nThis field will be disabled if the checkbox isn't marked to calculate the average statistics between dates.")
        self.end_date_edit.setDate(self.start_date_edit.date())
        self.end_date_edit.setDisplayFormat("MMMM dd, yyyy")
        self.end_date_edit.setMinimumDate(self.start_date_edit.date())
        self.end_date_edit.setCalendarPopup(True)

        self.writers_combobox = CheckableComboBox("Writers")
        self.writers_combobox.setToolTip("Select a group of writers if you want to check their performance for some time frame.")

        report_names = ["Article Count","Efficiency","Audit Count","CFM","GSEO","Stack Rank Index","Efficiency KRA","CFM KRA","GSEO KRA"]#,"Audit Percentage"]
        self.parameters_combobox = CheckableComboBox("Report Values")
        self.parameters_combobox.addItems(report_names)
        self.parameters_combobox.select(["Efficiency","CFM","GSEO", "Article Count", "Audit Count"])

        self.report_time_frames_combobox = CheckableComboBox("Timeframe")
        self.report_time_frames_combobox.addItems(["Daily","Weekly","Monthly","Quarterly","Half-Yearly"])
        self.report_time_frames_combobox.select(["Daily","Weekly"])

        self.sorting_filter_label = QtGui.QLabel("<b>Sort By:</b>")
        self.sorting_filter_combobox = QtGui.QComboBox()
        self.sorting_filter_combobox.setToolTip("Select the parameter you want to sort the generated reports by.")

        self.build_button = QtGui.QPushButton("Build Daily Team Performance Report")
        self.build_button.setToolTip("Click this button to start building the report")

        self.plot_button = QtGui.QPushButton("Plot")
        self.plot_button.setToolTip("Check this if you want to automatically plot the graphs.")
        
        self.build_dbr_button = QtGui.QPushButton("Build DBR Report")
        self.build_dbr_button.setToolTip("Check this if you want to automatically plot the graphs.")
        
        self.build_wbr_button = QtGui.QPushButton("Build WBR Report")
        self.build_wbr_button.setToolTip("Check this if you want to automatically plot the graphs.")
        
        self.progress_bar = ProgressBar()

        self.export_graphs_button = QtGui.QPushButton("Save")
        self.export_graphs_button.setToolTip("Click this button to save the generated reports and graphs in a desired folder location.")

        self.report = CopiableQTableWidget(0, 0)
        self.t_report = CopiableQTableWidget(0, 0)
        self.dbr_report = CopiableQTableWidget(0, 0)
        self.wbr_report = CopiableQTableWidget(0, 0)

        self.graphs = DailyGraphView()
        self.t_graphs = DailyGraphView()

        self.reports_tab = QtGui.QTabWidget()
        self.reports_tab.addTab(self.report,"Writers' Report")
        #self.reports_tab.addTab(self.graphs, "Writers' Graphs")
        #self.reports_tab.addTab(self.t_report,"Team Report")
        #self.reports_tab.addTab(self.t_graphs, "Team Graphs")
        self.reports_tab.addTab(self.dbr_report, "DBR Report")
        self.reports_tab.addTab(self.wbr_report, "WBR Report")

        self.status = QtGui.QLabel("I'm a Porkitzer Prize Winning Reporter.")

        options_layout_row_1 = QtGui.QHBoxLayout()
        options_layout_row_1.addWidget(self.start_date_label,0)
        options_layout_row_1.addWidget(self.start_date_edit,1)
        options_layout_row_1.addWidget(self.end_date_edit,1)
        options_layout_row_1.addWidget(self.writers_combobox,1)
        options_layout_row_1.addWidget(self.parameters_combobox,1)
        options_layout_row_1.addWidget(self.report_time_frames_combobox,1)
        options_layout_row_1.addStretch(2)
        
        options_layout_row_2 = QtGui.QHBoxLayout()
        options_layout_row_2.addWidget(self.sorting_filter_label,0)
        options_layout_row_2.addWidget(self.sorting_filter_combobox,1)
        options_layout_row_2.addWidget(self.build_button,0)
        #options_layout_row_2.addWidget(self.plot_button,0)
        options_layout_row_2.addWidget(self.build_dbr_button,0)
        options_layout_row_2.addWidget(self.build_wbr_button,0)
        options_layout_row_2.addStretch(2)

        options_layout = QtGui.QVBoxLayout()
        options_layout.addLayout(options_layout_row_1,0)
        options_layout.addLayout(options_layout_row_2,0)
        self.daily_porker_logo = ImageButton(
                                        os.path.join(MOSES.getPathToImages(),"newspaper.png"),
                                        100,
                                        100,
                                        os.path.join(MOSES.getPathToImages(),"newspaper_mouseover.png")
                                    )
        self.daily_porker_logo.setFlat(True)
        options = QtGui.QGroupBox("Report Options")
        options.setLayout(options_layout)
        options_with_logo = QtGui.QHBoxLayout()
        options_with_logo.addWidget(self.daily_porker_logo, 0, QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
        options_with_logo.addWidget(options, 3)

        layout = QtGui.QVBoxLayout()
        layout.addLayout(options_with_logo,1)
        layout.addWidget(self.reports_tab,3)
        layout.addWidget(self.progress_bar,0)
        layout.addWidget(self.status,0)

        self.setLayout(layout)
        self.setWindowTitle("The Daily Porker: Straight from the Pigs")

        icon_file_name_path = os.path.join(MOSES.getPathToImages(),'PORK_Icon.png')
        self.setWindowIcon(QtGui.QIcon(icon_file_name_path))

    def mapEvents(self):
        self.build_button.clicked.connect(self.buildReport)
        self.start_date_edit.dateChanged.connect(self.changedStartDate)
        self.pork_lane = PorkLane(self.user_id, self.password, self.category_tree)
        self.pork_lane.sendReport.connect(self.populateReport)
        self.pork_lane.sendProgress.connect(self.displayProgress)
        self.pork_lane.sendGraphs.connect(self.displayGraphs)
        self.report_time_frames_combobox.changedSelection.connect(self.refreshSortFilter)
        self.parameters_combobox.changedSelection.connect(self.refreshSortFilter)
        self.build_dbr_button.clicked.connect(self.buildDBR)
        self.build_wbr_button.clicked.connect(self.buildWBR)

    def buildDBR(self):
        self.build_dbr_button.setEnabled(False)
        self.alertMessage("Please Wait","This could take a while.")
        dbr = MOSES.getDBR(self.user_id, self.password, self.start_date_edit.date().toPyDate(), self.category_tree)
        self.dbr_report.showDataFrame(dbr)
        self.dbr_report.adjustToColumns()
        self.build_dbr_button.setEnabled(True)
        self.alertMessage("Success","Successfully Pulled the DBR")

    def buildWBR(self):
        self.build_wbr_button.setEnabled(False)
        self.alertMessage("Please Wait","This could take a while.")
        wbr = MOSES.getWBR(self.user_id, self.password, self.start_date_edit.date().toPyDate(), self.category_tree)
        self.wbr_report.showDataFrame(wbr)
        self.wbr_report.adjustToColumns()
        self.build_wbr_button.setEnabled(True)
        self.alertMessage("Success","Successfully Pulled the WBR")


    def getWritersList(self):
        self.writers_data_frame = MOSES.getWritersList(self.user_id, self.password, self.start_date_edit.date().toPyDate())
        writer_names_list = list(set(self.writers_data_frame["Name"]))
        writer_names_list.sort()
        return writer_names_list

    def displayGraphs(self,handle):
        if handle:
            self.graphs.graph_date = self.pork_lane.start_date
            self.graphs.enable_plotting = True
            self.graphs.plotGraph()
            self.progress_bar.setRange(0,100)
            self.progress_bar.setFormat("Completed at %s." %(datetime.datetime.strftime(datetime.datetime.now(),"%H:%M:%S")))
            self.status.setText("Beware the alien, the mutant, the heretic.")  
            self.progress_bar.setValue(100)
            #self.export_graphs_button.setEnabled(True)
        else:
            self.export_graphs_button.setEnabled(False)
            self.status.setText("Creating Graphs...")        
            self.progress_bar.setValue(0)
            self.progress_bar.setRange(0,0)


    def refreshSortFilter(self):
        report_types = self.getRequiredReportTypes()
        self.sorting_filter_combobox.clear()
        if len(report_types) > 0:
            self.sorting_filter_combobox.setEnabled(True)
            self.sorting_filter_combobox.addItems(report_types)
        else:
            self.sorting_filter_combobox.setEnabled(False)
        self.sorting_filter_combobox.setCurrentIndex(-1)

    def buildReport(self):
        self.build_button.setEnabled(False)
        report_types = self.getRequiredReportTypes()
        if len(report_types) > 0:
            self.build = True
            self.pork_lane.writers_data_frame = self.writers_data_frame
            self.pork_lane.parameter_list = self.parameters_combobox.getCheckedItems() #set pork lane report types.]
            self.pork_lane.time_frame_list = self.report_time_frames_combobox.getCheckedItems()
            selected_writers_list = self.writers_combobox.getCheckedItems()
            if len(selected_writers_list)>0:
                self.pork_lane.writers_list = selected_writers_list
            else:
                self.writers_combobox.selectAll()
                selected_writers_list = self.writers_combobox.getCheckedItems()
                self.pork_lane.writers_list = selected_writers_list
            self.pork_lane.start_date = self.start_date_edit.date().toPyDate()
            self.pork_lane.end_date = self.end_date_edit.date().toPyDate()
            self.pork_lane.allowRun = True #allow building.
        else:
            self.build = False
            self.alertMessage("Error","Please select at least one parameter in the checklist before attempting to build the report.")
        self.build_button.setEnabled(True)
            
    def changedStartDate(self):
        self.end_date_edit.setMinimumDate(self.start_date_edit.date())
        self.end_date_edit.setDate(self.start_date_edit.date())
        self.populateWritersComboBox()

    def populateWritersComboBox(self):
        self.writers_combobox.clear()
        self.writers_combobox.addItems(self.getWritersList())
        self.writers_combobox.selectAll()

    def getRequiredReportTypes(self):
        parameter_list = self.parameters_combobox.getCheckedItems()
        time_frame_list = self.report_time_frames_combobox.getCheckedItems()
        reports_list = ["%s %s"%(time_frame, parameter_type) for time_frame in time_frame_list for parameter_type in parameter_list]
        return reports_list

    def populateReport(self, report):
        mode = self.pork_lane.mode
        columns = ["Report Date", "Writer ID", "Writer Email ID", "Writer Name", "Reporting Manager"]
        columns += mode
        self.report.setRowCount(0)
        row_counter = 0

        self.report.setColumnCount(len(columns))
        self.report.setHorizontalHeaderLabels(columns)
        self.report.setSortingEnabled(False)
        red = QtGui.QColor(231, 90, 83)
        green = QtGui.QColor(60, 179, 113)
        blue = QtGui.QColor(23, 136, 216)

        for writer_row in report:
            self.report.insertRow(row_counter)
            column_counter = 0
            for column_name in columns:
                if ("Efficiency" in column_name) and ("KRA" not in column_name):
                    steps = [1.00, 1.05, 1.10]
                elif (("CFM" in column_name) or ("GSEO" in column_name)) and ("KRA" not in column_name):
                    steps = [0.95, 0.97]
                elif ("KRA" in column_name) or ("Index" in column_name):
                    steps = [3.0,4.0,5.0]
                else:
                    steps = []
                parameter = writer_row[column_name]

                if (type(parameter) == str):
                    parameter_is_valid = False
                elif (parameter is None):
                    parameter_is_valid = False
                elif type(parameter) == float:
                    if math.isnan(parameter):
                        parameter_is_valid = False
                    else:
                        parameter_is_valid = True
                elif type(parameter) == datetime.date:
                    parameter_is_valid = False    
                else:
                    parameter_is_valid = True
                
                if parameter_is_valid:
                    if "Count" in column_name:
                        parameter_as_string = "%03d" % parameter
                    elif ("Stack Rank Index" in column_name) or ("KRA" in column_name):
                        parameter_as_string = "%01.2f" % parameter
                    else:
                        if math.isnan(parameter):
                            parameter_as_string = "-"
                        else:
                            parameter_as_string = "%06.2f%%" %(round(parameter*100,4))
                elif column_name in ["Report Date", "Writer ID", "Writer Name", "Writer Email ID", "Reporting Manager"]:
                    parameter_as_string = str(parameter)
                else:
                    parameter_as_string = "-"

                writer_cell_item = QtGui.QTableWidgetItem(parameter_as_string)
                writer_cell_item.setTextAlignment(QtCore.Qt.AlignCenter)
                if parameter_is_valid:
                    if steps != []:
                        if round(parameter,4) < steps[0]:
                            writer_cell_item.setBackgroundColor(red)
                        elif steps[0] <= (round(parameter,4)) <= steps[1]:
                            writer_cell_item.setBackgroundColor(green)
                        elif (round(parameter,4)) > steps[1]:
                            writer_cell_item.setBackgroundColor(blue)
                self.report.setItem(row_counter, column_counter, writer_cell_item)
                column_counter += 1
            row_counter += 1 
        self.report.setSortingEnabled(True)
        self.report.resizeColumnsToContents()
        self.report.resizeRowsToContents()
        sorting_factor = self.getSortColumn()
        if sorting_factor is not "NA":
            sort_index = mode.index(sorting_factor) + 5
            self.report.sortItems(sort_index,QtCore.Qt.DescendingOrder)

    def getSortColumn(self):
        if self.sorting_filter_combobox.currentIndex() != -1:
            return str(self.sorting_filter_combobox.currentText())
        else:
            return "NA"
            
    def displayProgress(self, progress_text, eta, progress, state):
        if state:
            self.pork_lane.allowRun = False
            self.build_button.setEnabled(True)
            self.progress_bar.setFormat("Completed at %s." %(datetime.datetime.strftime(eta,"%H:%M:%S")))        
            self.progress_bar.setValue(progress)
        else:
            self.build_button.setEnabled(False)
            self.progress_bar.setFormat("%s ETA: %s" %(progress_text, datetime.datetime.strftime(eta,"%H:%M:%S")))
            self.progress_bar.setValue(progress)

    def alertMessage(self, title, message):
        QtGui.QMessageBox.about(self, title, message)
コード例 #3
0
class Seeker(QtGui.QWidget):
    """Seeker class to find FSNs or Item_IDs 
    and filter out those which have not been written before.
    """
    def __init__(self, user_id, password):
        super(Seeker, self).__init__()
        self.user_id = user_id
        self.password = password
        self.mode = 0
        self.clip = QtGui.QApplication.clipboard()
        self.peeves = Peeves(user_id, password)
        self.createUI()
        self.createEvents()

    def createUI(self):
        self.fsns_label = QtGui.QLabel("FSNs\Item IDs:")
        self.fsns_text_edit = QtGui.QTextEdit()
        self.fsns_text_edit.setToolTip("Paste a list of FSNs or Item IDs here,\nseparated either by a new line or a comma.")
        self.type_selector = QtGui.QComboBox()
        self.type_selector.addItems(["FSN(s)", "Item ID(s)"])
        self.type_selector.setToolTip("Select the list type. Are you searching by FSNs or Item IDs?")
        self.type_selector.setCurrentIndex(0)
        self.output_table = CopiableQTableWidget(0, 0)
        self.progress_bar = ProgressBar()
        self.fetch_data_button = ImageButton(os.path.join("Images","find.png"),64,64,os.path.join("Images","find_mouseover.png"))
        self.fetch_data_button.setFlat(True)
        form_searcher_layout = QtGui.QVBoxLayout()
        form_searcher_layout.addWidget(self.fsns_label, 0)
        form_searcher_layout.addWidget(self.fsns_text_edit, 2)

        self.seeker_button = ImageButton(os.path.join("Images","seeker.png"),100,100,os.path.join("Images","seeker_mouseover.png"))
        self.seeker_button.setFlat(True)
        self.seeker_button.setToolTip("You're a Wizard, Harry.")
        
        form_options_layout = QtGui.QVBoxLayout()
        form_options_layout.addStretch(1)
        form_options_layout.addWidget(self.seeker_button,1, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)
        form_options_layout.addStretch(2)
        form_options_layout.addWidget(self.type_selector, 0)
        form_options_layout.addWidget(self.fetch_data_button, 0, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)

        form_layout = QtGui.QHBoxLayout()
        form_layout.addLayout(form_searcher_layout, 3)
        form_layout.addLayout(form_options_layout, 0)

        layout = QtGui.QVBoxLayout()
        layout.addLayout(form_layout, 0)
        layout.addWidget(self.output_table, 3)
        layout.addWidget(self.progress_bar, 0)

        self.setLayout(layout)
        self.setWindowTitle("Seeker: The FSN Finding Tool")
        self.setWindowIcon(QtGui.QIcon(os.path.join('Images','PORK_Icon.png')))
        self.show()

    def createEvents(self):
        """"""
        self.fetch_data_button.clicked.connect(self.fetchData)
        self.peeves.sendProgress.connect(self.displayProgress)
        #self.peeves.sendRow.connect(self.displayFSNs)
        self.peeves.sendData.connect(self.populateTable)
    
    def fetchData(self):
        text_edit_contents = str(self.fsns_text_edit.toPlainText()).strip()
        if '"' in text_edit_contents:
            text_edit_contents.replace('"',"")
        if " " in text_edit_contents:
            text_edit_contents.replace(' ', "")
        search_items = list(set(text_edit_contents.split("\n")))
        self.search_type = self.type_selector.currentIndex()
        self.peeves.fetchData(search_items, self.search_type)

    def populateTable(self, fsn_data):
        #print "Populating the table!"
        self.output_table.setSortingEnabled(False)

        table_headers = [
            "FSN",
            "Status",
            "Item ID",
            "Description Type",
            "Writer ID",
            "Writer Name",
            "Article Date",
            "Database table",
            "BU",
            "Super-Category",
            "Category",
            "Sub-Category",
            "Vertical",
            "Brand"
            ]
        #print table_headers
        rows = len(fsn_data)
        columns = len(table_headers)
        self.output_table.setRowCount(rows)
        self.output_table.setColumnCount(columns)
        row_counter = 0
        for each_fsn in fsn_data:
            column_counter = 0
#            self.output_table.addRow(row_counter)
            for key in table_headers:
                item = QtGui.QTableWidgetItem(str(each_fsn[key]))
                self.output_table.setItem(row_counter, column_counter, item)
                column_counter += 1
            row_counter += 1
        self.output_table.setHorizontalHeaderLabels(table_headers)
        self.output_table.setSortingEnabled(True)
        self.output_table.sortItems(1)
        self.output_table.resizeColumnsToContents()
        self.output_table.resizeRowsToContents()
        #print fsn_data
    
    def displayProgress(self, done, total, eta):
        progress = float(done)/float(total)
        if done < total:
            time_string = datetime.datetime.strftime(eta, "%d %B, %H:%M:%S")
            self.progress_bar.setFormat("Getting FSN Data. Finished %d of %d. ETA: %s" %(done, total, time_string))
        else:
            self.progress_bar.setFormat("Completed fetching FSN Data")
        self.progress_bar.setValue(int(progress*100))