class Keyboards: """ Класс Keyboards предназначен для создания и разметки клавиатуры бота """ # инициализация разметки def __init__(self): self.markup = None # инициализация менеджера для работы с БД self.BD = DBManager() def set_btn(self, name, step='', quantity=0): """ Создает и возвращает кнопку по входным параметрам """ if name == "AMOUNT_ORDERS": config.KEYBOARD["AMOUNT_ORDERS"] = step if name == "AMOUNT_PRODUCT": config.KEYBOARD["AMOUNT_PRODUCT"] = "{}".format(quantity) if name == "APPLY": # создает кнопку оформить с данными о стоимости товара округленного до 2 - го знака после запятой config.KEYBOARD["APPLY"] = "{}({}) руб".format('✅ Оформить', step) return KeyboardButton(config.KEYBOARD[name]) def set_inline_btn(self, name, data=''): """ Создает и возвращает инлайн кнопку по входным параметрам """ if len(data) == 0: data = str(name.id) return InlineKeyboardButton(str(name), callback_data=data) def remove_menu(self): """ Удаляет данны кнопки и возвращает ее """ return ReplyKeyboardRemove() def info_menu(self): """ Создает разметку кнопок в меню info """ self.markup = ReplyKeyboardMarkup(True, True) itm_btn_1 = self.set_btn('<<') # рассположение кнопок в меню self.markup.row(itm_btn_1) return self.markup def settings_menu(self): """ Создает разметку кнопок в меню settings """ self.markup = ReplyKeyboardMarkup(True, True) itm_btn_1 = self.set_btn('<<') # рассположение кнопок в меню self.markup.row(itm_btn_1) return self.markup def start_menu(self): """ Создает разметку кнопок в основном меню и возвращает разметку """ self.markup = ReplyKeyboardMarkup(True, True) itm_btn_1 = self.set_btn('CHOOSE_ORDER') itm_btn_2 = self.set_btn('CHOOSE_GOODS') itm_btn_3 = self.set_btn('INFO') itm_btn_4 = self.set_btn('SETTINGS') # рассположение кнопок в меню self.markup.row(itm_btn_1, itm_btn_2) self.markup.row(itm_btn_3, itm_btn_4) return self.markup def current_order_menu(self): """ making markup for work with order :return: """ self.markup = ReplyKeyboardMarkup(True, True) itm_btn_1 = self.set_btn('CHOOSE_ORDER') itm_btn_2 = self.set_btn('CHOOSE_GOODS') itm_btn_3 = self.set_btn('<<') itm_btn_4 = self.set_btn('ORDER') # рассположение кнопок в меню self.markup.row(itm_btn_1, itm_btn_2) self.markup.row(itm_btn_3, itm_btn_4) return self.markup def category_menu(self): """ Создает разметку кнопок в меню категорий товара и возвращает разметку """ self.markup = ReplyKeyboardMarkup(True, True, row_width=1) self.markup.add(self.set_btn('SEMIPRODUCT')) self.markup.add(self.set_btn('GROCERY')) self.markup.add(self.set_btn('ICE_CREAM')) self.markup.row(self.set_btn('<<'), self.set_btn('ORDER')) return self.markup def select_role_menu(self): """ markup for role selection """ self.markup = ReplyKeyboardMarkup(True, True, row_width=1) itm_btn_1 = self.set_btn('TRADER') itm_btn_2 = self.set_btn('KEEPER') itm_btn_3 = self.set_btn('ADMIN') self.markup.row(itm_btn_1, itm_btn_2, itm_btn_3) return self.markup def set_select_category(self, trader, category): """ Создает разметку инлайн кнопок в выбранной категории товара и возвращает разметку """ self.markup = InlineKeyboardMarkup(row_width=1) # загружаем в название инлайн кнопок данные с БД в соответствие с категорией товара order_current = self.BD.get_order_current(trader_id=trader.id) if order_current is None: order_current = trader.order.save(self.BD) for itm in self.BD.select_all_products_category(category): # dump a data to json string # keys & values are: 'm' - menu: 'p' - products (add one product) # 't' - trader id # 'o' - current order id # 'p' - product id data = json.dumps( { 'm': 'p', 't': trader.id, 'o': order_current.id, 'p': itm.id }, separators=(',', ':')) self.markup.add(self.set_inline_btn(str(itm), data)) return self.markup def orders_info_menu(self, trader_user: TraderUser): """ create inline-menu of trader's orders :param trader_user: :return: markup """ orders = trader_user.get_orders(self.BD) self.markup = InlineKeyboardMarkup(row_width=1) if len(orders): for order in orders: # dump a data to json string # keys & values are: 'm' - menu: 'o' - orders (choose one order to work with) # 't' - trader id # 'o' - current order id data = json.dumps( { 'm': 'o', 't': trader_user.id, 'o': order.id }, separators=(',', ':')) self.markup.add(self.set_inline_btn(str(order), data)) return self.markup def set_select_client(self, trader: TraderUser): """ set menu of list of clients :param trader: :return markup: inline buttons """ clients = self.BD.get_clients() if len(clients): self.markup = InlineKeyboardMarkup(row_width=1) for client in clients: # dump a data to json string # keys & values are: 'm' - menu: 'c' - clients (choose one client for order) # 't' - trader id # 'o' - order id # 'c' - client id data = json.dumps({ 'm': 'c', 't': trader.id, 'o': trader.order.id, 'c': client.id }) self.markup.add(self.set_inline_btn(str(client), data)) return self.markup def orders_menu(self, step): """ Создает разметку кнопок в заказе товара и возвращает разметку :param step: json with parameters: number, quantity, positions, total_price :return: markup """ parameters = json.loads(step) self.markup = ReplyKeyboardMarkup(True, True) itm_btn_1 = self.set_btn('X') itm_btn_2 = self.set_btn('DOWN') itm_btn_3 = self.set_btn('AMOUNT_PRODUCT', quantity=parameters['quantity']) itm_btn_4 = self.set_btn('UP') itm_btn_5 = self.set_btn('BACK_STEP') itm_btn_6 = self.set_btn('AMOUNT_ORDERS', step='{} из {}'.format( parameters['number'], parameters['positions'])) itm_btn_7 = self.set_btn('NEXT_STEP') itm_btn_8 = self.set_btn('APPLY', step=parameters['total_price']) itm_btn_9 = self.set_btn('<<') # рассположение кнопок в меню self.markup.row(itm_btn_1, itm_btn_2, itm_btn_3, itm_btn_4) self.markup.row(itm_btn_5, itm_btn_6, itm_btn_7) self.markup.row(itm_btn_9, itm_btn_8) return self.markup
class Keyboards: """ Класс Keyboards предназначен для создания и разметки клавиатуры бота """ # инициализация разметки def __init__(self): self.markup = None # инициализация менеджера для работы с БД self.BD = DBManager() def set_btn(self, name, step=0, quantity=0): """ Создает и возвращает кнопку по входным параметрам """ if name == "AMOUNT_ORDERS": config.KEYBOARD["AMOUNT_ORDERS"] = "{} {} {}".format( step + 1, ' из ', str(self.BD.count_rows_order())) if name == "AMOUNT_PRODUCT": config.KEYBOARD["AMOUNT_PRODUCT"] = "{}".format(quantity) if name == "APPLY": # создает кнопку оформить с данными о стоимости товара # округленного до 2 - го знака после запятой config.KEYBOARD["APPLY"] = "{}({}) руб".format( '✅ Оформить', round(utility.get_total_cost(self.BD), 2)) return KeyboardButton(config.KEYBOARD[name]) @staticmethod def set_inline_btn(name): """ Создает и возвращает инлайн кнопку по входным параметрам """ return InlineKeyboardButton(str(name), callback_data=str(name.id)) @staticmethod def remove_menu(): """ Удаляет данны кнопки и возвращает ее """ return ReplyKeyboardRemove() def info_menu(self): """ Создает разметку кнопок в меню info """ self.markup = ReplyKeyboardMarkup(True, True) itm_btn_1 = self.set_btn('<<') # расположение кнопок в меню self.markup.row(itm_btn_1) return self.markup def settings_menu(self): """ Создает разметку кнопок в меню settings """ self.markup = ReplyKeyboardMarkup(True, True) itm_btn_1 = self.set_btn('<<') # расположение кнопок в меню self.markup.row(itm_btn_1) return self.markup def start_menu(self): """ Создает разметку кнопок в основном меню и возвращает разметку """ self.markup = ReplyKeyboardMarkup(True, True) itm_btn_1 = self.set_btn('CHOOSE_GOODS') itm_btn_2 = self.set_btn('INFO') itm_btn_3 = self.set_btn('SETTINGS') # рассположение кнопок в меню self.markup.row(itm_btn_1) self.markup.row(itm_btn_2, itm_btn_3) return self.markup def category_menu(self): """ Создает разметку кнопок в меню категорий товара и возвращает разметку """ self.markup = ReplyKeyboardMarkup(True, True, row_width=1) self.markup.add(self.set_btn('SEMIPRODUCT')) self.markup.add(self.set_btn('GROCERY')) self.markup.add(self.set_btn('ICE_CREAM')) self.markup.row(self.set_btn('<<'), self.set_btn('ORDER')) return self.markup def set_select_category(self, category): """ Создает разметку инлайн кнопок в выбранной категории товара и возвращает разметку """ self.markup = InlineKeyboardMarkup(row_width=1) # загружаем в название инлайн кнопок данные с БД # в соответствие с категорией товара for item in self.BD.select_all_products_category(category): self.markup.add(self.set_inline_btn(item)) return self.markup def orders_menu(self, step, quantity): """ Создает разметку кнопок в заказе товара и возвращает разметку """ self.markup = ReplyKeyboardMarkup(True, True) itm_btn_1 = self.set_btn('X', step, quantity) itm_btn_2 = self.set_btn('DOWN', step, quantity) itm_btn_3 = self.set_btn('AMOUNT_PRODUCT', step, quantity) itm_btn_4 = self.set_btn('UP', step, quantity) itm_btn_5 = self.set_btn('BACK_STEP', step, quantity) itm_btn_6 = self.set_btn('AMOUNT_ORDERS', step, quantity) itm_btn_7 = self.set_btn('NEXT_STEP', step, quantity) itm_btn_8 = self.set_btn('APPLY', step, quantity) itm_btn_9 = self.set_btn('<<', step, quantity) # рассположение кнопок в меню self.markup.row(itm_btn_1, itm_btn_2, itm_btn_3, itm_btn_4) self.markup.row(itm_btn_5, itm_btn_6, itm_btn_7) self.markup.row(itm_btn_9, itm_btn_8) return self.markup