from aiogram import Router, F from aiogram.fsm.context import FSMContext from aiogram.types import Message, CallbackQuery, InlineKeyboardButton from aiogram.utils.keyboard import InlineKeyboardBuilder from babel.support import LazyProxy from logging import getLogger from sqlmodel.ext.asyncio.session import AsyncSession from ....main import QBotApp from ....model.settings import Settings from ....model.user import UserBase from ..context import ContextData, CallbackCommand from ..common import get_send_message from ....model.descriptors import EntityCaptionCallable logger = getLogger(__name__) router = Router() @router.callback_query(ContextData.filter(F.command == CallbackCommand.MENU_ENTRY_ENTITIES)) async def menu_entry_entities(message: CallbackQuery, **kwargs): stack = await save_navigation_context( callback_data = kwargs["callback_data"], state = kwargs["state"]) await entities_menu(message = message, navigation_stack = stack, **kwargs) async def entities_menu(message: Message | CallbackQuery, callback_data: ContextData, app: QBotApp, state: FSMContext, navigation_stack: list[ContextData], **kwargs): keyboard_builder = InlineKeyboardBuilder() entity_metadata = app.entity_metadata for entity in entity_metadata.entity_descriptors.values(): if entity.caption_btn.__class__ == EntityCaptionCallable: caption = entity.caption_btn(entity) or entity.name elif entity.caption_btn.__class__ == LazyProxy: caption = f"{f"{entity.icon} " if entity.icon else ""}{entity.caption_btn.value or entity.name}" else: caption = f"{f"{entity.icon} " if entity.icon else ""}{entity.caption_btn or entity.name}" keyboard_builder.row( InlineKeyboardButton( text = caption, callback_data = ContextData(command = CallbackCommand.ENTITY_LIST, entity_name = entity.name).pack())) context = pop_navigation_context(navigation_stack) if context: keyboard_builder.row( InlineKeyboardButton( text = (await Settings.get(Settings.APP_STRINGS_BACK_BTN)), callback_data = context.pack())) send_message = get_send_message(message) await send_message(text = (await Settings.get(Settings.APP_STRINGS_REFERENCES)), reply_markup = keyboard_builder.as_markup()) from ..navigation import save_navigation_context, pop_navigation_context