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)
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)
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))