add delete button to resident history detail window for creator only; dynamic back navigation from delete confirmation

This commit is contained in:
2026-07-15 01:48:34 +03:00
parent f775a34885
commit 7a5e6cb7a8
2 changed files with 47 additions and 5 deletions
@@ -1,6 +1,6 @@
from aiogram import Bot from aiogram import Bot
from aiogram.enums import ContentType from aiogram.enums import ContentType
from aiogram.types import Message, CallbackQuery, InputMediaPhoto from aiogram.types import Message, CallbackQuery, InputMediaPhoto, User
from aiogram.utils.markdown import html_decoration as hd from aiogram.utils.markdown import html_decoration as hd
from aiogram_dialog import Window, DialogManager from aiogram_dialog import Window, DialogManager
from aiogram_dialog.widgets.text import Format, Const from aiogram_dialog.widgets.text import Format, Const
@@ -28,6 +28,7 @@ from dutylog.infrastructure.database.repositories.users_repository import (
from dutylog.infrastructure.database.repositories.hours_transactions_repository import ( from dutylog.infrastructure.database.repositories.hours_transactions_repository import (
HoursTransactionsRepository, HoursTransactionsRepository,
) )
from dutylog.infrastructure.utils.config import Config
from dutylog.infrastructure.utils.datetime import msk_now from dutylog.infrastructure.utils.datetime import msk_now
@@ -660,10 +661,12 @@ async def on_transaction_selected(
@inject @inject
async def get_transaction_detail_data( async def get_transaction_detail_data(
event_from_user: User,
dialog_manager: DialogManager, dialog_manager: DialogManager,
transactions_repository: FromDishka[HoursTransactionsRepository], transactions_repository: FromDishka[HoursTransactionsRepository],
residents_repository: FromDishka[ResidentsRepository], residents_repository: FromDishka[ResidentsRepository],
users_repository: FromDishka[UsersRepository], users_repository: FromDishka[UsersRepository],
config: FromDishka[Config],
**kwargs, **kwargs,
): ):
tx_id = dialog_manager.dialog_data.get("selected_transaction_id") tx_id = dialog_manager.dialog_data.get("selected_transaction_id")
@@ -712,10 +715,13 @@ async def get_transaction_detail_data(
else: else:
detail_content = content detail_content = content
is_creator = event_from_user.id == config.bot.creator_id
return { return {
"detail_content": detail_content, "detail_content": detail_content,
"photo_media": photo_media, "photo_media": photo_media,
"has_multiple_photos": has_multiple_photos, "has_multiple_photos": has_multiple_photos,
"is_creator": is_creator,
} }
@@ -727,6 +733,16 @@ async def on_search_transactions(
await dialog_manager.switch_to(AdminMenuSG.resident_history_search_input) await dialog_manager.switch_to(AdminMenuSG.resident_history_search_input)
@inject
async def on_resident_delete_transaction_click(
callback: CallbackQuery,
button: Button,
dialog_manager: DialogManager,
):
dialog_manager.dialog_data["delete_source"] = "resident_history"
await dialog_manager.switch_to(AdminMenuSG.transactions_history_delete_confirm)
async def on_transaction_search_input( async def on_transaction_search_input(
message: Message, message: Message,
widget: MessageInput, widget: MessageInput,
@@ -1141,8 +1157,16 @@ resident_history_window = Window(
) )
resident_history_detail_window = Window( resident_history_detail_window = Window(
DynamicMedia("photo_media"), DynamicMedia("photo_media", when=F["photo_media"]),
Format("{detail_content}", when=F["detail_content"]), Format("{detail_content}", when=F["detail_content"]),
Row(
Button(
Const("🗑 Удалить"),
id="resident_delete_transaction_btn",
on_click=on_resident_delete_transaction_click,
when=F["is_creator"],
),
),
SwitchTo( SwitchTo(
Const("◀️ К списку"), Const("◀️ К списку"),
id="back_to_history_from_detail", id="back_to_history_from_detail",
@@ -118,6 +118,7 @@ async def on_delete_transaction_click(
button: Button, button: Button,
dialog_manager: DialogManager, dialog_manager: DialogManager,
): ):
dialog_manager.dialog_data["delete_source"] = "transactions_history"
await dialog_manager.switch_to(AdminMenuSG.transactions_history_delete_confirm) await dialog_manager.switch_to(AdminMenuSG.transactions_history_delete_confirm)
@@ -132,9 +133,26 @@ async def on_delete_transaction_confirm(
if tx_id: if tx_id:
await transactions_repository.delete_transaction(int(tx_id)) await transactions_repository.delete_transaction(int(tx_id))
await callback.answer("✅ Транзакция удалена", show_alert=True) await callback.answer("✅ Транзакция удалена", show_alert=True)
source = dialog_manager.dialog_data.pop("delete_source", "transactions_history")
if source == "resident_history":
await dialog_manager.switch_to(AdminMenuSG.resident_history)
else:
await dialog_manager.switch_to(AdminMenuSG.transactions_history) await dialog_manager.switch_to(AdminMenuSG.transactions_history)
@inject
async def on_delete_transaction_back(
callback: CallbackQuery,
button: Button,
dialog_manager: DialogManager,
):
source = dialog_manager.dialog_data.pop("delete_source", "transactions_history")
if source == "resident_history":
await dialog_manager.switch_to(AdminMenuSG.resident_history_detail)
else:
await dialog_manager.switch_to(AdminMenuSG.transactions_history_detail)
@inject @inject
async def get_transaction_detail_data( async def get_transaction_detail_data(
dialog_manager, dialog_manager,
@@ -257,10 +275,10 @@ transactions_history_delete_confirm_window = Window(
on_click=on_delete_transaction_confirm, on_click=on_delete_transaction_confirm,
), ),
), ),
SwitchTo( Button(
Const("◀️ Назад"), Const("◀️ Назад"),
id="back_to_transaction_detail", id="back_to_transaction_detail",
state=AdminMenuSG.transactions_history_detail, on_click=on_delete_transaction_back,
), ),
state=AdminMenuSG.transactions_history_delete_confirm, state=AdminMenuSG.transactions_history_delete_confirm,
) )