68 lines
2.5 KiB
Python
68 lines
2.5 KiB
Python
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
|