def __init__(self, sequence): self.__sequence = sequence self.__index = 0 img = sequence[0][0] ImageButton.__init__(self, img, img) self.connect_clicked(self.__on_click)
def __init__(self, label = "", icon = None): self.__label = label self.__icon = icon ImageButton.__init__(self, theme.mb_button_1, theme.mb_button_2) w, h = text_extents(label, theme.font_mb_plain) self.set_size(w + 24, h + 24) self.add_overlay(self.__icon_overlay) self.add_overlay(self.__text_overlay)
def createUI(self): self.summarization_label = QtGui.QLabel("Summarize by:") self.available_methods_list_widget = QtGui.QListWidget() self.selected_methods_list_widget = QtGui.QListWidget() path_to_images_folder = os.path.join(os.getcwd(),"Images") if "OINKModules" not in os.getcwd() else os.path.join(os.getcwd(),"..","Images") self.select_method_button = ImageButton(os.path.join(path_to_images_folder,"rightarrow.png"),25,25) self.deselect_method_button = ImageButton(os.path.join(path_to_images_folder,"leftarrow.png"),25,25) #self.move_up_button = ImageButton(os.path.join(path_to_images_folder,"uparrow.png"),25,25) #self.move_down_button = ImageButton(os.path.join(path_to_images_folder,"downarrow.png"),25,25) self.summarize_button = ImageButton(os.path.join(path_to_images_folder,"checkmark_green.png"),25,25) self.summarize_button.setToolTip("Click to summarize") self.reset_button = ImageButton(os.path.join(path_to_images_folder,"cross.png"),25,25) self.reset_button.setToolTip("Click to reset the summarization options") self.summary_table = CopiableQTableWidget(0,0) select_buttons_layout = QtGui.QVBoxLayout() select_buttons_layout.addStretch(2) select_buttons_layout.addWidget(self.select_method_button,0) select_buttons_layout.addWidget(self.deselect_method_button,0) select_buttons_layout.addStretch(2) finish_buttons_layout = QtGui.QVBoxLayout() finish_buttons_layout.addStretch(2) finish_buttons_layout.addStretch(2) #finish_buttons_layout.addWidget(self.move_up_button,0) #finish_buttons_layout.addWidget(self.move_down_button,0) finish_buttons_layout.addStretch(2) finish_buttons_layout.addWidget(self.summarize_button,0) finish_buttons_layout.addWidget(self.reset_button,0) finish_buttons_layout.addStretch(2) selector_layout = QtGui.QHBoxLayout() selector_layout.addWidget(self.available_methods_list_widget,1) selector_layout.addLayout(select_buttons_layout, 1) selector_layout.addWidget(self.selected_methods_list_widget,1) selector_layout.addLayout(finish_buttons_layout, 1) layout = QtGui.QVBoxLayout() layout.addWidget(self.summarization_label) layout.addLayout(selector_layout) layout.addWidget(self.summary_table) self.setLayout(layout)
def initializeGL(self): #self.autoBufferSwap(False) # Initialize the context gl.glClearColor(0.94, 0.94, 0.0, 1) gl.glEnable(gl.GL_LINE_STIPPLE) gl.glEnable(gl.GL_TEXTURE_2D) # self.badgeScreen.init("") self.initMTex = gl.glGenTextures(1) gl.glBindTexture(gl.GL_TEXTURE_2D, self.initMTex) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, self.initMImg.get_width(), self.initMImg.get_height(), 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, pygame.image.tostring(self.initMImg, "RGBA", 1)) # Avatar Female self.initFTex = gl.glGenTextures(1) gl.glBindTexture(gl.GL_TEXTURE_2D, self.initFTex) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, self.initFImg.get_width(), self.initFImg.get_height(), 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, pygame.image.tostring(self.initFImg, "RGBA", 1)) self.welcomeTex = gl.glGenTextures(1) gl.glBindTexture(gl.GL_TEXTURE_2D, self.welcomeTex) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, self.welcomeImg.get_width(), self.welcomeImg.get_height(), 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, pygame.image.tostring(self.welcomeImg, "RGBA", 1)) self.buttonM = ImageButton(self.initMImg, self.initMTex, 1090, 535) self.buttonF = ImageButton(self.initFImg, self.initFTex, 444, 535) self.buttonM.enable() self.buttonF.enable()
def __init__(self): self.__title = "" self.__mode = self.MODE_NORMAL Widget.__init__(self) self.connect_clicked(lambda *a:self.emit_event(self.EVENT_MENU)) self.__btn_switch = ImageButton(theme.btn_window_switch_1, theme.btn_window_switch_2) self.__btn_switch.connect_clicked( lambda *a:self.emit_event(self.EVENT_SWITCH)) self.add(self.__btn_switch) self.__btn_close = ImageButton(theme.btn_window_close_1, theme.btn_window_close_2) self.__btn_close.connect_clicked( lambda *a:self.emit_event(self.EVENT_CLOSE)) self.add(self.__btn_close) self.__btn_back = ImageButton(theme.btn_window_back_1, theme.btn_window_back_2) self.__btn_back.connect_clicked( lambda *a:self.emit_event(self.EVENT_CLOSE)) self.add(self.__btn_back) self.__btn_back.set_visible(False)
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 createUI(self): """""" path_to_images = MOSES.getPathToImages() self.raw_data_uploader_button = ImageButton( os.path.join(path_to_images,"upload_raw_data.png"), 48, 48, os.path.join(path_to_images,"upload_raw_data_mouseover.png")) self.tna_viewer_button = ImageButton( os.path.join(path_to_images,"tna.png"), 48, 48, os.path.join(path_to_images,"tna_mouseover.png") ) self.piggybank_button = ImageButton( os.path.join(path_to_images,"piggybank.png"), 48, 48, os.path.join(path_to_images,"piggybank_mouseover.png") ) self.seeker_button = ImageButton( os.path.join(path_to_images,"find.png"), 48, 48, os.path.join(path_to_images,"find_mouseover.png") ) self.taunter = Taunter() self.bacon_icon = ImageButton( os.path.join(path_to_images,"quality.png"), 150, 150, os.path.join(path_to_images,"quality_mouseover.png") ) self.bacon_icon.setToolTip("Get to work, Poozers.") row_1 = QtGui.QHBoxLayout() row_1.addWidget(self.raw_data_uploader_button) row_1.addWidget(self.tna_viewer_button) row_1.addWidget(self.piggybank_button) row_1.addWidget(self.seeker_button) layout = QtGui.QVBoxLayout() layout.addWidget(self.bacon_icon,0,QtCore.Qt.AlignHCenter) layout.addLayout(row_1,1) layout.addWidget(self.taunter,0) self.main_widget = QtGui.QWidget() self.main_widget.setLayout(layout) self.setCentralWidget(self.main_widget) self.setWindowTitle("BACON - Version %s. Server: %s. User: %s (%s)."%(version(), MOSES.getHostID(), self.user_id,MOSES.getEmpName(self.user_id) if self.user_id != "bigbrother" else "Administrator")) icon_file_name_path = os.path.join(path_to_images,'PORK_Icon.png') self.setWindowIcon(QtGui.QIcon(icon_file_name_path)) self.show()
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 main(): # initialize pygame, set screen and title pygame.init() pygame.display.set_caption(s.caption) screen = pygame.display.set_mode(s.screen_size, 0, 0) # build map list global maps maps = build_map(s) num = 0 for m in maps: num += 1 # build image list for i in range(0, s.map_size): x = int( i % s.game_col) * s.grid_size + (s.grid_size - s.scale_size[0]) / 2 y = int( i / s.game_col) * s.grid_size + (s.grid_size - s.scale_size[0]) / 2 img = './images/img_' + str(maps[i]) + '.png' images.append(ImageButton(screen, img, x, y, i, maps[i], s)) # start playing play = True while True: screen.fill(s.background_color) if play: # check if all the images are cleared, if so, end the game if all_cleared(maps): play = False # display images for i in images: i.display() pygame.display.update() else: win = pygame.image.load(s.win) screen.blit(win, ((s.screen_width - win.get_width()) / 2, (s.screen_height - win.get_height()) / 2)) pygame.display.update() # check click event click_event(images, s, maps) time.sleep(0.03)
def createUI(self): """""" path_to_images = MOSES.getPathToImages() self.raw_data_uploader_button = ImageButton( os.path.join(path_to_images, "upload_raw_data.png"), 48, 48, os.path.join(path_to_images, "upload_raw_data_mouseover.png")) self.tna_viewer_button = ImageButton( os.path.join(path_to_images, "tna.png"), 48, 48, os.path.join(path_to_images, "tna_mouseover.png")) self.piggybank_button = ImageButton( os.path.join(path_to_images, "piggybank.png"), 48, 48, os.path.join(path_to_images, "piggybank_mouseover.png")) self.seeker_button = ImageButton( os.path.join(path_to_images, "find.png"), 48, 48, os.path.join(path_to_images, "find_mouseover.png")) self.taunter = Taunter() self.bacon_icon = ImageButton( os.path.join(path_to_images, "quality.png"), 150, 150, os.path.join(path_to_images, "quality_mouseover.png")) self.bacon_icon.setToolTip("Get to work, Poozers.") row_1 = QtGui.QHBoxLayout() row_1.addWidget(self.raw_data_uploader_button) row_1.addWidget(self.tna_viewer_button) row_1.addWidget(self.piggybank_button) row_1.addWidget(self.seeker_button) layout = QtGui.QVBoxLayout() layout.addWidget(self.bacon_icon, 0, QtCore.Qt.AlignHCenter) layout.addLayout(row_1, 1) layout.addWidget(self.taunter, 0) self.main_widget = QtGui.QWidget() self.main_widget.setLayout(layout) self.setCentralWidget(self.main_widget) self.setWindowTitle( "BACON - Version %s. Server: %s. User: %s (%s)." % (version(), MOSES.getHostID(), self.user_id, MOSES.getEmpName(self.user_id) if self.user_id != "bigbrother" else "Administrator")) icon_file_name_path = os.path.join(path_to_images, 'PORK_Icon.png') self.setWindowIcon(QtGui.QIcon(icon_file_name_path)) self.show()
def __init__(self, director, position=(0, 0), style = None, visible = True): ImageButton.__init__(self, director, position, style, visible)
def draw(self, surface): if self.visible: ImageButton.draw(self, surface) surface.blit(self.style['obj'], self.getPosition())
class Bacon(QtGui.QMainWindow): """""" def __init__(self, user_id, password, category_tree, employees_list, brand_list): super(Bacon, self).__init__() self.user_id = user_id self.password = password self.category_tree = category_tree self.employees_list = employees_list self.brand_list = brand_list self.current_processing_date = MOSES.getLastWorkingDate( self.user_id, self.password, datetime.date.today(), "All") self.createUI() self.mapEvents() 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()) def createUI(self): """""" path_to_images = MOSES.getPathToImages() self.raw_data_uploader_button = ImageButton( os.path.join(path_to_images, "upload_raw_data.png"), 48, 48, os.path.join(path_to_images, "upload_raw_data_mouseover.png")) self.tna_viewer_button = ImageButton( os.path.join(path_to_images, "tna.png"), 48, 48, os.path.join(path_to_images, "tna_mouseover.png")) self.piggybank_button = ImageButton( os.path.join(path_to_images, "piggybank.png"), 48, 48, os.path.join(path_to_images, "piggybank_mouseover.png")) self.seeker_button = ImageButton( os.path.join(path_to_images, "find.png"), 48, 48, os.path.join(path_to_images, "find_mouseover.png")) self.taunter = Taunter() self.bacon_icon = ImageButton( os.path.join(path_to_images, "quality.png"), 150, 150, os.path.join(path_to_images, "quality_mouseover.png")) self.bacon_icon.setToolTip("Get to work, Poozers.") row_1 = QtGui.QHBoxLayout() row_1.addWidget(self.raw_data_uploader_button) row_1.addWidget(self.tna_viewer_button) row_1.addWidget(self.piggybank_button) row_1.addWidget(self.seeker_button) layout = QtGui.QVBoxLayout() layout.addWidget(self.bacon_icon, 0, QtCore.Qt.AlignHCenter) layout.addLayout(row_1, 1) layout.addWidget(self.taunter, 0) self.main_widget = QtGui.QWidget() self.main_widget.setLayout(layout) self.setCentralWidget(self.main_widget) self.setWindowTitle( "BACON - Version %s. Server: %s. User: %s (%s)." % (version(), MOSES.getHostID(), self.user_id, MOSES.getEmpName(self.user_id) if self.user_id != "bigbrother" else "Administrator")) icon_file_name_path = os.path.join(path_to_images, 'PORK_Icon.png') self.setWindowIcon(QtGui.QIcon(icon_file_name_path)) self.show() def mapEvents(self): """""" self.raw_data_uploader_button.clicked.connect(self.openRawDataManager) self.piggybank_button.clicked.connect(self.openPiggyBank) self.tna_viewer_button.clicked.connect(self.openTNAViewer) self.seeker_button.clicked.connect(self.openSeeker) def openRawDataManager(self): self.raw_data_manager = RawDataManager(self.user_id, self.password) def openPiggyBank(self): self.piggy_bank = PiggyBankWithFilter(self.user_id, self.password, self.category_tree, self.brand_list) def openTNAViewer(self): self.tna_viewer = TNAViewer(self.user_id, self.password, self.category_tree) def openSeeker(self): self.seeker = Seeker(self.user_id, self.password)
class TitleBar(Widget): """ Title bar widget for Maemo4. """ EVENT_SWITCH = "event-switch" EVENT_CLOSE = "event-close" EVENT_MENU = "event-menu" MODE_NORMAL = 0 MODE_SUBWINDOW = 1 def __init__(self): self.__title = "" self.__mode = self.MODE_NORMAL Widget.__init__(self) self.connect_clicked(lambda *a:self.emit_event(self.EVENT_MENU)) self.__btn_switch = ImageButton(theme.btn_window_switch_1, theme.btn_window_switch_2) self.__btn_switch.connect_clicked( lambda *a:self.emit_event(self.EVENT_SWITCH)) self.add(self.__btn_switch) self.__btn_close = ImageButton(theme.btn_window_close_1, theme.btn_window_close_2) self.__btn_close.connect_clicked( lambda *a:self.emit_event(self.EVENT_CLOSE)) self.add(self.__btn_close) self.__btn_back = ImageButton(theme.btn_window_back_1, theme.btn_window_back_2) self.__btn_back.connect_clicked( lambda *a:self.emit_event(self.EVENT_CLOSE)) self.add(self.__btn_back) self.__btn_back.set_visible(False) def connect_switch(self, cb, *args): self._connect(self.EVENT_SWITCH, cb, *args) def connect_close(self, cb, *args): self._connect(self.EVENT_CLOSE, cb, *args) def connect_menu(self, cb, *args): self._connect(self.EVENT_MENU, cb, *args) def _reload(self): self.render() def set_mode(self, mode): self.__mode = mode self.render() def set_title(self, title): self.__title = title if (self.may_render()): self.render_buffered(TEMPORARY_PIXMAP) def render_this(self): x, y = 0, 0 w, h = self.get_size() screen = self.get_screen() screen.draw_frame(theme.titlebar_bg, x, y, w, h, True) if (self.__mode == self.MODE_NORMAL): if (platforms.MEEGO_NETBOOK or platforms.MEEGO_WETAB): screen.draw_pixbuf(theme.window_menu, x, 7) self.__btn_close.set_geometry(w - 80, 0, 80, 57) self.__btn_switch.set_visible(False) self.__btn_back.set_visible(False) self.__btn_close.set_visible(True) screen.set_clip_rect(x + 50, y + 14, w - 80 - 50, 57) screen.draw_text(self.__title, theme.font_ui_titlebar, x + 50, y + 14, theme.color_ui_titlebar) screen.set_clip_rect() else: screen.draw_pixbuf(theme.window_menu, x + 80, 7) self.__btn_switch.set_geometry(0, 0, 80, 57) self.__btn_close.set_geometry(w - 80, 0, 80, 57) self.__btn_switch.set_visible(True) self.__btn_back.set_visible(False) self.__btn_close.set_visible(True) screen.set_clip_rect(x + 80 + 50, y + 14, w - 80 - 80 - 50, 57) screen.draw_text(self.__title, theme.font_ui_titlebar, x + 80 + 50, y + 14, theme.color_ui_titlebar) screen.set_clip_rect() elif (self.__mode == self.MODE_SUBWINDOW): if (platforms.MEEGO_NETBOOK or platforms.MEEGO_WETAB): screen.draw_pixbuf(theme.window_menu, x, 7) self.__btn_back.set_geometry(w - 80, 0, 80, 57) self.__btn_switch.set_visible(False) self.__btn_back.set_visible(True) self.__btn_close.set_visible(False) screen.set_clip_rect(x + 50, y + 14, w - 80 - 50, 57) screen.draw_text(self.__title, theme.font_ui_titlebar, x + 50, y + 14, theme.color_ui_titlebar) screen.set_clip_rect() else: screen.draw_pixbuf(theme.window_menu, x + 80, 7) self.__btn_switch.set_geometry(0, 0, 80, 57) self.__btn_back.set_geometry(w - 80, 0, 80, 57) self.__btn_switch.set_visible(True) self.__btn_back.set_visible(True) self.__btn_close.set_visible(False) screen.set_clip_rect(x + 80 + 50, y + 14, w - 80 - 80 - 50, 57) screen.draw_text(self.__title, theme.font_ui_titlebar, x + 80 + 50, y + 14, theme.color_ui_titlebar) screen.set_clip_rect()
def __init__(self, director, position=(0, 0), style=None, visible=True): ImageButton.__init__(self, director, position, style, visible)
class DataSelector(QtGui.QWidget): def __init__(self, repo_path): super(DataSelector,self).__init__() self.repo_path = repo_path self.data_from_fk = None self.createUI() self.fk_retriever = FKRetriever(self.repo_path) self.mapEvents() self.data_is_ready = False self.data = None self.validate_button.setEnabled(False) def createUI(self): self.group_box = QtGui.QGroupBox("Data Selector") self.page_selector = IconListBox() page_control_list = [ { "Name": "From Flipkart Using FSNs", "Icon": os.path.join("essentials","download.png") }, { "Name": "From CSV Data File", "Icon": os.path.join("essentials","csv_file.png") } ] self.page_selector.addElements(page_control_list) self.page_selector.setFixedSize(302,110) #FSN Mode Widget self.fsn_mode_widget = QtGui.QGroupBox("Data By FSN") self.fsn_text_edit = FSNTextEdit() self.fsn_text_edit.setFixedSize(450,400) self.category_label = QtGui.QLabel("Category:") self.category_combo_box = QtGui.QComboBox() self.category_combo_box.addItems(getCategoryFolderNames()) #Later, add this data from OINK's server. self.category_combo_box.setToolTip("Select the default category for the given FSNs.\nNote that mixing various types of FSNs isn't recommended.\nThe icons won't load.") self.attributes_list_box = QtGui.QListWidget() self.attributes_list_box.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.attributes_list_box.setToolTip("Displays all product attributes, obtained from the FK server.") self.primary_attributes_list_box = QtGui.QListWidget() self.primary_attributes_list_box.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.primary_attributes_list_box.setToolTip("Displays primary product attributes that you have selected.") self.secondary_attributes_list_box = QtGui.QListWidget() self.secondary_attributes_list_box.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.secondary_attributes_list_box.setToolTip("Displays secondary product attributes that you have selected.") self.push_to_primary_button = QtGui.QPushButton("Add to\nPrimary List") self.push_to_primary_button.setToolTip("Click to move the chosen attribute into the list of primary attributes.") self.remove_from_primary_button = QtGui.QPushButton("Remove from\nPrimary List") self.remove_from_primary_button.setToolTip("Click to move the chosen attribute out of the list of primary attributes.") self.push_to_secondary_button = QtGui.QPushButton("Add to\nSecondary List") self.push_to_secondary_button.setToolTip("Click to move the chosen attribute into the list of secondary attributes.") self.remove_from_secondary_button = QtGui.QPushButton("Remove from\nSecondary List") self.remove_from_secondary_button.setToolTip("Click to move the chosen attribute out of the list of secondary attributes.") #downloader self.fetch_images_attributes_button = QtGui.QPushButton("Download") self.fetch_images_attributes_button.setToolTip("This will check if parent images are available for all the FSNs and download them if necessary from the FK site. It will also load the spec table.") self.export_scraped_data_button = QtGui.QPushButton("Export Data") self.fetching_progress = ProgressBar() self.fetching_progress.setRange(0,100) self.fetching_progress.setValue(0) self.fetching_activity = QtGui.QLabel("All that is gold does not glitter!") self.fetching_activity.setStyleSheet("QLabel{font: 10px black; border: 1px solid black;}") self.fetching_activity.setToolTip("This indicates the current downloader's activity, or some random quote that Vinay thinks is funny.") self.completed_fsns_count_label = QtGui.QLabel("Completed:") self.completed_fsns_count_spinbox = QtGui.QSpinBox() self.completed_fsns_count_spinbox.setEnabled(False) self.eta_label = QtGui.QLabel("ETA:") self.eta_datetimeedit = QtGui.QDateTimeEdit() self.eta_datetimeedit.setEnabled(False) self.eta_datetimeedit.setMinimumDateTime(QtCore.QDateTime(datetime.datetime.now())) self.activity_log_textedit = QtGui.QTextEdit() self.activity_log_textedit.setReadOnly(True) self.pending_fsns_count_label = QtGui.QLabel("Pending:") self.pending_fsns_count_spinbox = QtGui.QSpinBox() self.pending_fsns_count_spinbox.setEnabled(False) self.failed_fsns_label = QtGui.QLabel("Failed:") self.failed_fsns_count_spinbox = QtGui.QSpinBox() self.failed_fsns_count_spinbox.setEnabled(False) self.completed_fsns_count_spinbox.setRange(0,99999999) self.pending_fsns_count_spinbox.setRange(0,99999999) self.failed_fsns_count_spinbox.setRange(0,99999999) self.pending_fsns_list_text_edit = QtGui.QTextEdit() self.pending_fsns_list_text_edit.setReadOnly(True) self.completed_fsns_list_text_edit = QtGui.QTextEdit() self.completed_fsns_list_text_edit.setReadOnly(True) self.failed_fsns_list_text_edit = QtGui.QTextEdit() self.failed_fsns_list_text_edit.setReadOnly(True) buttons_and_progress_bar = QtGui.QHBoxLayout() buttons_and_progress_bar.addWidget(self.fetch_images_attributes_button, 2) buttons_and_progress_bar.addWidget(self.export_scraped_data_button, 1) buttons_and_progress_bar.addWidget(self.fetching_progress, 4) completed_tracking = QtGui.QVBoxLayout() completed_tracking.addWidget(self.completed_fsns_count_label) completed_tracking.addWidget(self.completed_fsns_count_spinbox) completed_tracking.addWidget(self.completed_fsns_list_text_edit) eta_layout = QtGui.QHBoxLayout() eta_layout.addWidget(self.eta_label) eta_layout.addWidget(self.eta_datetimeedit) pending_tracking = QtGui.QVBoxLayout() pending_tracking.addWidget(self.pending_fsns_count_label) pending_tracking.addWidget(self.pending_fsns_count_spinbox) pending_tracking.addWidget(self.pending_fsns_list_text_edit) pending_tracking.addLayout(eta_layout) failed_tracking = QtGui.QVBoxLayout() failed_tracking.addWidget(self.failed_fsns_label) failed_tracking.addWidget(self.failed_fsns_count_spinbox) failed_tracking.addWidget(self.failed_fsns_list_text_edit) fsns_tracking = QtGui.QHBoxLayout() fsns_tracking.addLayout(completed_tracking) fsns_tracking.addLayout(pending_tracking) fsns_tracking.addLayout(failed_tracking) downloader_layout = QtGui.QVBoxLayout() downloader_layout.addLayout(buttons_and_progress_bar) downloader_layout.addLayout(fsns_tracking) downloader_layout.addWidget(self.fetching_activity) downloader = QtGui.QWidget() downloader.setLayout(downloader_layout) downloader_tabs = QtGui.QTabWidget() downloader_tabs.addTab(downloader, "Downloader") downloader_tabs.addTab(self.activity_log_textedit, "Log") self.fsn_mode_data_options = QtGui.QGroupBox("Data Options") fsn_mode_data_options_layout = QtGui.QGridLayout() fsn_mode_data_options_layout.addWidget(self.category_label,0,0,1,2, QtCore.Qt.AlignVCenter) fsn_mode_data_options_layout.addWidget(self.category_combo_box,0,2,1,2,QtCore.Qt.AlignVCenter) fsn_mode_data_options_layout.addWidget(self.attributes_list_box,1,0,4,4, QtCore.Qt.AlignHCenter) fsn_mode_data_options_layout.addWidget(self.primary_attributes_list_box,1,5,2,2, QtCore.Qt.AlignHCenter) fsn_mode_data_options_layout.addWidget(self.push_to_primary_button,1,4,1,1, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) fsn_mode_data_options_layout.addWidget(self.remove_from_primary_button,2,4,1,1, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) fsn_mode_data_options_layout.addWidget(self.secondary_attributes_list_box,3,5,2,2, QtCore.Qt.AlignHCenter) fsn_mode_data_options_layout.addWidget(self.push_to_secondary_button,3,4,1,1, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) fsn_mode_data_options_layout.addWidget(self.remove_from_secondary_button,4,4,1,1, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) self.fsn_mode_data_options.setLayout(fsn_mode_data_options_layout) self.fsn_mode_data_options.setEnabled(False) fsn_mode_layout = QtGui.QGridLayout() fsn_mode_layout.addWidget(self.fsn_text_edit,0,0,7,1) downloader_tabs fsn_mode_layout.addWidget(downloader_tabs,0,1,2,5, QtCore.Qt.AlignBottom) #fsn_mode_layout.addWidget(self.fetch_images_attributes_button,0,1,1,2, QtCore.Qt.AlignBottom) #fsn_mode_layout.addWidget(self.fetching_progress,0,3,1,5, QtCore.Qt.AlignBottom) #fsn_mode_layout.addWidget(self.fetching_activity,1,3,1,5, QtCore.Qt.AlignTop) #fsn_mode_layout.addWidget(self.export_scraped_data_button,1,1,1,2, QtCore.Qt.AlignTop) fsn_mode_layout.addWidget(self.fsn_mode_data_options,2,1,5,7, QtCore.Qt.AlignTop) self.fsn_mode_widget.setLayout(fsn_mode_layout) self.fsn_mode_scroll_view = QtGui.QScrollArea() self.fsn_mode_scroll_view.setWidget(self.fsn_mode_widget) self.fsn_mode_scroll_view.setWidgetResizable(True) self.fsn_mode_scroll_view.setFixedHeight(400) #CSV Mode Widget self.csv_mode_widget = QtGui.QWidget() self.input_data_set_button = ImageButton(os.path.join("essentials","csv_file.png"), 50, 50) self.input_data_set_button.setToolTip("Click to select a data file if you want manual control.") self.check_icons_button = QtGui.QPushButton("Check Icon Availability\nand Export Report") csv_mode_layout = QtGui.QHBoxLayout() csv_mode_layout.addStretch(1) csv_mode_layout.addWidget(self.input_data_set_button,0) csv_mode_layout.addWidget(self.check_icons_button,0) csv_mode_layout.addStretch(1) self.csv_mode_widget.setLayout(csv_mode_layout) self.fsn_or_csv_stacked_widget = QtGui.QStackedWidget() self.fsn_or_csv_stacked_widget.addWidget(self.fsn_mode_scroll_view) self.fsn_or_csv_stacked_widget.addWidget(self.csv_mode_widget) self.validate_button = ImageButton(os.path.join("essentials","validate.png"),50,50) layout = QtGui.QGridLayout() layout.addWidget(self.page_selector,0,0,1,2, QtCore.Qt.AlignHCenter) layout.addWidget(self.fsn_or_csv_stacked_widget,1,0,1,2) layout.addWidget(self.validate_button,3,1) self.group_box.setLayout(layout) final_layout = QtGui.QHBoxLayout() final_layout.addWidget(self.group_box) self.setLayout(final_layout) def mapEvents(self): self.page_selector.currentItemChanged.connect(self.changePage) self.input_data_set_button.clicked.connect(self.loadDataFromFile) self.fetch_images_attributes_button.clicked.connect(self.downloadFromFK) self.fk_retriever.sendData.connect(self.prepareDataRetrievedFromFK) self.fk_retriever.sendException.connect(self.postException) self.push_to_primary_button.clicked.connect(self.pushAttrToPrimary) self.remove_from_primary_button.clicked.connect(self.removeFromPrimary) self.push_to_secondary_button.clicked.connect(self.pushAttrToSecondary) self.remove_from_secondary_button.clicked.connect(self.removeFromSecondary) self.category_combo_box.currentIndexChanged.connect(self.changeCategory) self.export_scraped_data_button.clicked.connect(self.exportData) self.check_icons_button.clicked.connect(self.checkIconsAvailability) def checkIconsAvailability(self): import pandas as pd import xlsxwriter import Katana data = self.getData() icons = {} repo_path = str(QtGui.QFileDialog.getExistingDirectory(self, "Select the repository folder.", os.getcwd(), QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontResolveSymlinks)) if not repo_path: repo_path = os.path.join(os.getcwd(), "Images","Repository") for fsn_row in self.getData(): category = fsn_row["Category"] for key in fsn_row.keys(): if "Attribute" in key: attribute = fsn_row[key].strip() if attribute.strip() != "": icon_status, folders = Katana.checkIcon(attribute, category, repository_path=repo_path) if attribute not in icons.keys(): icons[attribute] = { "Category": category, "Icon in Folder(s)": folders } else: if category not in icons[attribute]["Category"]: icons[attribute]["Category"] = icons[attribute]["Category"] + ", " +category icons[attribute]["Icon in Folder(s)"] = [folder for folder in list(set(icons[attribute]["Icon in Folder(s)"] + folders)) if len(folder)>0] icons_data_frame = pd.DataFrame.from_dict(icons) icons_data_frame = icons_data_frame.apply(self.getMeaningfulPathText,axis=0) file_path = os.path.join(os.getcwd(),"cache","Icon_Search_Results_%s.csv"%datetime.datetime.now().strftime("%y%m%d_%H%M%S")) #file_handler = pd.ExcelWriter(file_path,engine="xlsxwriter") icons_data_frame.T.to_csv(file_path) os.startfile(file_path,"open") #icons_data_frame.to_excel(file_handler, "Sheet1") #file_handler.save() # print "Saved file to %s!"%file_path def getMeaningfulPathText(self, text): if type(text["Icon in Folder(s)"]) == str: return text elif type(text["Icon in Folder(s)"]) == list: if len(text["Icon in Folder(s)"]) == 0: text["Icon in Folder(s)"] = "No Icons Available." else: text["Icon in Folder(s)"] = ", ".join(text["Icon in Folder(s)"]) else: print "What happened?" print text return text def exportData(self): import pandas as pd import xlsxwriter #Get the output location. output_path = str(QtGui.QFileDialog.getExistingDirectory(self, "Select the output folder.", os.getcwd(), QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontResolveSymlinks)) #Calculate the different types of FSNs based on prefix. if output_path: file_path = os.path.join(output_path,"flipkart_data_%s.xlsx"%datetime.datetime.now().strftime("%Y%m%d_%H%M%S")) file_handler = pd.ExcelWriter(file_path,engine="xlsxwriter") fsns_list = self.data_from_fk.keys() prefixes = list(set([fsn[:3] for fsn in fsns_list])) prefixes.sort() seggregated_data_set = {} #Split data based on FSN prefix. for prefix in prefixes: valid_fsns = [fsn for fsn in fsns_list if prefix==fsn[:3]] seggregated_data_set[prefix] = {} for fsn in valid_fsns: seggregated_data_set[prefix][fsn] = self.data_from_fk[fsn] #Create dataframes for each data set. prefix_data_set = pd.DataFrame.from_dict(seggregated_data_set[prefix]) #Save the dataframe in an excel file with the entire dataset in one sheet, #and individual sheets containing prefix-wise data, stored in the output folder. prefix_data_set.T.to_excel(file_handler, prefix) file_handler.save() pd.DataFrame.from_dict(self.data_from_fk).T.to_csv(os.path.join(output_path,"flipkart_data_%s.csv"%datetime.datetime.now().strftime("%Y%m%d_%H%M%S"))) os.startfile(file_path,"open") self.sendAlert("Success","Success exported data for %d possible verticals into %s."%(len(prefixes),os.path.basename(file_path))) # data_frame = pd.DataFrame.from_dict(self.data_from_fk).transpose() # data_frame.to_csv("something.csv") #get save file name #dump data into said file. def postException(self, error_msg): message = "%s @%s"%(error_msg,datetime.datetime.now().strftime("%H:%M:%S")) self.fetching_activity.setText(message) self.activity_log_textedit.append(message) def pushAttrToPrimary(self): self.pushFromTo(self.attributes_list_box,self.primary_attributes_list_box) def removeFromPrimary(self): self.pushFromTo(self.primary_attributes_list_box,self.attributes_list_box) def pushAttrToSecondary(self): self.pushFromTo(self.attributes_list_box,self.secondary_attributes_list_box) def removeFromSecondary(self): self.pushFromTo(self.secondary_attributes_list_box,self.attributes_list_box) def pushFromTo(self,source_list_widget, destination_list_widget): #identify the selected attributes selected_attribute_items = source_list_widget.selectedItems() #Store them in a list. selected_attributes = [str(selected_attribute_item.text()) for selected_attribute_item in selected_attribute_items] #Send them to the destination list. destination_list_widget.setSortingEnabled(False) destination_list_widget.addItems(selected_attributes) destination_list_widget.setSortingEnabled(True) destination_list_widget.sortItems() #Remove them from the source list for selected_item in selected_attribute_items: source_list_widget.takeItem(source_list_widget.row(selected_item)) self.makeDataFile() def makeDataFile(self): """Creates a list of dictionaries for the FSNs, using the retrieved data.""" #Extract the primary and secondary attributes. primary_attributes = [str(self.primary_attributes_list_box.item(list_index).text()) for list_index in range(self.primary_attributes_list_box.count())] secondary_attributes = [str(self.secondary_attributes_list_box.item(list_index).text()) for list_index in range(self.secondary_attributes_list_box.count())] #algorithm #Build a list of dictionaries with the following structure: output_data_format = [ { "FSN": None, "Category": None, "Primary USP-1 Attribute": None, "Primary USP-1 Description Text":None, "Primary USP-2 Attribute": None, "Primary USP-2 Description Text":None, "Secondary USP-1 Attribute": None, "Secondary USP-1 Description Text":None, "Secondary USP-2 Attribute": None, "Secondary USP-2 Description Text":None, } ] #In doing this, check if FSNs have far too many attributes selected, or if they have none at all. #To check, see if the attribute is in the fsn_data_set that FKRetriever passes. #End algorithm output_data = [] category = str(self.category_combo_box.currentText()) if self.data_from_fk is None: self.sendAlert("Cowabunga!","Something seems to be wrong. This situation shouldn't ever happen. If there are attributes populated in the list widgets, then this shouldn't ever happen. This indicates that Leonardo failed to retrieve information from the Flipkart website or API. But if the attributes list widgets are populated, then this is ridiculously impossible.") else: never = False if (len(primary_attributes)>0) and (len(secondary_attributes)>0): #loop through each fsn key. invalid_fsns = [] total_fsns = len(self.data_from_fk.keys()) for fsn in self.data_from_fk: fsn_data = self.data_from_fk[fsn] fsn_attributes_mapping = { "FSN": fsn, "Category": category } primary_attribute_counter = 0 for primary_attribute in primary_attributes: if primary_attribute in fsn_data.keys(): primary_attribute_counter += 1 attr_key = "Primary USP-%d Attribute"%primary_attribute_counter descr_key = "Primary USP-%d Description Text"%primary_attribute_counter #Check if the icon exists. If it doesn't compile a list of icons required. #icon_available = checkIcon(attr_key,descr_key) fsn_attributes_mapping.update({attr_key:primary_attribute,descr_key: fsn_data[primary_attribute]}) secondary_attribute_counter = 0 for secondary_attribute in secondary_attributes: if secondary_attribute in fsn_data.keys(): secondary_attribute_counter += 1 attr_key = "Secondary USP-%d Attribute"%secondary_attribute_counter descr_key = "Secondary USP-%d Description Text"%secondary_attribute_counter #Check if the icon exists. If it doesn't compile a list of icons required. #icon_available = checkIcon(attr_key,descr_key) fsn_attributes_mapping.update({attr_key:secondary_attribute,descr_key: fsn_data[secondary_attribute]}) if (primary_attribute_counter == 0) or (secondary_attribute_counter == 0): invalid_fsns.append(fsn) output_data.append(fsn_attributes_mapping) if len(invalid_fsns)>0: message = "There are %d fsns without enough primary or secondary attributes. Trying this process for FSNs of mixed category\sub-category isn't recommended." %len(invalid_fsns) self.sendAlert("Uh-oh!",message) self.validate_button.setStyleSheet("background-color: #B22222") self.validate_button.setEnabled(False) else: self.data = output_data self.validate_button.setEnabled(True) self.validate_button.setStyleSheet("QPushButton{background-color: #458B00} QPushButton:hover{background-color: #78AB46};") elif never: #(len(primary_attributes) == 0) or (len(secondary_attributes) == 0): #This could be a problem in runtime. Disabling for now. self.sendAlert("Cowabunga!","Please promote some attributes to primary and secondary positions. If you don't want to use secondary attributes, just add one anyway, and select equal relative icon sizes later.") def changeCategory(self): self.makeDataFile() def sendAlert(self, title, message): QtGui.QMessageBox.about(self, title, message) def downloadFromFK(self): """Triggers FKRetriever.""" fsns = self.fsn_text_edit.getFSNs() self.fetch_images_attributes_button.setEnabled(False) if len(fsns) >=1: self.fetching_activity.setText("Preparing to download images and specifications off the Flipkart website!") self.fk_retriever.fsn_list = fsns self.fk_retriever.allow_run = True else: print "No FSNS to process." def prepareDataRetrievedFromFK(self, status, data_set, progress_value, fsn_lists, completion_status, eta): """Gets data from FK from the thread's signal and prepares it.""" self.fetching_progress.setValue(progress_value) eta_string = eta.strftime("%a (%d-%b), %H:%M:%S") self.putAttributes(data_set) self.data_from_fk = data_set now_string = datetime.datetime.now().strftime("(%d-%b), %H:%M:%S") completed_fsns = fsn_lists[0] pending_fsns = fsn_lists[1] failed_fsns = fsn_lists[2] self.completed_fsns_count_spinbox.setValue(len(completed_fsns)) self.pending_fsns_count_spinbox.setValue(len(pending_fsns)) self.failed_fsns_count_spinbox.setValue(len(failed_fsns)) self.completed_fsns_list_text_edit.setText("\n".join(completed_fsns)) self.pending_fsns_list_text_edit.setText("\n".join(pending_fsns)) self.failed_fsns_list_text_edit.setText("\n".join(failed_fsns)) self.eta_datetimeedit.setDateTime(QtCore.QDateTime(eta)) if completion_status: self.fetching_progress.setFormat("%d%% (Completed at %s)"%(progress_value, now_string)) message = "Completed at %s."%now_string self.fsn_mode_data_options.setEnabled(True) self.fetch_images_attributes_button.setEnabled(True) self.sendAlert("Cowabunga!","Completed fetching data and images for the given list.") else: self.fetching_progress.setFormat("%d%% @(%s)"%(progress_value, now_string)) message = "%s ETA: %s"%(status, eta_string) self.fsn_mode_data_options.setEnabled(False) self.fetching_activity.setText(message) self.activity_log_textedit.append(message) def putAttributes(self, data_set): attributes = [] for fsn in data_set: attributes+=data_set[fsn].keys() attributes = list(set(attributes)) self.attributes_list_box.setSortingEnabled(False) self.attributes_list_box.clear() self.primary_attributes_list_box.clear() self.secondary_attributes_list_box.clear() self.attributes_list_box.addItems(attributes) self.attributes_list_box.setSortingEnabled(True) self.attributes_list_box.sortItems() def getData(self): return self.data def changePage(self, current, previous): if not current: current = previous self.fsn_or_csv_stacked_widget.setCurrentIndex(self.page_selector.row(current)) def loadDataFromFile(self): """This method asks for a csv data file. Upon loading, it'll read the file, check it and declare whether it's valid or not. It does it based on: 1. File headers: FSN, Brand, Category, Primary USP[1-5] Attribute; Primary USP[1-5] Description; Secondary USP[1-5] Attribute; Secondary USP[1-5] Description; 2. At least 1 row of data. """ #Get the file name. data_file_name = str(QtGui.QFileDialog.getOpenFileName(self,"Open Data File",os.getcwd(),("Comma Separated Values Files (*.csv)"))) if data_file_name: #Load the file. data_file_handler = open(data_file_name,"r") data_file_as_csv = csv.DictReader(data_file_handler) file_headers = [] for row in data_file_as_csv: file_headers = row.keys() file_headers.sort() required_file_headers = [ "FSN","Brand","Category", "Primary USP-1 Attribute","Primary USP-1 Description Text", "Primary USP-2 Attribute","Primary USP-2 Description Text", "Primary USP-3 Attribute","Primary USP-3 Description Text", "Primary USP-4 Attribute","Primary USP-4 Description Text", "Primary USP-5 Attribute","Primary USP-5 Description Text", "Secondary USP-1 Attribute","Secondary USP-1 Description Text", "Secondary USP-2 Attribute","Secondary USP-2 Description Text", "Secondary USP-3 Attribute","Secondary USP-3 Description Text", "Secondary USP-4 Attribute","Secondary USP-4 Description Text", "Secondary USP-5 Attribute","Secondary USP-5 Description Text" ] required_file_headers.sort() data_is_valid = True for header in required_file_headers: if header not in file_headers: data_is_valid = False self.sendAlert("Wrong Data set.", "%s column is required!"%header) break if data_is_valid: data_file_handler.seek(0) next(data_file_handler) #0 has the header, so go to row 1. self.data = [] for row in data_file_as_csv: if len(row["FSN"].strip()) > 0: self.data.append(row) if len(self.data)>0: self.data_is_ready = True self.sendAlert("Success", "%d FSNs have been uploaded from the provided dataset"%len(self.data)) self.validate_button.setEnabled(True) self.validate_button.setStyleSheet("QPushButton{background-color: #458B00} QPushButton:hover{background-color: #78AB46};") else: self.data_is_ready = False self.sendAlert("No FSNs in the data set", "The Data set has the right columns but it appears to not have any rows with data.") self.validate_button.setStyleSheet("background-color: #B22222") self.validate_button.setStyleSheet("background-color: #B22222") else: self.validate_button.setStyleSheet("background-color: #B22222") self.validate_button.setEnabled(False) data_file_handler.close()
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))
def __init__(self, img1, img2): self.__active = False ImageButton.__init__(self, img1, img2, True) self.connect_clicked(self.__on_click)
def do_init(self, db): self.player_started_game = 'X' self.btn_exit = self.text_button(0, 0, 150, 40, "Exit") # self.btn_exit.set_color("lightblue", "black") self.btn_new_game = self.text_button(self.WIN_WIDTH - 150, 0, 150, 40, "Neues Spiel") self.btn_opponent = self.text_button(self.WIN_WIDTH-40, self.WIN_HEIGHT-40, 40, 40, "M") x = 10 w = 200 self.players = {} for i, name in enumerate(["X", "O"]): profile_image = get_next_icon_filename(None) y = 100 name_lbl = self.text_button(x, y, w, 40, name) name_lbl.set_font(self.STATUS_FONT) y += 60 profile = ImageButton(self.canvas, x, y, w, 150) profile.set_color("black", "black") y += 150 cnt_lbl = self.text_button(x, y, w, 60, "0") cnt_lbl.set_font(self.STATUS_FONT) cnt_lbl.set_color("green", "black") self.players[name] = { "name": name_lbl, "cnt": 0, "cnt_lbl": cnt_lbl, "profile": profile, "profile_image": profile_image, "human_image": profile_image, "computer_image": "player_Computer.png", } x = self.WIN_WIDTH - w - 10 # explicitly set player profile images self.players["X"]["profile_image"] = self.get_setting(self.SETTING_PLAYER_X, self.players["X"]["profile_image"]) self.players["O"]["profile_image"] = self.get_setting(self.SETTING_PLAYER_O, self.players["O"]["profile_image"]) for _, player in self.players.items(): if player["profile_image"] is not None: self.__set_player_profile(player, player["profile_image"], True) # remis remis_cnt_lbl = self.text_button(self.WIN_WIDTH/2-w/2, self.WIN_HEIGHT - 50, w, 40, "0") remis_cnt_lbl.set_color("green", "black") remis_name_lbl = self.text_button(self.WIN_WIDTH/2-w/2, self.WIN_HEIGHT - 90, w, 40, "Unentschieden") self.players["U"] = { "cnt": 0, "cnt_lbl": remis_cnt_lbl, "name": remis_name_lbl, } left = (self.WIN_WIDTH - 3 * self.BTN_SIZE) / 2 self.lbl_status = self.text_button(self.WIN_WIDTH/2-150, 0, 300, 60, "") self.lbl_status.set_color("red", "black") self.lbl_status.set_font(self.STATUS_FONT) self.buttons = [] x = left y = (self.WIN_HEIGHT - 3 * self.BTN_SIZE) / 2 for i in range(1, 10): btn = self.text_button(x, y, self.BTN_SIZE, self.BTN_SIZE, "") btn.set_font(self.BIG_BUTTON_FONT) self.buttons.append(btn) x += self.BTN_SIZE if (i % 3) == 0: x = left y += self.BTN_SIZE
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)
def createUI(self): self.users_list_label = QtGui.QLabel("Users: ") self.users_list_view = QtGui.QListWidget() self.add_employee_button = ImageButton( os.path.join("Images","add.png"), 48, 48, os.path.join("Images","add_mouseover.png") ) self.edit_employee_button = ImageButton( os.path.join("Images","modify.png"), 48, 48, os.path.join("Images","modify_mouseover.png") ) self.edit_employee_button.setCheckable(True) self.add_employee_button.setCheckable(True) self.button_group = QtGui.QButtonGroup() self.button_group.addButton(self.edit_employee_button) self.button_group.addButton(self.add_employee_button) self.button_group.setExclusive(True) user_list_buttons_layout = QtGui.QHBoxLayout() user_list_buttons_layout.addWidget(self.add_employee_button,0) user_list_buttons_layout.addWidget(self.edit_employee_button,0) users_list_layout = QtGui.QVBoxLayout() users_list_layout.addWidget(self.users_list_label,0) users_list_layout.addWidget(self.users_list_view,3) users_list_layout.addLayout(user_list_buttons_layout,1) users_list_layout.addStretch(1) self.employee_id_label = QtGui.QLabel("Employee ID") self.employee_id_lineedit = QtGui.QLineEdit() self.employee_name_label = QtGui.QLabel("Name") self.employee_name_lineedit = QtGui.QLineEdit() name_id_row = QtGui.QHBoxLayout() name_id_row.addWidget(self.employee_id_label,0) name_id_row.addWidget(self.employee_id_lineedit,2) name_id_row.addWidget(self.employee_name_label,0) name_id_row.addWidget(self.employee_name_lineedit,2) self.email_label = QtGui.QLabel("Email ID:") self.email_lineedit = QtGui.QLineEdit() email_row = QtGui.QHBoxLayout() email_row.addWidget(self.email_label,0) email_row.addWidget(self.email_lineedit,2) self.current_role_label = QtGui.QLabel("Role:") self.current_role_combobox = QtGui.QComboBox() current_role_row = QtGui.QHBoxLayout() current_role_row.addWidget(self.current_role_label,0) current_role_row.addWidget(self.current_role_combobox,1) self.doj_label = QtGui.QLabel("Date of Joining:") self.doj_dateedit = FormattedDateEdit() self.dol_checkbox = QtGui.QCheckBox("Last Working Date:") self.dol_checkbox.setToolTip("Check to mark the LWD of this employee.\nLeave unchecked if the employee is still in the team.") self.dol_dateedit = FormattedDateEdit() self.doj_dateedit.setCalendarPopup(True) self.dol_dateedit.setCalendarPopup(True) doj_dol_row = QtGui.QHBoxLayout() doj_dol_row.addWidget(self.doj_label, 0) doj_dol_row.addWidget(self.doj_dateedit, 0) doj_dol_row.addWidget(self.dol_checkbox, 0) doj_dol_row.addWidget(self.dol_dateedit, 0) self.former_role_label = QtGui.QLabel("Former Role:") self.former_role_combobox = QtGui.QComboBox() self.dop_checkbox = QtGui.QCheckBox("Promoted") self.dop_checkbox.setToolTip("Check this to record a promotion and keep details of the former role.") self.dop_label = QtGui.QLabel("Date of Promotion:") self.dop_dateedit = FormattedDateEdit() self.dop_dateedit.setCalendarPopup(True) promotion_row = QtGui.QHBoxLayout() promotion_row.addWidget(self.dop_checkbox, 0) promotion_row.addWidget(self.dop_label, 0) promotion_row.addWidget(self.dop_dateedit, 1) promotion_row.addWidget(self.former_role_label, 0) promotion_row.addWidget(self.former_role_combobox, 1) self.access_label = QtGui.QLabel("OINK Application Access") self.access_combobox = CheckableComboBox("Applications") self.access_combobox.addItems(["PORK","BACON","VINDALOO"]) access_row = QtGui.QHBoxLayout() access_row.addWidget(self.access_label,0) access_row.addWidget(self.access_combobox,2) access_row.addStretch(1) self.reset_password_button = QtGui.QPushButton("Reset Password") self.save_button = QtGui.QPushButton("Save") self.reset_button = QtGui.QPushButton("Revert") form_buttons_layout = QtGui.QHBoxLayout() form_buttons_layout.addStretch(2) form_buttons_layout.addWidget(self.reset_password_button,0) form_buttons_layout.addWidget(self.save_button,0) form_buttons_layout.addWidget(self.reset_button,0) self.progress_bar = ProgressBar() self.status_label = QtGui.QLabel() self.manager_mapping = CopiableQTableWidget(0,0) self.manager_name_label = QtGui.QLabel("Reporting Manager:") self.manager_name_combobox = QtGui.QComboBox() self.manager_effective_date_label = QtGui.QLabel("Revision Date:") self.manager_effective_dateedit = FormattedDateEdit() self.manager_effective_dateedit.setDate(datetime.date.today()) self.manager_effective_dateedit.setCalendarPopup(True) self.add_new_manager_mapping_row = QtGui.QPushButton("Add or Update") self.remove_manager_mapping_row = QtGui.QPushButton("Remove") manager_mapping_form = QtGui.QHBoxLayout() manager_mapping_form.addWidget(self.manager_name_label,0) manager_mapping_form.addWidget(self.manager_name_combobox,2) manager_mapping_form.addWidget(self.manager_effective_date_label,0) manager_mapping_form.addWidget(self.manager_effective_dateedit,1) manager_mapping_form.addWidget(self.add_new_manager_mapping_row,0) manager_mapping_form.addWidget(self.remove_manager_mapping_row,0) user_data_form_layout = QtGui.QVBoxLayout() user_data_form_layout.addLayout(name_id_row,0) user_data_form_layout.addLayout(email_row,0) user_data_form_layout.addLayout(current_role_row,0) user_data_form_layout.addLayout(doj_dol_row,0) user_data_form_layout.addLayout(promotion_row,0) user_data_form_layout.addLayout(access_row,0) user_data_form_layout.addLayout(form_buttons_layout,0) user_data_form_layout.addWidget(self.manager_mapping,1) user_data_form_layout.addLayout(manager_mapping_form,0) user_data_form_layout.addStretch(1) user_data_form_layout.addWidget(self.progress_bar,0) user_data_form_layout.addWidget(self.status_label,0) user_data_form = QtGui.QGroupBox("User Information:") user_data_form.setLayout(user_data_form_layout) layout = QtGui.QHBoxLayout() layout.addLayout(users_list_layout,1) layout.addWidget(user_data_form,2) self.central_widget = QtGui.QWidget() self.central_widget.setLayout(layout) self.setCentralWidget(self.central_widget) self.setWindowTitle("OINK User Manager") self.setWindowIcon(QtGui.QIcon(os.path.join('Images','PORK_Icon.png'))) self.show()
class UserManager(QtGui.QMainWindow): def __init__(self, user_id, password,*args, **kwargs): super(UserManager, self).__init__(*args, **kwargs) self.user_id, self.password = user_id, password #get the list of users from MOSES. self.refreshData() self.createUI() self.mapEvents() self.initialize() def refreshData(self): self.employees_data = MOSES.getEmployeesList(self.user_id, self.password) self.manager_mapping_data = MOSES.getManagerMappingTable(self.user_id, self.password) def createUI(self): self.users_list_label = QtGui.QLabel("Users: ") self.users_list_view = QtGui.QListWidget() self.add_employee_button = ImageButton( os.path.join("Images","add.png"), 48, 48, os.path.join("Images","add_mouseover.png") ) self.edit_employee_button = ImageButton( os.path.join("Images","modify.png"), 48, 48, os.path.join("Images","modify_mouseover.png") ) self.edit_employee_button.setCheckable(True) self.add_employee_button.setCheckable(True) self.button_group = QtGui.QButtonGroup() self.button_group.addButton(self.edit_employee_button) self.button_group.addButton(self.add_employee_button) self.button_group.setExclusive(True) user_list_buttons_layout = QtGui.QHBoxLayout() user_list_buttons_layout.addWidget(self.add_employee_button,0) user_list_buttons_layout.addWidget(self.edit_employee_button,0) users_list_layout = QtGui.QVBoxLayout() users_list_layout.addWidget(self.users_list_label,0) users_list_layout.addWidget(self.users_list_view,3) users_list_layout.addLayout(user_list_buttons_layout,1) users_list_layout.addStretch(1) self.employee_id_label = QtGui.QLabel("Employee ID") self.employee_id_lineedit = QtGui.QLineEdit() self.employee_name_label = QtGui.QLabel("Name") self.employee_name_lineedit = QtGui.QLineEdit() name_id_row = QtGui.QHBoxLayout() name_id_row.addWidget(self.employee_id_label,0) name_id_row.addWidget(self.employee_id_lineedit,2) name_id_row.addWidget(self.employee_name_label,0) name_id_row.addWidget(self.employee_name_lineedit,2) self.email_label = QtGui.QLabel("Email ID:") self.email_lineedit = QtGui.QLineEdit() email_row = QtGui.QHBoxLayout() email_row.addWidget(self.email_label,0) email_row.addWidget(self.email_lineedit,2) self.current_role_label = QtGui.QLabel("Role:") self.current_role_combobox = QtGui.QComboBox() current_role_row = QtGui.QHBoxLayout() current_role_row.addWidget(self.current_role_label,0) current_role_row.addWidget(self.current_role_combobox,1) self.doj_label = QtGui.QLabel("Date of Joining:") self.doj_dateedit = FormattedDateEdit() self.dol_checkbox = QtGui.QCheckBox("Last Working Date:") self.dol_checkbox.setToolTip("Check to mark the LWD of this employee.\nLeave unchecked if the employee is still in the team.") self.dol_dateedit = FormattedDateEdit() self.doj_dateedit.setCalendarPopup(True) self.dol_dateedit.setCalendarPopup(True) doj_dol_row = QtGui.QHBoxLayout() doj_dol_row.addWidget(self.doj_label, 0) doj_dol_row.addWidget(self.doj_dateedit, 0) doj_dol_row.addWidget(self.dol_checkbox, 0) doj_dol_row.addWidget(self.dol_dateedit, 0) self.former_role_label = QtGui.QLabel("Former Role:") self.former_role_combobox = QtGui.QComboBox() self.dop_checkbox = QtGui.QCheckBox("Promoted") self.dop_checkbox.setToolTip("Check this to record a promotion and keep details of the former role.") self.dop_label = QtGui.QLabel("Date of Promotion:") self.dop_dateedit = FormattedDateEdit() self.dop_dateedit.setCalendarPopup(True) promotion_row = QtGui.QHBoxLayout() promotion_row.addWidget(self.dop_checkbox, 0) promotion_row.addWidget(self.dop_label, 0) promotion_row.addWidget(self.dop_dateedit, 1) promotion_row.addWidget(self.former_role_label, 0) promotion_row.addWidget(self.former_role_combobox, 1) self.access_label = QtGui.QLabel("OINK Application Access") self.access_combobox = CheckableComboBox("Applications") self.access_combobox.addItems(["PORK","BACON","VINDALOO"]) access_row = QtGui.QHBoxLayout() access_row.addWidget(self.access_label,0) access_row.addWidget(self.access_combobox,2) access_row.addStretch(1) self.reset_password_button = QtGui.QPushButton("Reset Password") self.save_button = QtGui.QPushButton("Save") self.reset_button = QtGui.QPushButton("Revert") form_buttons_layout = QtGui.QHBoxLayout() form_buttons_layout.addStretch(2) form_buttons_layout.addWidget(self.reset_password_button,0) form_buttons_layout.addWidget(self.save_button,0) form_buttons_layout.addWidget(self.reset_button,0) self.progress_bar = ProgressBar() self.status_label = QtGui.QLabel() self.manager_mapping = CopiableQTableWidget(0,0) self.manager_name_label = QtGui.QLabel("Reporting Manager:") self.manager_name_combobox = QtGui.QComboBox() self.manager_effective_date_label = QtGui.QLabel("Revision Date:") self.manager_effective_dateedit = FormattedDateEdit() self.manager_effective_dateedit.setDate(datetime.date.today()) self.manager_effective_dateedit.setCalendarPopup(True) self.add_new_manager_mapping_row = QtGui.QPushButton("Add or Update") self.remove_manager_mapping_row = QtGui.QPushButton("Remove") manager_mapping_form = QtGui.QHBoxLayout() manager_mapping_form.addWidget(self.manager_name_label,0) manager_mapping_form.addWidget(self.manager_name_combobox,2) manager_mapping_form.addWidget(self.manager_effective_date_label,0) manager_mapping_form.addWidget(self.manager_effective_dateedit,1) manager_mapping_form.addWidget(self.add_new_manager_mapping_row,0) manager_mapping_form.addWidget(self.remove_manager_mapping_row,0) user_data_form_layout = QtGui.QVBoxLayout() user_data_form_layout.addLayout(name_id_row,0) user_data_form_layout.addLayout(email_row,0) user_data_form_layout.addLayout(current_role_row,0) user_data_form_layout.addLayout(doj_dol_row,0) user_data_form_layout.addLayout(promotion_row,0) user_data_form_layout.addLayout(access_row,0) user_data_form_layout.addLayout(form_buttons_layout,0) user_data_form_layout.addWidget(self.manager_mapping,1) user_data_form_layout.addLayout(manager_mapping_form,0) user_data_form_layout.addStretch(1) user_data_form_layout.addWidget(self.progress_bar,0) user_data_form_layout.addWidget(self.status_label,0) user_data_form = QtGui.QGroupBox("User Information:") user_data_form.setLayout(user_data_form_layout) layout = QtGui.QHBoxLayout() layout.addLayout(users_list_layout,1) layout.addWidget(user_data_form,2) self.central_widget = QtGui.QWidget() self.central_widget.setLayout(layout) self.setCentralWidget(self.central_widget) self.setWindowTitle("OINK User Manager") self.setWindowIcon(QtGui.QIcon(os.path.join('Images','PORK_Icon.png'))) self.show() def mapEvents(self): self.users_list_view.itemSelectionChanged.connect(self.changedCurrentEmployee) self.dop_checkbox.toggled.connect(self.toggleDOP) self.dol_checkbox.toggled.connect(self.toggleDOL) self.reset_password_button.clicked.connect(self.resetPassword) self.manager_mapping.currentCellChanged.connect(self.populateManagerMappingForm) self.add_new_manager_mapping_row.clicked.connect(self.addUpdateManagerMapping) self.remove_manager_mapping_row.clicked.connect(self.removeManagerMapping) self.save_button.clicked.connect(self.saveSelectedEmployee) self.reset_button.clicked.connect(self.changedCurrentEmployee) self.add_employee_button.clicked.connect(self.changeMode) self.edit_employee_button.clicked.connect(self.changeMode) def saveSelectedEmployee(self): #First, build a dictionary with the former values. #Then, build a dictionary with the new values. #pass these dictionaries to a MOSES function. employee_id = str(self.employee_id_lineedit.text()).strip() employee_name = str(self.employee_name_lineedit.text()).strip() employee_email_id = str(self.email_lineedit.text()).strip() employee_role = str(self.current_role_combobox.currentText()).strip() employee_doj = self.doj_dateedit.date().toPyDate() employee_dol = self.dol_dateedit.date().toPyDate() if self.dol_checkbox.isChecked() else "NULL" employee_dop = self.dop_dateedit.date().toPyDate() if self.dop_checkbox.isChecked() else "NULL" employee_former_role = str(self.former_role_combobox.currentText()).strip() if self.dop_checkbox.isChecked() else "NULL" employee_oink_access = str(",".join(self.access_combobox.getCheckedItems())) if len(self.access_combobox.getCheckedItems())>0 else "Pork" if self.add_employee_button.isChecked(): mode = 1 else: mode = 0 if (employee_id in list(self.employees_data["Employee ID"])) and (mode == 1): self.alertMessage("Conflicting User ID","The User ID %s already exists in the system. You can't add another user with that Employee ID."%employee_id) else: employee_dict = { "Employee ID": employee_id, "Name": employee_name, "Email ID": employee_email_id, "Role": employee_role, "DOJ": employee_doj, "DOL": employee_dol, "Date of Promotion": employee_dop, "Former Role": employee_former_role, "OINK Access Level": ",".join(employee_oink_access) if type(employee_oink_access) == list else employee_oink_access } success = MOSES.createOrModifyEmployeeDetails(self.user_id, self.password, employee_dict, mode) if success: self.refreshData() self.initialize() self.populateEmployeesList() self.alertMessage("Success","Successfully completed the operation") else: self.alertMessage("Failure","Revenge is just the beginning.") def changeMode(self): if self.add_employee_button.isChecked(): self.employee_id_lineedit.setEnabled(True) elif self.edit_employee_button.isChecked(): self.employee_id_lineedit.setEnabled(False) def removeManagerMapping(self): failure = True employee_data = self.getEmployeeData(self.getSelectedEmployee()) if employee_data is not None: employee_id = employee_data["Employee ID"] reporting_manager_name = str(self.manager_name_combobox.currentText()) reporting_manager_data = self.getEmployeeData(reporting_manager_name) if reporting_manager_data is not None: reporting_manager_id = reporting_manager_data["Employee ID"] revision_date = self.manager_effective_dateedit.date().toPyDate() MOSES.removeFromManagerMapping(self.user_id, self.password, employee_id, reporting_manager_id, revision_date) self.changedCurrentEmployee() failure = False else: failure = True else: failure = True if failure: self.alertMessage("Failure","Please select a row that you'd like to delete. If you're having problems, select a cell in another row, then select a cell in the row you'd like to delete.") else: self.alertMessage("Success","Successfully removed a row from the Manager Mapping Table with the selected parameters.") def addUpdateManagerMapping(self): employee_id = self.getEmployeeData(self.getSelectedEmployee())["Employee ID"] reporting_manager_name = str(self.manager_name_combobox.currentText()) reporting_manager_id = self.getEmployeeData(reporting_manager_name)["Employee ID"] revision_date = self.manager_effective_dateedit.date().toPyDate() MOSES.addUpdateManagerMapping(self.user_id, self.password, employee_id, reporting_manager_id, revision_date) self.changedCurrentEmployee() self.alertMessage("Success","Successfully added a row into the Manager Mapping Table with the selected parameters.") def populateManagerMappingForm(self, row=None, column=None): rows = sorted(set(index.row() for index in self.manager_mapping.selectedIndexes())) manager = self.manager_mapping_data.loc[row] name = manager["Reporting Manager Name"] date_ = manager["Revision Date"] if name is not None: self.manager_name_combobox.setCurrentIndex(self.manager_name_combobox.findText(name)) else: self.manager_name_combobox.setCurrentIndex(-1) if date_ is not None: self.manager_effective_dateedit.setDate(date_) else: self.manager_effective_dateedit.setDate(datetime.date.today()) def resetPassword(self): current_employee_name = str(self.users_list_view.currentItem().text()) employee_data = self.getEmployeeData(current_employee_name) employee_id = employee_data["Employee ID"] MOSES.resetPassword(self.user_id, self.password, employee_id) self.alertMessage("Reset Password","Successfully reset %s's password to 'password'!"%(current_employee_name)) def alertMessage(self, title, message): QtGui.QMessageBox.about(self, title, message) def toggleDOP(self): if self.dop_checkbox.isChecked(): self.dop_dateedit.setEnabled(True) self.former_role_combobox.setEnabled(True) else: self.former_role_combobox.setCurrentIndex(-1) self.former_role_combobox.setEnabled(False) self.dop_dateedit.setEnabled(False) def toggleDOL(self): if self.dol_checkbox.isChecked(): self.dol_dateedit.setEnabled(True) else: self.dol_dateedit.setEnabled(False) def changedCurrentEmployee(self): self.showPage(self.getSelectedEmployee()) def showPage(self, employee_name): employee_data = self.getEmployeeData(employee_name) if employee_data is not None: self.employee_name_lineedit.setText(employee_data["Name"]) self.employee_id_lineedit.setText(employee_data["Employee ID"]) self.email_lineedit.setText(employee_data["Email ID"]) self.doj_dateedit.setDate(employee_data["DOJ"]) if employee_data["DOL"] is None: self.dol_checkbox.setChecked(False) else: self.dol_checkbox.setChecked(True) self.dol_dateedit.setDate(employee_data["DOL"]) self.current_role_combobox.setCurrentIndex(self.current_role_combobox.findText(employee_data["Role"])) if employee_data["Date of Promotion"] is None: self.dop_checkbox.setChecked(False) self.former_role_combobox.setCurrentIndex(-1) else: self.dop_checkbox.setChecked(True) self.dop_dateedit.setDate(employee_data["Date of Promotion"]) self.former_role_combobox.setCurrentIndex(self.former_role_combobox.findText(employee_data["Former Role"])) self.access_combobox.clearSelection() access_level = employee_data["Access Level"] if "," not in employee_data["Access Level"] else employee_data["Access Level"].split(",") self.access_combobox.select(access_level) self.toggleDOP() self.toggleDOL() self.manager_mapping_data = MOSES.getManagerMappingTable(self.user_id, self.password, employee_data["Employee ID"]) self.manager_mapping.showDataFrame(self.manager_mapping_data) self.manager_mapping.verticalHeader().setStretchLastSection(False) self.manager_mapping.verticalHeader().setResizeMode(QtGui.QHeaderView.ResizeToContents) self.manager_mapping.verticalHeader().setVisible(True) self.manager_mapping.horizontalHeader().setStretchLastSection(True) self.manager_mapping.horizontalHeader().setResizeMode(QtGui.QHeaderView.ResizeToContents) self.manager_mapping.horizontalHeader().setResizeMode(QtGui.QHeaderView.Interactive) self.manager_mapping.horizontalHeader().setVisible(True) self.manager_mapping.horizontalHeader().setStretchLastSection(False) self.manager_name_combobox.setCurrentIndex(-1) def getSelectedEmployee(self): return str(self.users_list_view.currentItem().text()) def getEmployeeData(self, employee_name): location_match = self.employees_data["Name"] == employee_name if True in set(location_match): employee_id = list(self.employees_data[location_match]["Employee ID"])[0] employee_name = list(self.employees_data[location_match]["Name"])[0] employee_email_id = list(self.employees_data[location_match]["Email ID"])[0] employee_doj = list(self.employees_data[location_match]["DOJ"])[0] employee_dol = list(self.employees_data[location_match]["DOL"])[0] employee_role = list(self.employees_data[location_match]["Role"])[0] employee_dop = list(self.employees_data[location_match]["Date of Promotion"])[0] employee_former_role = list(self.employees_data[location_match]["Former Role"])[0] employee_oink_access = list(self.employees_data[location_match]["OINK Access Level"])[0] data = { "Employee ID": employee_id, "Name": employee_name, "Email ID": employee_email_id, "DOJ": employee_doj, "DOL": employee_dol, "Role": employee_role, "Date of Promotion": employee_dop, "Former Role": employee_former_role, "Access Level": employee_oink_access } else: data = None return data def initialize(self): employees_list = list(set(self.employees_data["Name"])) employees_list.sort() self.users_list_view.clear() self.users_list_view.addItems(employees_list) self.manager_name_combobox.clear() self.manager_name_combobox.addItems(employees_list) roles = list(set(self.employees_data["Role"])) roles.sort() self.current_role_combobox.addItems(roles) self.former_role_combobox.addItems(roles) self.toggleDOL() self.toggleDOP() self.manager_name_combobox.setCurrentIndex(-1) self.manager_effective_dateedit.setDate(datetime.date.today()) self.edit_employee_button.setChecked(True) self.employee_id_lineedit.setEnabled(False) self.users_list_view.setCurrentRow(0) def populateEmployeesList(self): pass def addEmployee(self): pass def modifyEmployee(self): pass def resetEmployeePassword(self): pass def promoteEmployee(self): pass def populateReportingManagerList(self): pass
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))
class OpenglScreen(QtOpenGL.QGLWidget): SELECT_SCREEN = 1 INTRO_SCREEN_1 = 2 INTRO_SCREEN_2 = 3 INTRO_SCREEN_3 = 4 BADGE_SCREEN = 5 def __init__(self, width, height): # Base constructor QtOpenGL.QGLWidget.__init__(self) self.setMouseTracking(True) self.width = width self.height = height # Initialize the painter self.painter = QtGui.QPainter() self.printer = Printer() self.gender = -1 self.avatarImg = None self.avatarTex = None # Adding the avatar buttons # Avatar Male self.initMImg = pygame.image.load("../../images/wireframe_m0.png") self.initMTex = 0 # Avatar Female self.initFImg = pygame.image.load("../../images/wireframe_f0.png") self.initFTex = 0 self.welcomeImg = pygame.image.load( "../../images/welcome_intro/welcome_noavatars.png") self.welcomeTex = 0 # self.btnGraph1 = Button(u"\u25c4", 10, 15, 100, 50) # self.btnGraph2 = Button(u"\u25ba", self.width - 110, 15, 100, 50) self.Next1btn = Button(u"\u25ba", self.width - 110, 15, 100, 50) self.Next1btn.disable() self.Next2btn = Button(u"\u25ba", self.width - 110, 15, 100, 50) self.Next2btn.disable() self.Next3btn = Button(u"\u25ba", self.width - 110, 15, 100, 50) self.Next3btn.disable() self.btnOkay = Button("DONE", self.width - 130, 15, 120, 50) self.btnOkay.disable() self.Back1btn = Button(u"\u25c4", 10, 15, 100, 50) self.Back1btn.disable() self.Back2btn = Button(u"\u25c4", 10, 15, 100, 50) self.Back2btn.disable() self.Back3btn = Button(u"\u25c4", 10, 15, 100, 50) self.Back3btn.disable() self.showing = self.SELECT_SCREEN def initializeGL(self): #self.autoBufferSwap(False) # Initialize the context gl.glClearColor(0.94, 0.94, 0.0, 1) gl.glEnable(gl.GL_LINE_STIPPLE) gl.glEnable(gl.GL_TEXTURE_2D) # self.badgeScreen.init("") self.initMTex = gl.glGenTextures(1) gl.glBindTexture(gl.GL_TEXTURE_2D, self.initMTex) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, self.initMImg.get_width(), self.initMImg.get_height(), 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, pygame.image.tostring(self.initMImg, "RGBA", 1)) # Avatar Female self.initFTex = gl.glGenTextures(1) gl.glBindTexture(gl.GL_TEXTURE_2D, self.initFTex) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, self.initFImg.get_width(), self.initFImg.get_height(), 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, pygame.image.tostring(self.initFImg, "RGBA", 1)) self.welcomeTex = gl.glGenTextures(1) gl.glBindTexture(gl.GL_TEXTURE_2D, self.welcomeTex) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, self.welcomeImg.get_width(), self.welcomeImg.get_height(), 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, pygame.image.tostring(self.welcomeImg, "RGBA", 1)) self.buttonM = ImageButton(self.initMImg, self.initMTex, 1090, 535) self.buttonF = ImageButton(self.initFImg, self.initFTex, 444, 535) self.buttonM.enable() self.buttonF.enable() def resizeGL(self, width, height): # Update the attributes self.width = width self.height = height # Set up an orthographic view gl.glMatrixMode(gl.GL_PROJECTION) gl.glLoadIdentity() gl.glOrtho(0, self.width, self.height, 0, -1, 1) gl.glMatrixMode(gl.GL_MODELVIEW) gl.glLoadIdentity() # Set up the viewport gl.glViewport(0, 0, width, height) # Displaying the images for the new screens def displayImage(self, texture, image, x, y): gl.glPushMatrix() gl.glLoadIdentity() gl.glColor3f(0.94, 0.94, 0.94) #gl.glColor4f(1.0, 1.0, 1.0, 0.0) gl.glBindTexture(gl.GL_TEXTURE_2D, texture) gl.glBegin(gl.GL_QUADS) gl.glTexCoord2f(0.0, 1.0) gl.glVertex2f(x, y) gl.glTexCoord2f(1.0, 1.0) gl.glVertex2f(x + image.get_width(), y) gl.glTexCoord2f(1.0, 0.0) gl.glVertex2f(x + image.get_width(), y + image.get_height()) gl.glTexCoord2f(0.0, 0.0) gl.glVertex2f(x, y + image.get_height()) gl.glEnd() gl.glPopMatrix() gl.glBindTexture(gl.GL_TEXTURE_2D, 0) def mouseMoveEvent(self, event): self.buttonM.update(event.x(), event.y()) self.buttonF.update(event.x(), event.y()) self.btnOkay.update(event.x(), event.y()) self.Next1btn.update(event.x(), event.y()) self.Next2btn.update(event.x(), event.y()) self.Next3btn.update(event.x(), event.y()) self.btnOkay.update(event.x(), event.y()) self.Back1btn.update(event.x(), event.y()) self.Back2btn.update(event.x(), event.y()) self.Back3btn.update(event.x(), event.y()) self.repaint() def mousePressEvent(self, event): if (self.buttonM.isMouseOver() == True): self.showing = self.INTRO_SCREEN_1 self.Next1btn.enable() self.buttonF.disable() self.buttonM.disable() self.gender = 0 # Checking if male self.repaint() elif (self.buttonF.isMouseOver() == True): self.showing = self.INTRO_SCREEN_1 self.Next1btn.enable() self.buttonF.disable() self.buttonM.disable() self.gender = 1 # Checking if female self.repaint() if (self.Next1btn.isMouseOver() == True): self.showing = self.INTRO_SCREEN_2 self.Next2btn.enable() self.Back1btn.enable() self.Next1btn.disable() self.repaint() if (self.Next2btn.isMouseOver() == True): self.showing = self.INTRO_SCREEN_3 self.Next3btn.enable() self.Back2btn.enable() self.Next2btn.disable() self.repaint() if (self.Next3btn.isMouseOver() == True): self.showing = self.BADGE_SCREEN self.btnOkay.enable() self.Back3btn.enable() self.Next3btn.disable() self.repaint() if (self.btnOkay.isMouseOver() == True): import subprocess # os.chdir('../') theproc = subprocess.Popen([sys.executable, "index.py"]) theproc.communicate() sys.exit(0) if (self.Back1btn.isMouseOver() == True): self.showing = self.INTRO_SCREEN_1 self.Back1btn.disable() self.Next2btn.disable() self.Next1btn.enable() self.repaint() if (self.Back2btn.isMouseOver() == True): self.showing = self.INTRO_SCREEN_2 self.Back2btn.disable() self.Next3btn.disable() self.Next2btn.enable() self.Back1btn.enable() self.repaint() if (self.Back3btn.isMouseOver() == True): self.showing = self.INTRO_SCREEN_3 self.Back3btn.disable() self.btnOkay.disable() self.Next3btn.enable() self.Back2btn.enable() self.repaint() def paintEvent(self, event): self.painter.begin(self) self.resizeGL(self.width, self.height) gl.glClearColor(0.94, 0.94, 0.94, 1) gl.glClear(gl.GL_COLOR_BUFFER_BIT) gl.glLoadIdentity() if self.showing == self.SELECT_SCREEN: self.displayImage(self.welcomeTex, self.welcomeImg, 0, 0) self.buttonM.drawBackground() self.buttonF.drawBackground() elif self.showing == self.INTRO_SCREEN_1: # Loading the corresponding images based on the gender if self.gender == 0: self.intro1_Img = pygame.image.load( "../../images/welcome_intro/intro_male_1.png") self.intro1_Tex = 0 self.intro2_Img = pygame.image.load( "../../images/welcome_intro/intro_male_2.png") self.intro2_Tex = 0 self.intro3_Img = pygame.image.load( "../../images/welcome_intro/intro_male_3.png") self.intro3_Tex = 0 self.intro4_Img = pygame.image.load( "../../images/welcome_intro/intro_male_4.png") self.intro4_Tex = 0 else: self.intro1_Img = pygame.image.load( "../../images/welcome_intro/intro_female_1.png") self.intro1_Tex = 0 self.intro2_Img = pygame.image.load( "../../images/welcome_intro/intro_female_2.png") self.intro2_Tex = 0 self.intro3_Img = pygame.image.load( "../../images/welcome_intro/intro_female_3.png") self.intro3_Tex = 0 self.intro4_Img = pygame.image.load( "../../images/welcome_intro/intro_female_4.png") self.intro4_Tex = 0 # Getting the images ready to display self.intro1_Tex = gl.glGenTextures(1) gl.glBindTexture(gl.GL_TEXTURE_2D, self.intro1_Tex) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, self.intro1_Img.get_width(), self.intro1_Img.get_height(), 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, pygame.image.tostring(self.intro1_Img, "RGBA", 1)) # Displaying everything for First intro screen self.displayImage(self.intro1_Tex, self.intro1_Img, 0, 0) self.Next1btn.drawBackground() self.Next1btn.drawText(self.painter, self.printer, self.printer.fontNormal) elif self.showing == self.INTRO_SCREEN_2: # Getting the images ready to display self.intro2_Tex = gl.glGenTextures(1) gl.glBindTexture(gl.GL_TEXTURE_2D, self.intro2_Tex) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, self.intro2_Img.get_width(), self.intro2_Img.get_height(), 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, pygame.image.tostring(self.intro2_Img, "RGBA", 1)) # Displaying everything for First intro screen self.displayImage(self.intro2_Tex, self.intro2_Img, 0, 0) self.Next2btn.drawBackground() self.Back1btn.drawBackground() self.Next2btn.drawText(self.painter, self.printer, self.printer.fontNormal) self.Back1btn.drawText(self.painter, self.printer, self.printer.fontNormal) elif self.showing == self.INTRO_SCREEN_3: # Getting the images ready to display self.intro3_Tex = gl.glGenTextures(1) gl.glBindTexture(gl.GL_TEXTURE_2D, self.intro3_Tex) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, self.intro3_Img.get_width(), self.intro3_Img.get_height(), 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, pygame.image.tostring(self.intro3_Img, "RGBA", 1)) # Displaying everything for First intro screen self.displayImage(self.intro3_Tex, self.intro3_Img, 0, 0) self.Next3btn.drawBackground() self.Back2btn.drawBackground() self.Next3btn.drawText(self.painter, self.printer, self.printer.fontNormal) self.Back2btn.drawText(self.painter, self.printer, self.printer.fontNormal) elif self.showing == self.BADGE_SCREEN: # self.badgeScreen.draw() self.intro4_Tex = gl.glGenTextures(1) gl.glBindTexture(gl.GL_TEXTURE_2D, self.intro4_Tex) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, self.intro4_Img.get_width(), self.intro4_Img.get_height(), 0, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, pygame.image.tostring(self.intro4_Img, "RGBA", 1)) # Displaying everything for First intro screen self.displayImage(self.intro4_Tex, self.intro3_Img, 0, 0) self.btnOkay.drawBackground() self.Back3btn.drawBackground() self.btnOkay.drawText(self.painter, self.printer, self.printer.fontNormal) self.Back3btn.drawText(self.painter, self.printer, self.printer.fontNormal) self.painter.end() #self.swapBuffers() def paintGL(self): gl.glClear(gl.GL_COLOR_BUFFER_BIT) gl.glLoadIdentity()
class PiggyBankSummarizer(QtGui.QWidget): changedPiggyBank = QtCore.pyqtSignal() def __init__(self, piggy_bank=None, category_tree=None, *args, **kwargs): super(PiggyBankSummarizer, self).__init__(*args, **kwargs) self.createUI() self.mapEvents() if piggy_bank is not None: self.setPiggyBank(piggy_bank) def createUI(self): self.summarization_label = QtGui.QLabel("Summarize by:") self.available_methods_list_widget = QtGui.QListWidget() self.selected_methods_list_widget = QtGui.QListWidget() path_to_images_folder = os.path.join(os.getcwd(),"Images") if "OINKModules" not in os.getcwd() else os.path.join(os.getcwd(),"..","Images") self.select_method_button = ImageButton(os.path.join(path_to_images_folder,"rightarrow.png"),25,25) self.deselect_method_button = ImageButton(os.path.join(path_to_images_folder,"leftarrow.png"),25,25) #self.move_up_button = ImageButton(os.path.join(path_to_images_folder,"uparrow.png"),25,25) #self.move_down_button = ImageButton(os.path.join(path_to_images_folder,"downarrow.png"),25,25) self.summarize_button = ImageButton(os.path.join(path_to_images_folder,"checkmark_green.png"),25,25) self.summarize_button.setToolTip("Click to summarize") self.reset_button = ImageButton(os.path.join(path_to_images_folder,"cross.png"),25,25) self.reset_button.setToolTip("Click to reset the summarization options") self.summary_table = CopiableQTableWidget(0,0) select_buttons_layout = QtGui.QVBoxLayout() select_buttons_layout.addStretch(2) select_buttons_layout.addWidget(self.select_method_button,0) select_buttons_layout.addWidget(self.deselect_method_button,0) select_buttons_layout.addStretch(2) finish_buttons_layout = QtGui.QVBoxLayout() finish_buttons_layout.addStretch(2) finish_buttons_layout.addStretch(2) #finish_buttons_layout.addWidget(self.move_up_button,0) #finish_buttons_layout.addWidget(self.move_down_button,0) finish_buttons_layout.addStretch(2) finish_buttons_layout.addWidget(self.summarize_button,0) finish_buttons_layout.addWidget(self.reset_button,0) finish_buttons_layout.addStretch(2) selector_layout = QtGui.QHBoxLayout() selector_layout.addWidget(self.available_methods_list_widget,1) selector_layout.addLayout(select_buttons_layout, 1) selector_layout.addWidget(self.selected_methods_list_widget,1) selector_layout.addLayout(finish_buttons_layout, 1) layout = QtGui.QVBoxLayout() layout.addWidget(self.summarization_label) layout.addLayout(selector_layout) layout.addWidget(self.summary_table) self.setLayout(layout) def mapEvents(self): self.summarize_button.clicked.connect(self.summarize) self.reset_button.clicked.connect(self.reset) self.select_method_button.clicked.connect(self.select) self.deselect_method_button.clicked.connect(self.deselect) def reset(self): self.setPiggyBank() self.summary_table.showDataFrame(None) def select(self): self.pushFromTo(self.available_methods_list_widget, self.selected_methods_list_widget) def deselect(self): self.pushFromTo(self.selected_methods_list_widget, self.available_methods_list_widget) def setPiggyBank(self, piggy_bank=None): if piggy_bank is not None: self.piggy_bank = piggy_bank self.available_methods_list_widget.clear() self.selected_methods_list_widget.clear() if type(self.piggy_bank) == pd.DataFrame: columns = self.piggy_bank.columns self.available_methods_list_widget.addItems(columns) #self.available_methods_list_widget.setSortingEnabled(True) #self.available_methods_list_widget.sortItems() self.enableSummarize() else: self.disableSummarize() def enableSummarize(self): pass def summarize(self): no_of_selected_methods = self.selected_methods_list_widget.count() all_selected_fields = [str(self.selected_methods_list_widget.item(x).text()) for x in range(no_of_selected_methods)] selected_methods = [x for x in all_selected_fields if x != "Word Count"] + ["Word Count"] if len(selected_methods)>0: #print "Selected: %s"%selected_methods column_names = selected_methods[:-1] + ["Count"] + ["Total Word Count"] summary_data = self.piggy_bank[selected_methods] #print summary_data summary_data_as_list = summary_data.values.tolist() #print summary_data_as_list final_summary_data = [] for row in summary_data_as_list: required_list = row[:-1] word_count = sum([x[-1] for x in summary_data_as_list if x[:-1] == required_list]) #word_count = sum[each_row["Word Count"] for each_row in summary_data_as_list if each_row == row] final_summary_data.append(required_list + [[x[:-1] for x in summary_data_as_list].count(required_list)] + [word_count]) summary_data_frame = pd.DataFrame(final_summary_data, columns=column_names).drop_duplicates() self.summary_table.showDataFrame(summary_data_frame) self.summary_table.adjustToColumns() else: print "Select something, Jack." def pushFromTo(self, source_list_widget, destination_list_widget): #identify the selected attributes selected_attribute_items = source_list_widget.selectedItems() #Store them in a list. selected_attributes = [str(selected_attribute_item.text()) for selected_attribute_item in selected_attribute_items] #Send them to the destination list. destination_list_widget.addItems(selected_attributes) #Remove them from the source list for selected_item in selected_attribute_items: source_list_widget.takeItem(source_list_widget.row(selected_item))
def do_init(self, db): self.btn_exit = self.text_button(0, 0, 150, 40, "Exit") # self.btn_exit.set_color("lightblue", "black") self.btn_new_game = self.text_button(self.WIN_WIDTH - 150, 0, 150, 40, "Neues Spiel") x = 0 w = 200 self.players = [] for i, opt in enumerate([self.SETTING_PLAYER1, self.SETTING_PLAYER2]): profile_image = get_next_icon_filename(None) profile_image = self.get_setting(opt, profile_image) y = 100 name = self.text_button(x, y, w, 40, "") name.set_font(self.STATUS_FONT) y += 60 icon = get_icon(profile_image) btn = ImageButton(self.canvas, x, y, w, 150, icon) btn.set_color("black", "black") y += 150 now_lbl = self.text_button(x, y, w, 60, "0") now_lbl.set_font(self.STATUS_FONT) now_lbl.set_color("green", "black") y += 60 all_lbl = self.text_button(x, y, w, 60, "0") all_lbl.set_color("gray", "black") player = { "name": name, "profile": btn, "profile_image": profile_image, "now_lbl": now_lbl, "all_lbl": all_lbl, "all_cnt": 0, "now_cnt": 0, } self.players.append(player) x = self.WIN_WIDTH - w # explicitly set player profile images for player in self.players: self.__set_player_profile(player, player["profile_image"]) left = (self.WIN_WIDTH - Memory.SIZE * self.BTN_SIZE) / 2 self.buttons = [] x = left y = (self.WIN_HEIGHT - Memory.SIZE * self.BTN_SIZE) / 2 for i in range(Memory.SIZE ** 2): btn = ImageButton(self.canvas, x, y, self.BTN_SIZE, self.BTN_SIZE) btn.set_font(self.BIG_BUTTON_FONT) btn.set_color("gray", "#336699") self.buttons.append(btn) x += self.BTN_SIZE if ((i+1) % Memory.SIZE) == 0: x = left y += self.BTN_SIZE self.do_reset(None)
class Bacon(QtGui.QMainWindow): """""" def __init__(self, user_id, password, category_tree, employees_list, brand_list): super(Bacon, self).__init__() self.user_id = user_id self.password = password self.category_tree = category_tree self.employees_list = employees_list self.brand_list = brand_list self.current_processing_date = MOSES.getLastWorkingDate(self.user_id, self.password,datetime.date.today(),"All") self.createUI() self.mapEvents() 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()) def createUI(self): """""" path_to_images = MOSES.getPathToImages() self.raw_data_uploader_button = ImageButton( os.path.join(path_to_images,"upload_raw_data.png"), 48, 48, os.path.join(path_to_images,"upload_raw_data_mouseover.png")) self.tna_viewer_button = ImageButton( os.path.join(path_to_images,"tna.png"), 48, 48, os.path.join(path_to_images,"tna_mouseover.png") ) self.piggybank_button = ImageButton( os.path.join(path_to_images,"piggybank.png"), 48, 48, os.path.join(path_to_images,"piggybank_mouseover.png") ) self.seeker_button = ImageButton( os.path.join(path_to_images,"find.png"), 48, 48, os.path.join(path_to_images,"find_mouseover.png") ) self.taunter = Taunter() self.bacon_icon = ImageButton( os.path.join(path_to_images,"quality.png"), 150, 150, os.path.join(path_to_images,"quality_mouseover.png") ) self.bacon_icon.setToolTip("Get to work, Poozers.") row_1 = QtGui.QHBoxLayout() row_1.addWidget(self.raw_data_uploader_button) row_1.addWidget(self.tna_viewer_button) row_1.addWidget(self.piggybank_button) row_1.addWidget(self.seeker_button) layout = QtGui.QVBoxLayout() layout.addWidget(self.bacon_icon,0,QtCore.Qt.AlignHCenter) layout.addLayout(row_1,1) layout.addWidget(self.taunter,0) self.main_widget = QtGui.QWidget() self.main_widget.setLayout(layout) self.setCentralWidget(self.main_widget) self.setWindowTitle("BACON - Version %s. Server: %s. User: %s (%s)."%(version(), MOSES.getHostID(), self.user_id,MOSES.getEmpName(self.user_id) if self.user_id != "bigbrother" else "Administrator")) icon_file_name_path = os.path.join(path_to_images,'PORK_Icon.png') self.setWindowIcon(QtGui.QIcon(icon_file_name_path)) self.show() def mapEvents(self): """""" self.raw_data_uploader_button.clicked.connect(self.openRawDataManager) self.piggybank_button.clicked.connect(self.openPiggyBank) self.tna_viewer_button.clicked.connect(self.openTNAViewer) self.seeker_button.clicked.connect(self.openSeeker) def openRawDataManager(self): self.raw_data_manager = RawDataManager(self.user_id, self.password) def openPiggyBank(self): self.piggy_bank = PiggyBankWithFilter(self.user_id, self.password, self.category_tree, self.brand_list) def openTNAViewer(self): self.tna_viewer = TNAViewer(self.user_id, self.password, self.category_tree) def openSeeker(self): self.seeker = Seeker(self.user_id, self.password)
def createUI(self): self.group_box = QtGui.QGroupBox("Data Selector") self.page_selector = IconListBox() page_control_list = [ { "Name": "From Flipkart Using FSNs", "Icon": os.path.join("essentials","download.png") }, { "Name": "From CSV Data File", "Icon": os.path.join("essentials","csv_file.png") } ] self.page_selector.addElements(page_control_list) self.page_selector.setFixedSize(302,110) #FSN Mode Widget self.fsn_mode_widget = QtGui.QGroupBox("Data By FSN") self.fsn_text_edit = FSNTextEdit() self.fsn_text_edit.setFixedSize(450,400) self.category_label = QtGui.QLabel("Category:") self.category_combo_box = QtGui.QComboBox() self.category_combo_box.addItems(getCategoryFolderNames()) #Later, add this data from OINK's server. self.category_combo_box.setToolTip("Select the default category for the given FSNs.\nNote that mixing various types of FSNs isn't recommended.\nThe icons won't load.") self.attributes_list_box = QtGui.QListWidget() self.attributes_list_box.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.attributes_list_box.setToolTip("Displays all product attributes, obtained from the FK server.") self.primary_attributes_list_box = QtGui.QListWidget() self.primary_attributes_list_box.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.primary_attributes_list_box.setToolTip("Displays primary product attributes that you have selected.") self.secondary_attributes_list_box = QtGui.QListWidget() self.secondary_attributes_list_box.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.secondary_attributes_list_box.setToolTip("Displays secondary product attributes that you have selected.") self.push_to_primary_button = QtGui.QPushButton("Add to\nPrimary List") self.push_to_primary_button.setToolTip("Click to move the chosen attribute into the list of primary attributes.") self.remove_from_primary_button = QtGui.QPushButton("Remove from\nPrimary List") self.remove_from_primary_button.setToolTip("Click to move the chosen attribute out of the list of primary attributes.") self.push_to_secondary_button = QtGui.QPushButton("Add to\nSecondary List") self.push_to_secondary_button.setToolTip("Click to move the chosen attribute into the list of secondary attributes.") self.remove_from_secondary_button = QtGui.QPushButton("Remove from\nSecondary List") self.remove_from_secondary_button.setToolTip("Click to move the chosen attribute out of the list of secondary attributes.") #downloader self.fetch_images_attributes_button = QtGui.QPushButton("Download") self.fetch_images_attributes_button.setToolTip("This will check if parent images are available for all the FSNs and download them if necessary from the FK site. It will also load the spec table.") self.export_scraped_data_button = QtGui.QPushButton("Export Data") self.fetching_progress = ProgressBar() self.fetching_progress.setRange(0,100) self.fetching_progress.setValue(0) self.fetching_activity = QtGui.QLabel("All that is gold does not glitter!") self.fetching_activity.setStyleSheet("QLabel{font: 10px black; border: 1px solid black;}") self.fetching_activity.setToolTip("This indicates the current downloader's activity, or some random quote that Vinay thinks is funny.") self.completed_fsns_count_label = QtGui.QLabel("Completed:") self.completed_fsns_count_spinbox = QtGui.QSpinBox() self.completed_fsns_count_spinbox.setEnabled(False) self.eta_label = QtGui.QLabel("ETA:") self.eta_datetimeedit = QtGui.QDateTimeEdit() self.eta_datetimeedit.setEnabled(False) self.eta_datetimeedit.setMinimumDateTime(QtCore.QDateTime(datetime.datetime.now())) self.activity_log_textedit = QtGui.QTextEdit() self.activity_log_textedit.setReadOnly(True) self.pending_fsns_count_label = QtGui.QLabel("Pending:") self.pending_fsns_count_spinbox = QtGui.QSpinBox() self.pending_fsns_count_spinbox.setEnabled(False) self.failed_fsns_label = QtGui.QLabel("Failed:") self.failed_fsns_count_spinbox = QtGui.QSpinBox() self.failed_fsns_count_spinbox.setEnabled(False) self.completed_fsns_count_spinbox.setRange(0,99999999) self.pending_fsns_count_spinbox.setRange(0,99999999) self.failed_fsns_count_spinbox.setRange(0,99999999) self.pending_fsns_list_text_edit = QtGui.QTextEdit() self.pending_fsns_list_text_edit.setReadOnly(True) self.completed_fsns_list_text_edit = QtGui.QTextEdit() self.completed_fsns_list_text_edit.setReadOnly(True) self.failed_fsns_list_text_edit = QtGui.QTextEdit() self.failed_fsns_list_text_edit.setReadOnly(True) buttons_and_progress_bar = QtGui.QHBoxLayout() buttons_and_progress_bar.addWidget(self.fetch_images_attributes_button, 2) buttons_and_progress_bar.addWidget(self.export_scraped_data_button, 1) buttons_and_progress_bar.addWidget(self.fetching_progress, 4) completed_tracking = QtGui.QVBoxLayout() completed_tracking.addWidget(self.completed_fsns_count_label) completed_tracking.addWidget(self.completed_fsns_count_spinbox) completed_tracking.addWidget(self.completed_fsns_list_text_edit) eta_layout = QtGui.QHBoxLayout() eta_layout.addWidget(self.eta_label) eta_layout.addWidget(self.eta_datetimeedit) pending_tracking = QtGui.QVBoxLayout() pending_tracking.addWidget(self.pending_fsns_count_label) pending_tracking.addWidget(self.pending_fsns_count_spinbox) pending_tracking.addWidget(self.pending_fsns_list_text_edit) pending_tracking.addLayout(eta_layout) failed_tracking = QtGui.QVBoxLayout() failed_tracking.addWidget(self.failed_fsns_label) failed_tracking.addWidget(self.failed_fsns_count_spinbox) failed_tracking.addWidget(self.failed_fsns_list_text_edit) fsns_tracking = QtGui.QHBoxLayout() fsns_tracking.addLayout(completed_tracking) fsns_tracking.addLayout(pending_tracking) fsns_tracking.addLayout(failed_tracking) downloader_layout = QtGui.QVBoxLayout() downloader_layout.addLayout(buttons_and_progress_bar) downloader_layout.addLayout(fsns_tracking) downloader_layout.addWidget(self.fetching_activity) downloader = QtGui.QWidget() downloader.setLayout(downloader_layout) downloader_tabs = QtGui.QTabWidget() downloader_tabs.addTab(downloader, "Downloader") downloader_tabs.addTab(self.activity_log_textedit, "Log") self.fsn_mode_data_options = QtGui.QGroupBox("Data Options") fsn_mode_data_options_layout = QtGui.QGridLayout() fsn_mode_data_options_layout.addWidget(self.category_label,0,0,1,2, QtCore.Qt.AlignVCenter) fsn_mode_data_options_layout.addWidget(self.category_combo_box,0,2,1,2,QtCore.Qt.AlignVCenter) fsn_mode_data_options_layout.addWidget(self.attributes_list_box,1,0,4,4, QtCore.Qt.AlignHCenter) fsn_mode_data_options_layout.addWidget(self.primary_attributes_list_box,1,5,2,2, QtCore.Qt.AlignHCenter) fsn_mode_data_options_layout.addWidget(self.push_to_primary_button,1,4,1,1, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) fsn_mode_data_options_layout.addWidget(self.remove_from_primary_button,2,4,1,1, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) fsn_mode_data_options_layout.addWidget(self.secondary_attributes_list_box,3,5,2,2, QtCore.Qt.AlignHCenter) fsn_mode_data_options_layout.addWidget(self.push_to_secondary_button,3,4,1,1, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) fsn_mode_data_options_layout.addWidget(self.remove_from_secondary_button,4,4,1,1, QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) self.fsn_mode_data_options.setLayout(fsn_mode_data_options_layout) self.fsn_mode_data_options.setEnabled(False) fsn_mode_layout = QtGui.QGridLayout() fsn_mode_layout.addWidget(self.fsn_text_edit,0,0,7,1) downloader_tabs fsn_mode_layout.addWidget(downloader_tabs,0,1,2,5, QtCore.Qt.AlignBottom) #fsn_mode_layout.addWidget(self.fetch_images_attributes_button,0,1,1,2, QtCore.Qt.AlignBottom) #fsn_mode_layout.addWidget(self.fetching_progress,0,3,1,5, QtCore.Qt.AlignBottom) #fsn_mode_layout.addWidget(self.fetching_activity,1,3,1,5, QtCore.Qt.AlignTop) #fsn_mode_layout.addWidget(self.export_scraped_data_button,1,1,1,2, QtCore.Qt.AlignTop) fsn_mode_layout.addWidget(self.fsn_mode_data_options,2,1,5,7, QtCore.Qt.AlignTop) self.fsn_mode_widget.setLayout(fsn_mode_layout) self.fsn_mode_scroll_view = QtGui.QScrollArea() self.fsn_mode_scroll_view.setWidget(self.fsn_mode_widget) self.fsn_mode_scroll_view.setWidgetResizable(True) self.fsn_mode_scroll_view.setFixedHeight(400) #CSV Mode Widget self.csv_mode_widget = QtGui.QWidget() self.input_data_set_button = ImageButton(os.path.join("essentials","csv_file.png"), 50, 50) self.input_data_set_button.setToolTip("Click to select a data file if you want manual control.") self.check_icons_button = QtGui.QPushButton("Check Icon Availability\nand Export Report") csv_mode_layout = QtGui.QHBoxLayout() csv_mode_layout.addStretch(1) csv_mode_layout.addWidget(self.input_data_set_button,0) csv_mode_layout.addWidget(self.check_icons_button,0) csv_mode_layout.addStretch(1) self.csv_mode_widget.setLayout(csv_mode_layout) self.fsn_or_csv_stacked_widget = QtGui.QStackedWidget() self.fsn_or_csv_stacked_widget.addWidget(self.fsn_mode_scroll_view) self.fsn_or_csv_stacked_widget.addWidget(self.csv_mode_widget) self.validate_button = ImageButton(os.path.join("essentials","validate.png"),50,50) layout = QtGui.QGridLayout() layout.addWidget(self.page_selector,0,0,1,2, QtCore.Qt.AlignHCenter) layout.addWidget(self.fsn_or_csv_stacked_widget,1,0,1,2) layout.addWidget(self.validate_button,3,1) self.group_box.setLayout(layout) final_layout = QtGui.QHBoxLayout() final_layout.addWidget(self.group_box) self.setLayout(final_layout)
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)