from aiogram import Router, F from aiogram.types import CallbackQuery, InlineKeyboardButton from aiogram.utils.keyboard import InlineKeyboardBuilder from sqlmodel.ext.asyncio.session import AsyncSession from typing import TYPE_CHECKING from ..context import ContextData, CallbackCommand from ....model.user import UserBase from ....model.settings import Settings from ....model import EntityPermission from ....utils.main import ( check_entity_permission, get_value_repr, get_entity_descriptor, ) from ..common.routing import route_callback if TYPE_CHECKING: from ....main import QBotApp router = Router() @router.callback_query(ContextData.filter(F.command == CallbackCommand.ENTITY_DELETE)) async def entity_delete_callback(query: CallbackQuery, **kwargs): callback_data: ContextData = kwargs["callback_data"] user: UserBase = kwargs["user"] db_session: AsyncSession = kwargs["db_session"] app: "QBotApp" = kwargs["app"] entity_descriptor = get_entity_descriptor(app=app, callback_data=callback_data) entity = await entity_descriptor.type_.get( session=db_session, id=int(callback_data.entity_id) ) if not check_entity_permission( entity=entity, user=user, permission=EntityPermission.DELETE ): return await query.answer( text=(await Settings.get(Settings.APP_STRINGS_FORBIDDEN)) ) if callback_data.data == "yes": await entity_descriptor.type_.remove( session=db_session, id=int(callback_data.entity_id), commit=True ) await route_callback(message=query, **kwargs) elif callback_data.data == "no": await route_callback(message=query, back=False, **kwargs) elif not callback_data.data: field_descriptor = entity_descriptor.fields_descriptors["name"] entity = await entity_descriptor.type_.get( session=db_session, id=int(callback_data.entity_id) ) return await query.message.edit_text( text=( await Settings.get(Settings.APP_STRINGS_CONFIRM_DELETE_P_NAME) ).format( name=get_value_repr( value=getattr(entity, field_descriptor.name), field_descriptor=field_descriptor, locale=user.lang, ) ), reply_markup=InlineKeyboardBuilder() .row( InlineKeyboardButton( text=(await Settings.get(Settings.APP_STRINGS_YES_BTN)), callback_data=ContextData( command=CallbackCommand.ENTITY_DELETE, entity_name=callback_data.entity_name, entity_id=callback_data.entity_id, form_params=callback_data.form_params, data="yes", ).pack(), ), InlineKeyboardButton( text=(await Settings.get(Settings.APP_STRINGS_NO_BTN)), callback_data=ContextData( command=CallbackCommand.ENTITY_ITEM, entity_name=callback_data.entity_name, entity_id=callback_data.entity_id, form_params=callback_data.form_params, data="no", ).pack(), ), ) .as_markup(), )