class Menu(): """Menu management main container""" def __init__(self): #### self.menu_tab_4 = QWidget() self.menu_tab_4.setStyleSheet("") self.menu_tab_4.setObjectName("menu_tab_4") self.horizontalLayout_7 = QHBoxLayout(self.menu_tab_4) self.horizontalLayout_7.setObjectName("horizontalLayout_7") self.menu_detail_tabWidget = QTabWidget(self.menu_tab_4) self.menu_detail_tabWidget.setObjectName("menu_detail_tabWidget") self.weeklytabs = None self.add_tabs() self.horizontalLayout_7.addWidget(self.menu_detail_tabWidget) ####signals and slots && other stuffs # self.mainwindow = Ui_MainWindow # just for the ease of finding the attributes in pycharm self.menu_detail_tabWidget.currentChanged.connect(self.change_focus) self.menu_tab_4.setFocusPolicy(Qt.StrongFocus) self.menu_tab_4.focusInEvent = self.change_focus def add_tabs(self): """ :return: adds the tab """ menu = MenuDetails() self.menu_detail_tabWidget.addTab(menu.menudetail_tab_1, "&Menu") self.weeklytabs = {} days = [('monday', 'Monday'), ('tuesday', 'Tuesday'), ('wednesday', 'Wednesday'), ('thursday', 'Thursday'), ('friday', 'Friday'), ('saturday', 'Saturday'), ('sunday', 'Sunday')] for n, i in enumerate(days): menu = MenuWeekday(day=i[0]) index = n + 1 self.weeklytabs[index] = menu self.menu_detail_tabWidget.addTab(menu.menudetail_tab_1, i[1]) def change_focus(self, event=None): """ focus event handler """ wid = self.menu_detail_tabWidget.currentWidget() if wid.isVisible(): wid.setFocus()
class Report(): """ The Basic Report Module Class """ def __init__(self): #### self.report_tab_5 = QWidget() self.report_tab_5.setStyleSheet("") self.report_tab_5.setObjectName("report_tab_5") self.horizontalLayout_8 = QHBoxLayout(self.report_tab_5) self.horizontalLayout_8.setObjectName("horizontalLayout_8") self.report_detail_tabWidget = QTabWidget(self.report_tab_5) self.report_detail_tabWidget.setObjectName("report_detail_tabWidget") self.add_tabs() self.horizontalLayout_8.addWidget(self.report_detail_tabWidget) ###signals and slots && other stuffs # self.mainwindow = Ui_MainWindow # just for the ease of finding the attributes in pycharm self.report_detail_tabWidget.currentChanged.connect(self.change_focus) self.report_tab_5.setFocusPolicy(Qt.StrongFocus) self.report_tab_5.focusInEvent = self.change_focus def add_tabs(self): """ add new tabs to the table """ employee = EmployeeNew() hygiene = Hygiene() report = Stock() self.report_detail_tabWidget.addTab(employee.employeedetail_tab_1, 'Employee') self.report_detail_tabWidget.addTab(hygiene.reporthygiene_tab_2, 'Hygiene') self.report_detail_tabWidget.addTab(report.stock_tab_1, 'Stock') def change_focus(self, event=None): """ sets focus for the child widgets """ wid = self.report_detail_tabWidget.currentWidget() if wid.isVisible(): wid.setFocus()
class Waste(): """Waste management main container""" def __init__(self): #### self.waste_tab_6 = QWidget() self.waste_tab_6.setStyleSheet("") self.waste_tab_6.setObjectName("waste_tab_6") self.verticalLayout = QVBoxLayout(self.waste_tab_6) self.verticalLayout.setObjectName("verticalLayout") self.waste_detail_tabWidget = QTabWidget(self.waste_tab_6) self.waste_detail_tabWidget.setObjectName("waste_detail_tabWidget") self.add_tabs() self.verticalLayout.addWidget(self.waste_detail_tabWidget) ##signals and slotts && other stuffs # self.mainwindow = Ui_MainWindow # just for the ease of finding the attributes in pycharm self.waste_detail_tabWidget.currentChanged.connect(self.change_focus) self.waste_tab_6.setFocusPolicy(Qt.StrongFocus) self.waste_tab_6.focusInEvent = self.change_focus def add_tabs(self): """ :return: adds new tabs """ dish = WasteDish() self.waste_detail_tabWidget.addTab(dish.wastedetail_tab_1, "Dish Waste") item = WasteItems() self.waste_detail_tabWidget.addTab(item.wastedetail_tab_1, "Item Waste") def change_focus(self, event=None): """captures focus to inititate the events for the coprresponding tab""" wid = self.waste_detail_tabWidget.currentWidget() if wid.isVisible(): wid.setFocus()
class NotificationTab(): """ui class for new notification tab""" global logger def __init__(self): ##### logger.info('Inside PurchaseSchedule') self.notificationTab_tab_4 = QWidget() self.notificationTab_tab_4.setObjectName("notificationTab_tab_4") self.gridLayout_19 = QGridLayout(self.notificationTab_tab_4) self.gridLayout_19.setObjectName("gridLayout_19") ## self.horizontalLayout = QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.title_label = QLabel(self.notificationTab_tab_4) self.title_label.setObjectName("title_label") self.horizontalLayout.addWidget(self.title_label) self.gridLayout_19.addLayout(self.horizontalLayout, 0, 0, 1, 1) ## self.horizontalLayout_6 = QHBoxLayout() self.horizontalLayout_6.setObjectName("horizontalLayout_6") self.id_label = QLabel(self.notificationTab_tab_4) self.id_label.setObjectName("id_label") self.horizontalLayout_6.addWidget(self.id_label) self.id_line = QLineEdit(self.notificationTab_tab_4) self.id_line.setObjectName("id_line") self.horizontalLayout_6.addWidget(self.id_line) self.notification_schedule_fromdate_label = QLabel( self.notificationTab_tab_4) self.notification_schedule_fromdate_label.setObjectName( "notification_schedule_fromdate_label") self.horizontalLayout_6.addWidget( self.notification_schedule_fromdate_label) self.notification_schedule_fromdate_dateedit = QDateEdit( self.notificationTab_tab_4) self.notification_schedule_fromdate_dateedit.setMaximumDate( QDate.currentDate()) self.notification_schedule_fromdate_dateedit.setDate( QDate.currentDate()) self.notification_schedule_fromdate_dateedit.setCalendarPopup(True) self.notification_schedule_fromdate_dateedit.setObjectName( "notification_schedule_fromdate_dateedit") self.horizontalLayout_6.addWidget( self.notification_schedule_fromdate_dateedit) self.notification_schedule_todate_label = QLabel( self.notificationTab_tab_4) self.notification_schedule_todate_label.setObjectName( "notification_schedule_todate_label") self.horizontalLayout_6.addWidget( self.notification_schedule_todate_label) self.notification_schedule_todate_dateedit = QDateEdit( self.notificationTab_tab_4) self.notification_schedule_todate_dateedit.setMaximumDate( QDate.currentDate()) self.notification_schedule_todate_dateedit.setDate(QDate.currentDate()) self.notification_schedule_todate_dateedit.setCalendarPopup(True) self.notification_schedule_todate_dateedit.setObjectName( "notification_schedule_todate_dateedit") self.horizontalLayout_6.addWidget( self.notification_schedule_todate_dateedit) self.type_label = QLabel(self.notificationTab_tab_4) self.type_label.setObjectName("type_label") self.horizontalLayout_6.addWidget(self.type_label) self.notification_states = QComboBox(self.notificationTab_tab_4) self.notification_states.setObjectName("notification_states") self.horizontalLayout_6.addWidget(self.notification_states) self.batch_label = QLabel(self.notificationTab_tab_4) self.batch_label.setObjectName("batch_label") self.horizontalLayout_6.addWidget(self.batch_label) self.notification_results = QComboBox(self.notificationTab_tab_4) self.notification_results.setObjectName("notification_results") self.horizontalLayout_6.addWidget(self.notification_results) self.gridLayout_19.addLayout(self.horizontalLayout_6, 1, 0, 1, 1) self.gridLayout_8 = QGridLayout() self.gridLayout_8.setObjectName("gridLayout_8") self.notification_schedule_table = QTableWidget( self.notificationTab_tab_4) self.notification_schedule_table.setObjectName( "notification_schedule_table") self.notification_schedule_table.setColumnCount(5) self.notification_schedule_table.setRowCount(0) self.notification_schedule_table.setWordWrap(True) item = QTableWidgetItem() self.notification_schedule_table.setHorizontalHeaderItem(0, item) item = QTableWidgetItem() self.notification_schedule_table.setHorizontalHeaderItem(1, item) item = QTableWidgetItem() self.notification_schedule_table.setHorizontalHeaderItem(2, item) item = QTableWidgetItem() self.notification_schedule_table.setHorizontalHeaderItem(3, item) item = QTableWidgetItem() self.notification_schedule_table.setHorizontalHeaderItem(4, item) self.notification_schedule_table.horizontalHeader( ).setCascadingSectionResizes(True) self.notification_schedule_table.horizontalHeader( ).setStretchLastSection(True) self.notification_schedule_table.verticalHeader().setVisible(False) self.notification_schedule_table.verticalHeader( ).setCascadingSectionResizes(True) self.notification_schedule_table.verticalHeader( ).setStretchLastSection(False) self.gridLayout_8.addWidget(self.notification_schedule_table, 0, 0, 1, 5) self.notification_search_button = QPushButton( self.notificationTab_tab_4) self.notification_search_button.setObjectName( "notification_search_button") self.gridLayout_8.addWidget(self.notification_search_button, 1, 0, 1, 1) spacerItem10 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout_8.addItem(spacerItem10, 1, 2, 1, 1) self.notification_reset_button = QPushButton( self.notificationTab_tab_4) self.notification_reset_button.setObjectName( "notification_reset_button") self.gridLayout_8.addWidget(self.notification_reset_button, 1, 3, 1, 1) self.notification_load_more_button = QPushButton( self.notificationTab_tab_4) self.notification_load_more_button.setObjectName( "notification_load_more_button") self.gridLayout_8.addWidget(self.notification_load_more_button, 1, 4, 1, 1) self.gridLayout_19.addLayout(self.gridLayout_8, 2, 0, 1, 1) ###retranslate self.title_label.setText( QApplication.translate( "MainWindow", "<html><head/><body><p align=\"center\">" "<span style=\" font-weight:600;font-size:20px\">" "<u>All Notifications</u></span></p></body></html>", None, QApplication.UnicodeUTF8)) self.id_label.setText( QApplication.translate("MainWindow", "Message Id", None, QApplication.UnicodeUTF8)) self.notification_schedule_fromdate_label.setText( QApplication.translate("MainWindow", "From Date", None, QApplication.UnicodeUTF8)) self.notification_schedule_fromdate_dateedit.setDisplayFormat( QApplication.translate("MainWindow", "dd/MM/yyyy", None, QApplication.UnicodeUTF8)) self.notification_schedule_todate_label.setText( QApplication.translate("MainWindow", "To Date", None, QApplication.UnicodeUTF8)) self.notification_schedule_todate_dateedit.setDisplayFormat( QApplication.translate("MainWindow", "dd/MM/yyyy", None, QApplication.UnicodeUTF8)) self.type_label.setText( QApplication.translate("MainWindow", "Type", None, QApplication.UnicodeUTF8)) self.batch_label.setText( QApplication.translate("MainWindow", "Number of Notifications", None, QApplication.UnicodeUTF8)) self.notification_schedule_table.horizontalHeaderItem(0).setText( QApplication.translate("MainWindow", "Message Id", None, QApplication.UnicodeUTF8)) self.notification_schedule_table.horizontalHeaderItem(1).setText( QApplication.translate("MainWindow", "Date", None, QApplication.UnicodeUTF8)) self.notification_schedule_table.horizontalHeaderItem(2).setText( QApplication.translate("MainWindow", "From", None, QApplication.UnicodeUTF8)) self.notification_schedule_table.horizontalHeaderItem(3).setText( QApplication.translate("MainWindow", "Message", None, QApplication.UnicodeUTF8)) self.notification_schedule_table.horizontalHeaderItem(4).setText( QApplication.translate("MainWindow", "State", None, QApplication.UnicodeUTF8)) self.notification_search_button.setText( QApplication.translate("MainWindow", "Search", None, QApplication.UnicodeUTF8)) self.notification_reset_button.setText( QApplication.translate("MainWindow", "Reset All", None, QApplication.UnicodeUTF8)) self.notification_load_more_button.setText( QApplication.translate("MainWindow", "Load More", None, QApplication.UnicodeUTF8)) ##signals and slotts && other stuffs self.scheduletable_count = 0 self.addtable_count = 0 # self.mainwindow = Ui_MainWindow # just for the ease of finding the attributes in pycharm self.notification_schedule_table.setEditTriggers( QAbstractItemView.NoEditTriggers) self.batch_number = None self.notification_results.addItems([str(i) for i in range(1, 50, 5)]) self.notification_states.addItems(['All', 'New', 'To Do', 'Done']) self.message = Messaging() self.notification_load_more_button.clicked.connect(self.load_more) self.notification_search_button.clicked.connect(self.search_messages) self.notification_reset_button.clicked.connect(self.reset_all) self.notificationTab_tab_4.setFocusPolicy(Qt.StrongFocus) self.notificationTab_tab_4.focusInEvent = self.load_rows # self.assign_shortcuts() # def assign_shortcuts(self): # QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_inventorynotification_search']), # self.notificationTab_tab_4, self.search_messages) # QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_inventorynotification_additem']), # self.notificationTab_tab_4, self.add_new_blank_rows) # QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_inventorynotification_print']), # self.notificationTab_tab_4, self.commit_and_print) # QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_inventorynotification_today']), # self.notificationTab_tab_4, lambda: self.load_messages('today')) # QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_inventorynotification_tommorow']), # self.notificationTab_tab_4, lambda: self.load_messages('tomorrow')) # QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_inventorynotification_thismonth']), # self.notificationTab_tab_4, lambda: self.load_messages('month')) # QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_inventorynotification_thisweek']), # self.notificationTab_tab_4, lambda: self.load_messages('week')) # QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_inventorynotification_clear']), # self.notificationTab_tab_4, self.clear_table) def add_messages(self, *args): """ Populates the Schedules when we load the tab """ table = self.notification_schedule_table if args: if args[0] != 'new': table.clearContents() table.setRowCount(0) table.setRowCount(len(args)) for i, j in enumerate(args): item = QTableWidgetItem(j['msg_id']) table.setItem(i, 0, item) item = QTableWidgetItem(j['date']) table.setItem(i, 1, item) item = QTableWidgetItem( 'Name:{}\nDesignation:{}\nAddress:{}'.format( j['name'], j['designation'], j['address'])) table.setItem(i, 2, item) item = QTableWidgetItem( 'Message Type:{}\nMessage:{}'.format( j['msg_type'].title(), j['msg_body'])) table.setItem(i, 3, item) states = QComboBox() self.populate_states(states, j['msg_state'].title()) states.currentIndexChanged.connect( lambda index, row=i: self.changed_state(row, index)) table.setCellWidget(i, 4, states) elif args[0] == 'new': initial = table.rowCount() row = table.rowCount() + len(args[1]) table.setRowCount(row) forward_range = range(initial, row) for i, j in zip(forward_range, args[1]): item = QTableWidgetItem(j['msg_id']) table.setItem(i, 0, item) item = QTableWidgetItem(j['date']) table.setItem(i, 1, item) item = QTableWidgetItem( 'Name:{}\nDesignation:{}\nAddress:{}'.format( j['name'], j['designation'], j['address'])) table.setItem(i, 2, item) item = QTableWidgetItem( 'Message Type:{}\nMessage:{}'.format( j['msg_type'].title(), j['msg_body'])) table.setItem(i, 3, item) states = QComboBox() self.populate_states(states, j['msg_state'].title()) states.currentIndexChanged.connect( lambda index, row=i: self.changed_state(row, index)) table.setCellWidget(i, 4, states) table.setColumnWidth(0, (table.width() * 0.5) / 5) table.setColumnWidth(1, (table.width() * 0.5) / 5) table.setColumnWidth(2, table.width() / 5) table.setColumnWidth(3, (table.width() * 2) / 5) self.notification_schedule_table.resizeRowsToContents() def populate_states(self, combo, state): """ fills the supplier list for each item line :param combo: the combo box of suppliers :return:none """ combo.setStyleSheet("QAbstractItemView{" "background: #4B77BE;" "}") combo.addItems(['New', 'To Do', 'Done']) index = combo.findText(state) combo.setCurrentIndex(index) def changed_state(self, row, index): """ fill the item combo box :param combo: the combobox object :return: none """ table = self.notification_schedule_table data = {} data['message_id'] = table.item(row, 0).text() data['msg_state'] = table.cellWidget(row, 4).currentText() msg = QMessageBox.information( QMessageBox(), 'Alert!!', 'Do you want to change the status of the Message??', QMessageBox.Yes | QMessageBox.No) if msg == QMessageBox.Yes: report = self.message.update_message(data) if report: _ = QMessageBox.information(QMessageBox(), 'Success!!', 'The Message was updated', QMessageBox.Yes | QMessageBox.No) else: _ = QMessageBox.critical(QMessageBox(), 'Error!!', 'The Message was not updated', QMessageBox.Yes | QMessageBox.No) def search_messages(self): """ Searches for messages when search button is pressed """ logger.info('Notifications searching messages initiated') from_date = self.notification_schedule_fromdate_dateedit.text() to_date = self.notification_schedule_todate_dateedit.text() limit = self.notification_results.currentText() msg_id = self.id_line.text() msg_state = self.notification_states.currentText() dataobj = self.message.load_message(limit=limit, from_date=from_date, to_date=to_date, msg_id=msg_id, msg_state=msg_state) if dataobj: self.add_messages(*dataobj) else: self.notification_schedule_table.clearContents() self.notification_schedule_table.setRowCount(0) def load_more(self): """ Searches for messages when search button is pressed """ logger.info('Notifications searching messages initiated') from_date = self.notification_schedule_fromdate_dateedit.text() to_date = self.notification_schedule_todate_dateedit.text() limit = self.notification_results.currentText() msg_id = self.id_line.text() msg_state = self.notification_states.currentText() offset = self.notification_schedule_table.rowCount() dataobj = self.message.load_message(limit=limit, from_date=from_date, to_date=to_date, msg_id=msg_id, msg_state=msg_state, offset=offset) if dataobj: self.add_messages('new', dataobj) else: self.notification_schedule_table.clearContents() self.notification_schedule_table.setRowCount(0) def load_single_message(self, msg_id): # api """method to load a single message""" self.reset_all() dataobj = self.message.load_message(msg_id=msg_id) if dataobj: self.add_messages('new', dataobj) self.id_line.setText(str(msg_id)) else: self.notification_schedule_table.clearContents() self.notification_schedule_table.setRowCount(0) def load_rows(self, event): """ :return:loads the rows """ self.add_messages() def reset_all(self): """ :return: resets the the data in the search text """ try: self.id_line.clear() self.notification_schedule_table.clearContents() self.notification_schedule_table.setRowCount(0) except Exception as _: if settings.level == 10: logger.exception('raised exception') return False
class WasteDish(): """Dish waste management tab""" global logger def __init__(self): ### logger.info('Inside WasteDish') self.wastedetail_tab_1 = QWidget() self.wastedetail_tab_1.setObjectName("wastedetail_tab_1") self.verticalLayout_9 = QVBoxLayout(self.wastedetail_tab_1) self.verticalLayout_9.setObjectName("verticalLayout_9") self.verticalLayout_8 = QVBoxLayout() self.verticalLayout_8.setObjectName("verticalLayout_8") self.horizontalLayout_12 = QHBoxLayout() self.horizontalLayout_12.setObjectName("horizontalLayout_12") self.waste_fromdate_label = QLabel(self.wastedetail_tab_1) self.waste_fromdate_label.setObjectName('waste_fromdate_label') self.horizontalLayout_12.addWidget(self.waste_fromdate_label) self.waste_fromdate_dateedit = QDateEdit(self.wastedetail_tab_1) self.waste_fromdate_dateedit.setCalendarPopup(True) self.waste_fromdate_dateedit.setObjectName("waste_fromdate_dateedit") self.horizontalLayout_12.addWidget(self.waste_fromdate_dateedit) self.waste_todate_label = QLabel(self.wastedetail_tab_1) self.waste_todate_label.setObjectName('waste_todate_label') self.horizontalLayout_12.addWidget(self.waste_todate_label) self.waste_todate_dateedit = QDateEdit(self.wastedetail_tab_1) self.waste_todate_dateedit.setCalendarPopup(True) self.waste_todate_dateedit.setObjectName("waste_todate_dateedit") self.waste_todate_dateedit.setMaximumDate(QDate.currentDate()) self.horizontalLayout_12.addWidget(self.waste_todate_dateedit) spacerItem28 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_12.addItem(spacerItem28) self.waste_table_search_button = QPushButton(self.wastedetail_tab_1) self.waste_table_search_button.setObjectName( "waste_table_search_button") self.horizontalLayout_12.addWidget(self.waste_table_search_button) self.verticalLayout_8.addLayout(self.horizontalLayout_12) self.waste_table = QTableWidget(self.wastedetail_tab_1) self.waste_table.setObjectName("waste_table") self.waste_table.setColumnCount(5) self.waste_table.setRowCount(0) item = QTableWidgetItem() self.waste_table.setHorizontalHeaderItem(0, item) item = QTableWidgetItem() self.waste_table.setHorizontalHeaderItem(1, item) item = QTableWidgetItem() self.waste_table.setHorizontalHeaderItem(2, item) item = QTableWidgetItem() self.waste_table.setHorizontalHeaderItem(3, item) item = QTableWidgetItem() self.waste_table.setHorizontalHeaderItem(4, item) self.waste_table.horizontalHeader().setCascadingSectionResizes(False) self.waste_table.horizontalHeader().setStretchLastSection(True) self.waste_table.verticalHeader().setVisible(False) self.waste_table.verticalHeader().setCascadingSectionResizes(False) self.waste_table.setSortingEnabled(True) self.verticalLayout_8.addWidget(self.waste_table) self.horizontalLayout_13 = QHBoxLayout() self.horizontalLayout_13.setObjectName("horizontalLayout_13") self.waste_table_newrow_button = QPushButton(self.wastedetail_tab_1) self.waste_table_newrow_button.setObjectName( "waste_table_newrow_button") self.horizontalLayout_13.addWidget(self.waste_table_newrow_button) spacerItem29 = QSpacerItem(612, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_13.addItem(spacerItem29) self.waste_table_discard_button = QPushButton(self.wastedetail_tab_1) self.waste_table_discard_button.setObjectName( "waste_table_discard_button") self.horizontalLayout_13.addWidget(self.waste_table_discard_button) self.verticalLayout_8.addLayout(self.horizontalLayout_13) self.verticalLayout_9.addLayout(self.verticalLayout_8) ##retranslate self.waste_fromdate_label.setText( QApplication.translate("MainWindow", "From Date", None, QApplication.UnicodeUTF8)) self.waste_fromdate_dateedit.setDisplayFormat( QApplication.translate("MainWindow", "dd/MM/yyyy", None, QApplication.UnicodeUTF8)) self.waste_todate_label.setText( QApplication.translate("MainWindow", "To Date", None, QApplication.UnicodeUTF8)) self.waste_todate_dateedit.setDisplayFormat( QApplication.translate("MainWindow", "dd/MM/yyyy", None, QApplication.UnicodeUTF8)) self.waste_table_search_button.setText( QApplication.translate("MainWindow", "Search", None, QApplication.UnicodeUTF8)) self.waste_table.horizontalHeaderItem(0).setText( QApplication.translate("MainWindow", "Code", None, QApplication.UnicodeUTF8)) self.waste_table.horizontalHeaderItem(1).setText( QApplication.translate("MainWindow", "Item", None, QApplication.UnicodeUTF8)) self.waste_table.horizontalHeaderItem(2).setText( QApplication.translate("MainWindow", "Category", None, QApplication.UnicodeUTF8)) self.waste_table.horizontalHeaderItem(3).setText( QApplication.translate("MainWindow", "Quantity", None, QApplication.UnicodeUTF8)) self.waste_table.horizontalHeaderItem(4).setText( QApplication.translate("MainWindow", "Reason", None, QApplication.UnicodeUTF8)) self.waste_table_newrow_button.setText( QApplication.translate("MainWindow", "New Row", None, QApplication.UnicodeUTF8)) self.waste_table_discard_button.setText( QApplication.translate("MainWindow", "Discard Item", None, QApplication.UnicodeUTF8)) self.wastedetail_tab_1.setTabOrder(self.waste_fromdate_dateedit, self.waste_todate_dateedit) self.wastedetail_tab_1.setTabOrder(self.waste_todate_dateedit, self.waste_table_search_button) ###signals and slots && other stuffs # self.mainwindow = Ui_MainWindow # just for the ease of finding the attributes in pycharm self.schedule = SchedulePurchase() self.suplier = BusinessParty(category='Supplier') self.add = AddStockInventory() self.item = WasteMenu() self.waste_fromdate_dateedit.setDate(QDate.currentDate()) self.waste_todate_dateedit.setDate(QDate.currentDate()) self.waste_table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.waste_table_newrow_button.clicked.connect(self.add_new_blank_rows) self.waste_table_discard_button.clicked.connect(self.discard) self.waste_table_search_button.clicked.connect(self.search_discard) self.wastedetail_tab_1.setFocusPolicy(Qt.StrongFocus) self.wastedetail_tab_1.focusInEvent = self.load_rows def load_rows(self, event=None): pass def add_new_blank_rows(self): """ deletes the schedules in the database """ table = self.waste_table item = table.item(0, 0) if item: message = QMessageBox.critical(QMessageBox(), 'Warning!', 'This will remove all the entries', QMessageBox.Ok | QMessageBox.Cancel) if message == QMessageBox.Ok: table.setRowCount(0) table.clearContents() self.add_row_to_table('new') self.waste_table_discard_button.setVisible(True) elif not item: self.waste_table_discard_button.setVisible(True) self.add_row_to_table('new') def add_row_to_table(self, *args): """ complex stuff of auto complete to be added to each combo box :return: """ table = self.waste_table if args: if args[0] != 'new': table.clearContents() table.setRowCount(0) table.setRowCount(len(args)) for i, j in enumerate(args): code = QTableWidgetItem(j['code']) table.setItem(i, 0, code) item = QTableWidgetItem(j['item']) table.setItem(i, 1, item) category = QTableWidgetItem(j['category']) table.setItem(i, 2, category) quantity = QTableWidgetItem(str(j['quantity'])) table.setItem(i, 3, quantity) reason = QTableWidgetItem(j['reason_for_discard']) table.setItem(i, 4, reason) if args[0] == 'new': row = table.rowCount() + 1 table.setRowCount(row) codeline = QLineEdit() codeline.editingFinished.connect( lambda: self.get_details_of_code(row)) table.setCellWidget(row - 1, 0, codeline) itemcombo = QComboBox() self.fill_item_list(itemcombo) itemcombo.currentIndexChanged.connect( lambda: self.get_details_of_item(row)) table.setCellWidget(row - 1, 1, itemcombo) category = QTableWidgetItem() table.setItem(row - 1, 2, category) quantity = QLineEdit() table.setCellWidget(row - 1, 3, quantity) combo = QComboBox() combo.addItem("Cancelled") combo.addItem("Mishandling") combo.addItem("Excess") table.setCellWidget(row - 1, 4, combo) table.setColumnWidth(0, (table.width() / 5)) table.setColumnWidth(1, (table.width() / 5)) table.setColumnWidth(2, (table.width() / 5)) table.setColumnWidth(3, (table.width() / 5)) table.horizontalHeader().setStretchLastSection( True ) # important to resize last section else blank space after last column def fill_item_list(self, combo): """ fill the item combo box :param combo: the combobox object :return: none """ itemfield = combo itemfield.setStyleSheet("QAbstractItemView{" "background: #4B77BE;" "}") self.item.populate_item(itemfield) def get_details_of_code(self, rowcount): """ fills the item, category and units based on the code :param rowcount: the row count :return: none """ row = rowcount - 1 table = self.waste_table codeline = table.cellWidget(row, 0) data = self.item.get_details_of_code(codeline.text()) item = table.cellWidget(row, 1) index = item.findText(data['item']) item.setCurrentIndex(index) category = table.item(row, 2) category.setText(data['category']) def get_details_of_item(self, rowcount): """ fills the code, category and units based on the item :param rowcount: the row count :return: none """ row = rowcount - 1 table = self.waste_table itemcombo = table.cellWidget(row, 1) data = self.item.get_details_of_item(itemcombo.currentText()) code = table.cellWidget(row, 0) code.setText(data['code']) category = table.item(row, 2) category.setText(data['category']) def discard(self): """ saves the details in db before printing """ logger.info('WasteDish discard initiated') table = self.waste_table data = self.get_data() if data: for i in data: status = self.item.discard(i) if status: model_index = table.indexFromItem(i['model_item']) row = model_index.row() table.removeRow(row) else: msg = QMessageBox.critical(QMessageBox(), "Error!!", "The item cannot be discarded", QMessageBox.Ok) if msg == QMessageBox.Ok: return False def search_discard(self): """ searches the discard from_date and to_date :return:none """ table = self.waste_table item = table.cellWidget(0, 0) if item: msg = QMessageBox.critical(QMessageBox(), 'Warning!', 'This will delete all the rows added', QMessageBox.Ok | QMessageBox.Cancel) if msg == QMessageBox.Cancel: return False f_date = self.waste_fromdate_dateedit.text() from_date = datetime.strptime(f_date, '%d/%m/%Y') t_date = self.waste_todate_dateedit.text() to_date = datetime.strptime(t_date, '%d/%m/%Y') to_date = to_date + timedelta(hours=23, minutes=59, seconds=59) dataobj = self.item.find_itemdiscard(from_date=from_date, to_date=to_date) self.add_row_to_table(*dataobj) self.waste_table_discard_button.setVisible(False) def get_data(self): """ :return: fetches all the data for printing """ table = self.waste_table rows = table.rowCount() dataobj = [] for i in range(rows): dictionary = {} item = table.cellWidget(i, 0) if table.cellWidget( i, 0) is not None else table.item(i, 0) dictionary['code'] = item.text() if dictionary['code'] == '': break item = table.cellWidget(i, 1).currentText() if table.cellWidget( i, 1) is not None else table.item(i, 1).text() dictionary['item'] = item item = table.cellWidget(i, 2) if table.cellWidget( i, 2) is not None else table.item(i, 2) dictionary['category'] = item.text() item = table.cellWidget(i, 3) if table.cellWidget( i, 3) is not None else table.item(i, 3) dictionary['quantity'] = item.text() if dictionary['quantity'] == '': self.show_error('Quantity') return False item = table.cellWidget(i, 4).currentText() if table.cellWidget( i, 4) is not None else table.item(i, 4).text() dictionary['reason_for_discard'] = item dictionary['model_item'] = table.item(i, 2) dataobj.append(dictionary) return dataobj def show_error(self, text): """ :return: pops up an error """ QMessageBox.critical(QMessageBox(), "Fail!!", "Please Enter %s properly" % text, QMessageBox.Ok)
class WasteItems(): """Item waste management tab""" global logger def __init__(self): ### logger.info('Inside WasteItems') self.wastedetail_tab_1 = QWidget() self.wastedetail_tab_1.setObjectName("wastedetail_tab_1") self.verticalLayout_9 = QVBoxLayout(self.wastedetail_tab_1) self.verticalLayout_9.setObjectName("verticalLayout_9") self.verticalLayout_8 = QVBoxLayout() self.verticalLayout_8.setObjectName("verticalLayout_8") self.horizontalLayout_12 = QHBoxLayout() self.horizontalLayout_12.setObjectName("horizontalLayout_12") self.waste_fromdate_label = QLabel(self.wastedetail_tab_1) self.waste_fromdate_label.setObjectName('waste_fromdate_label') self.horizontalLayout_12.addWidget(self.waste_fromdate_label) self.waste_fromdate_dateedit = QDateEdit(self.wastedetail_tab_1) self.waste_fromdate_dateedit.setCalendarPopup(True) self.waste_fromdate_dateedit.setObjectName("waste_fromdate_dateedit") self.horizontalLayout_12.addWidget(self.waste_fromdate_dateedit) self.waste_todate_label = QLabel(self.wastedetail_tab_1) self.waste_todate_label.setObjectName('waste_todate_label') self.horizontalLayout_12.addWidget(self.waste_todate_label) self.waste_todate_dateedit = QDateEdit(self.wastedetail_tab_1) self.waste_todate_dateedit.setCalendarPopup(True) self.waste_todate_dateedit.setObjectName("waste_todate_dateedit") self.waste_todate_dateedit.setMaximumDate(QDate.currentDate()) self.horizontalLayout_12.addWidget(self.waste_todate_dateedit) spacerItem28 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_12.addItem(spacerItem28) self.waste_table_search_button = QPushButton(self.wastedetail_tab_1) self.waste_table_search_button.setObjectName( "waste_table_search_button") self.horizontalLayout_12.addWidget(self.waste_table_search_button) self.verticalLayout_8.addLayout(self.horizontalLayout_12) self.waste_table = QTableWidget(self.wastedetail_tab_1) self.waste_table.setObjectName("waste_table") self.waste_table.setColumnCount(6) self.waste_table.setRowCount(0) item = QTableWidgetItem() self.waste_table.setHorizontalHeaderItem(0, item) item = QTableWidgetItem() self.waste_table.setHorizontalHeaderItem(1, item) item = QTableWidgetItem() self.waste_table.setHorizontalHeaderItem(2, item) item = QTableWidgetItem() self.waste_table.setHorizontalHeaderItem(3, item) item = QTableWidgetItem() self.waste_table.setHorizontalHeaderItem(4, item) item = QTableWidgetItem() self.waste_table.setHorizontalHeaderItem(5, item) self.waste_table.horizontalHeader().setCascadingSectionResizes(False) self.waste_table.horizontalHeader().setStretchLastSection(True) self.waste_table.verticalHeader().setVisible(False) self.waste_table.verticalHeader().setCascadingSectionResizes(False) self.waste_table.setSortingEnabled(True) self.verticalLayout_8.addWidget(self.waste_table) self.verticalLayout_9.addLayout(self.verticalLayout_8) ##retranslate self.waste_fromdate_label.setText( QApplication.translate("MainWindow", "From Date", None, QApplication.UnicodeUTF8)) self.waste_fromdate_dateedit.setDisplayFormat( QApplication.translate("MainWindow", "dd/MM/yyyy", None, QApplication.UnicodeUTF8)) self.waste_todate_label.setText( QApplication.translate("MainWindow", "To Date", None, QApplication.UnicodeUTF8)) self.waste_todate_dateedit.setDisplayFormat( QApplication.translate("MainWindow", "dd/MM/yyyy", None, QApplication.UnicodeUTF8)) self.waste_table_search_button.setText( QApplication.translate("MainWindow", "Search", None, QApplication.UnicodeUTF8)) self.waste_table.horizontalHeaderItem(0).setText( QApplication.translate("MainWindow", "Code", None, QApplication.UnicodeUTF8)) self.waste_table.horizontalHeaderItem(1).setText( QApplication.translate("MainWindow", "Item", None, QApplication.UnicodeUTF8)) self.waste_table.horizontalHeaderItem(2).setText( QApplication.translate("MainWindow", "Category", None, QApplication.UnicodeUTF8)) self.waste_table.horizontalHeaderItem(3).setText( QApplication.translate("MainWindow", "Units", None, QApplication.UnicodeUTF8)) self.waste_table.horizontalHeaderItem(4).setText( QApplication.translate("MainWindow", "Quantity", None, QApplication.UnicodeUTF8)) self.waste_table.horizontalHeaderItem(5).setText( QApplication.translate("MainWindow", "Reason", None, QApplication.UnicodeUTF8)) ###signals and slots && other stuffs # self.mainwindow = Ui_MainWindow # just for the ease of finding the attributes in pycharm self.item = WasteIngredients() self.waste_fromdate_dateedit.setDate(QDate.currentDate()) self.waste_todate_dateedit.setDate(QDate.currentDate()) self.waste_table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.waste_table_search_button.clicked.connect(self.search_discard) self.wastedetail_tab_1.setFocusPolicy(Qt.StrongFocus) self.wastedetail_tab_1.focusInEvent = self.load_rows def load_rows(self, event=None): """calling add row to restructure the table every time container resizes""" self.add_row_to_table() def search_discard(self): """ searches the discard from_date and to_date :return:none """ f_date = self.waste_fromdate_dateedit.text() from_date = datetime.strptime(f_date, '%d/%m/%Y') t_date = self.waste_todate_dateedit.text() to_date = datetime.strptime(t_date, '%d/%m/%Y') to_date = to_date + timedelta(hours=23, minutes=59, seconds=59) dataobj = self.item.find_itemdiscard(from_date=from_date, to_date=to_date) self.add_row_to_table(*dataobj) def add_row_to_table(self, *args): """ complex stuff of auto complete to be added to each combo box :return: """ table = self.waste_table if args: table.clearContents() table.setRowCount(0) table.setRowCount(len(args)) for i, j in enumerate(args): code = QTableWidgetItem(j['code']) table.setItem(i, 0, code) item = QTableWidgetItem(j['item']) table.setItem(i, 1, item) category = QTableWidgetItem(j['category']) table.setItem(i, 2, category) unit = QTableWidgetItem(str(j['units'])) table.setItem(i, 3, unit) quantity = QTableWidgetItem(str(j['quantity'])) table.setItem(i, 4, quantity) reason = QTableWidgetItem(j['reason_for_discard']) table.setItem(i, 5, reason) table.setColumnWidth(0, (table.width() / 6)) table.setColumnWidth(1, (table.width() / 6)) table.setColumnWidth(2, (table.width() / 6)) table.setColumnWidth(3, (table.width() / 6)) table.setColumnWidth(4, (table.width() / 6)) table.horizontalHeader().setStretchLastSection(True)
class MenuWeekday(): """Tab to manage menu entry for each day""" global logger def __init__(self, day): #### logger.info('Inside MenuWeekday') self.menudetail_tab_1 = QWidget() self.menudetail_tab_1.setObjectName("menudetail_tab_1") self.gridLayout_20 = QGridLayout(self.menudetail_tab_1) self.gridLayout_20.setObjectName("gridLayout_20") self.menu_table = QTableWidget(self.menudetail_tab_1) self.menu_table.setSortingEnabled(True) self.menu_table.setObjectName("menu_table") self.menu_table.setColumnCount(6) self.menu_table.setRowCount(0) item = QTableWidgetItem() self.menu_table.setHorizontalHeaderItem(0, item) item = QTableWidgetItem() self.menu_table.setHorizontalHeaderItem(1, item) item = QTableWidgetItem() self.menu_table.setHorizontalHeaderItem(2, item) item = QTableWidgetItem() self.menu_table.setHorizontalHeaderItem(3, item) item = QTableWidgetItem() self.menu_table.setHorizontalHeaderItem(4, item) item = QTableWidgetItem() self.menu_table.setHorizontalHeaderItem(5, item) self.menu_table.horizontalHeader().setCascadingSectionResizes(False) self.menu_table.horizontalHeader().setStretchLastSection(True) self.menu_table.verticalHeader().setVisible(True) self.menu_table.verticalHeader().setCascadingSectionResizes(True) self.gridLayout_20.addWidget(self.menu_table, 0, 0, 1, 3) spacerItem22 = QSpacerItem(612, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout_20.addItem(spacerItem22, 1, 0, 1, 1) self.menu_table_refresh_button = QPushButton(self.menudetail_tab_1) self.menu_table_refresh_button.setObjectName("menu_table_refresh_button") self.gridLayout_20.addWidget(self.menu_table_refresh_button, 1, 1, 1, 1) self.menu_table_add_button = QPushButton(self.menudetail_tab_1) self.menu_table_add_button.setObjectName("menu_table_add_button") self.gridLayout_20.addWidget(self.menu_table_add_button, 1, 2, 1, 1) ####retranslate self.menu_table.horizontalHeaderItem(0).setText( QApplication.translate("MainWindow", "Code", None, QApplication.UnicodeUTF8)) self.menu_table.horizontalHeaderItem(1).setText( QApplication.translate("MainWindow", "Item", None, QApplication.UnicodeUTF8)) self.menu_table.horizontalHeaderItem(2).setText( QApplication.translate("MainWindow", "Category", None, QApplication.UnicodeUTF8)) self.menu_table.horizontalHeaderItem(3).setText( QApplication.translate("MainWindow", "Rate", None, QApplication.UnicodeUTF8)) self.menu_table.horizontalHeaderItem(4).setText( QApplication.translate("MainWindow", "Per Day", None, QApplication.UnicodeUTF8)) self.menu_table.horizontalHeaderItem(5).setText( QApplication.translate("MainWindow", "Available", None, QApplication.UnicodeUTF8)) self.menu_table_refresh_button.setText( QApplication.translate("MainWindow", "Refresh", None, QApplication.UnicodeUTF8)) self.menu_table_add_button.setText( QApplication.translate("MainWindow", "Add Dish", None, QApplication.UnicodeUTF8)) ###signals and slots && other stuffs # self.mainwindow = Ui_MainWindow # just for the ease of finding the attributes in pycharm self.day = day self.menu_table_add_button.clicked.connect(self.add_menu) self.menu_table.itemDoubleClicked.connect(self.popup_edit) self.menu_table_refresh_button.clicked.connect(self.update_menu) self.menu_table.setSelectionBehavior(QAbstractItemView.SelectRows) self.menu_table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.menu_table.setShowGrid(False) self.menu_table.setAlternatingRowColors(True) self.update_menu() self.popup = object self.menudetail_tab_1.setFocusPolicy(Qt.StrongFocus) self.menudetail_tab_1.focusInEvent = self.load_rows self.assign_shortcuts() def assign_shortcuts(self): """assign shortcuts""" QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_menumgtmonsun_view']), self.menudetail_tab_1, self.row_selected) QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_menumgtmonsun_refresh']), self.menudetail_tab_1, self.update_menu) QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_menumgtmonsun_add']), self.menudetail_tab_1, self.add_menu) def row_selected(self): """selets a row entry""" rows = sorted(set(index.row() for index in self.menu_table.selectedIndexes())) if rows: code = self.menu_table.item(rows[0], 0).text() name = self.menu_table.item(rows[0], 1).text() quantity = self.menu_table.item(rows[0], 4).text() self.add_menu(code, name, quantity) def add_menu(self, *args): """ :return: Pops up a new dialogue to add the menus """ if not args: self.popup = AddMenuFromList(parent=self, day=self.day) self.popup.exec_() else: self.popup = MenuQuantityEditPopup(parent=self, day=self.day, code=args[0], name=args[1], quantity=args[2]) self.popup.exec_() def update_menu(self): """ :return:Populates the menu table """ menu = WeeklyMenu(day=self.day) menulist = menu.load_dish_per_Day() if not menulist == []: self.add_row(*menulist) else: self.menu_table.clearContents() self.menu_table.setRowCount(0) def popup_edit(self, item): """ Pops up the menu to be edited :param item: item clicked :return:none """ model_index = self.menu_table.indexFromItem(item) row = model_index.row() code = self.menu_table.item(row, 0).text() name = self.menu_table.item(row, 1).text() quantity = self.menu_table.item(row, 4).text() self.add_menu(code, name, quantity) def add_row(self, *args): """creates a new row entry""" table = self.menu_table if args: table.setRowCount(len(args)) for i, j in enumerate(args): item = QTableWidgetItem(j['item_no']) table.setItem(i, 0, item) item = QTableWidgetItem(j['item']) table.setItem(i, 1, item) item = QTableWidgetItem(j['category']) table.setItem(i, 2, item) item = QTableWidgetItem(j['rate']) table.setItem(i, 3, item) item = QTableWidgetItem(j['per_day']) table.setItem(i, 4, item) item = QTableWidgetItem(j['available']) table.setItem(i, 5, item) table.setColumnWidth(0, table.width() / 6) table.setColumnWidth(1, table.width() / 6) table.setColumnWidth(2, table.width() / 6) table.setColumnWidth(3, table.width() / 6) table.setColumnWidth(4, table.width() / 6) def load_rows(self, event): """ :return:checks and adds new rows """ self.add_row()