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 typing import TYPE_CHECKING 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 if TYPE_CHECKING: from ....main import QBotApp logger = getLogger(__name__) router = Router() @router.callback_query(ContextData.filter(F.command == CallbackCommand.MENU_ENTRY_ENTITIES)) async def menu_entry_entities(message: CallbackQuery, **kwargs): callback_data: ContextData = kwargs["callback_data"] state: FSMContext = kwargs["state"] state_data = await state.get_data() kwargs["state_data"] = state_data stack = save_navigation_context(callback_data = callback_data, state_data = state_data) await entities_menu(message = message, navigation_stack = stack, **kwargs) async def entities_menu(message: Message | CallbackQuery, 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_plural.__class__ == EntityCaptionCallable: caption = entity.caption_plural(entity) or entity.name elif entity.caption_plural.__class__ == LazyProxy: caption = f"{f"{entity.icon} " if entity.icon else ""}{entity.caption_plural.value or entity.name}" else: caption = f"{f"{entity.icon} " if entity.icon else ""}{entity.caption_plural 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())) state_data = kwargs["state_data"] await state.set_data(state_data) 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