from aiogram import Router, F from aiogram.fsm.context import FSMContext 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_entity_item_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"] state: FSMContext = kwargs["state"] state_data = await state.get_data() kwargs["state_data"] = state_data 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 not callback_data.data: 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=await get_entity_item_repr(entity=entity)), 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, ).pack(), ), ) .as_markup(), )