Python функция не выполняется, и не дает ошибку

Рейтинг: 2Ответов: 1Опубликовано: 18.06.2023

Код ниже имеет трехуровневую навигацию, все работает до перехода к show_items, далее не вызывается ни одна ошибка, просто ничего не происходит, подскажите как можно решить?

@dp.message_handler(commands=['products'])
@dp.message_handler(Text(equals=[' Товары']))
async def show_menu(message: types.Message):
    await list_categories(message)


async def list_categories(message: Union[types.Message, types.CallbackQuery], **kwargs):
    markup = await categories_keyboard()

    if isinstance(message, types.Message):
        await message.answer("Смотри что у нас есть", reply_markup=markup)
    elif isinstance(message, types.CallbackQuery):
        call = message
        await call.message.edit_reply_markup(markup)


async def list_subcategories(call: types.CallbackQuery, category: str, subcategory: str = None):
    markup = await subcategories_keyboard(category_code=category)
    await call.message.edit_reply_markup(markup)


async def list_items(call, category=None, subcategory=None, item_id=None, callback=None):
    markup = await items_kb(category_code=category, subcategory_code=subcategory)
    message = call.message
    try:
        await message.edit_reply_markup(reply_markup=markup)
    except MessageNotModified:
        pass


async def show_items(callback: types.CallbackQuery, category_code, subcategory_code, item_id):
    markup = await item_keyboard(category_code, subcategory_code, item_id)

    item = await db.sql_get_products(callback)
    item_name, item_price = item[7], item[9]
    text = f"Купите {item_name} за {item_price} рублей."
    await callback.message.edit_text(text, reply_markup=markup)


@dp.callback_query_handler(menu_cd.filter())
async def navigate(call: types.CallbackQuery, callback_data: dict):
    current_level = callback_data.get('level')
    category = callback_data.get('category')
    subcategory = callback_data.get('subcategory')
    item_id = callback_data.get('item_id')

    levels = {
        "0": list_categories,
        "1": list_subcategories,
        "2": list_items,
        "3": show_items
    }

    current_level_func = levels[current_level]
    callback = {"callback_data": callback_data}

    if current_level == "1":
        await current_level_func(call, category=category, subcategory=subcategory)
    else:
        await current_level_func(call, category=category, subcategory=subcategory, item_id=item_id,
                                 callback={**callback_data, 'level': '3'})

Так же код sql запроса:

    async def sql_get_products(self):
        items = self.cursor.execute("SELECT img, name, description, price FROM item").fetchall()
        return items

Ответы

▲ 1

В функции sql_get_products укажите параметры, которые нужно передать в запрос:

async def sql_get_products(self, item_id):
    items = self.cursor.execute("SELECT img, name, description, price FROM item WHERE id=?", (item_id,)).fetchall()
    return items

В функции show_items вызовите функцию sql_get_products с передачей аргумента item_id:

item = await db.sql_get_products(item_id)

Внесите изменения в функцию navigate, чтобы вызывать show_items с правильными аргументами:

if current_level == "2":
    await current_level_func(call, category=category, subcategory=subcategory, item_id=item_id,
                             callback={**callback_data, 'level': '3'})

После внесения этих изменений функция show_items должна вызываться правильно и отображать информацию о продукте.