add transaction deletion for creator: delete button in detail window, confirmation window, delete_transaction repo method

This commit is contained in:
2026-07-15 01:37:16 +03:00
parent 78930ab920
commit f9d65b159a
5 changed files with 61 additions and 3 deletions
@@ -85,6 +85,7 @@ from dutylog.application.bot.creator_dialogs.admins_management import (
from dutylog.application.bot.creator_dialogs.transactions_history import ( from dutylog.application.bot.creator_dialogs.transactions_history import (
transactions_history_window, transactions_history_window,
transactions_history_detail_window, transactions_history_detail_window,
transactions_history_delete_confirm_window,
) )
@@ -151,4 +152,5 @@ admin_menu_dialog = Dialog(
add_admin_confirm_window, add_admin_confirm_window,
transactions_history_window, transactions_history_window,
transactions_history_detail_window, transactions_history_detail_window,
transactions_history_delete_confirm_window,
) )
@@ -1,6 +1,11 @@
from dutylog.application.bot.creator_dialogs.transactions_history import ( from dutylog.application.bot.creator_dialogs.transactions_history import (
transactions_history_window, transactions_history_window,
transactions_history_detail_window, transactions_history_detail_window,
transactions_history_delete_confirm_window,
) )
__all__ = ["transactions_history_window", "transactions_history_detail_window"] __all__ = [
"transactions_history_window",
"transactions_history_detail_window",
"transactions_history_delete_confirm_window",
]
@@ -1,9 +1,9 @@
from aiogram import Bot from aiogram import Bot
from aiogram.enums import ContentType from aiogram.enums import ContentType
from aiogram.types import CallbackQuery, InputMediaPhoto from aiogram.types import CallbackQuery, InputMediaPhoto
from aiogram_dialog import Window from aiogram_dialog import Window, DialogManager
from aiogram_dialog.widgets.text import Format, Const from aiogram_dialog.widgets.text import Format, Const
from aiogram_dialog.widgets.kbd import SwitchTo, ScrollingGroup, Select, Button from aiogram_dialog.widgets.kbd import SwitchTo, ScrollingGroup, Select, Button, Row
from aiogram_dialog.widgets.media import DynamicMedia from aiogram_dialog.widgets.media import DynamicMedia
from aiogram_dialog.api.entities.media import MediaAttachment, MediaId from aiogram_dialog.api.entities.media import MediaAttachment, MediaId
from magic_filter import F from magic_filter import F
@@ -112,6 +112,29 @@ async def on_creator_transaction_selected(
await dialog_manager.switch_to(AdminMenuSG.transactions_history_detail) await dialog_manager.switch_to(AdminMenuSG.transactions_history_detail)
@inject
async def on_delete_transaction_click(
callback: CallbackQuery,
button: Button,
dialog_manager: DialogManager,
):
await dialog_manager.switch_to(AdminMenuSG.transactions_history_delete_confirm)
@inject
async def on_delete_transaction_confirm(
callback: CallbackQuery,
button: Button,
dialog_manager: DialogManager,
transactions_repository: FromDishka[HoursTransactionsRepository],
):
tx_id = dialog_manager.dialog_data.get("selected_transaction_id")
if tx_id:
await transactions_repository.delete_transaction(int(tx_id))
await callback.answer("✅ Транзакция удалена", show_alert=True)
await dialog_manager.switch_to(AdminMenuSG.transactions_history)
@inject @inject
async def get_transaction_detail_data( async def get_transaction_detail_data(
dialog_manager, dialog_manager,
@@ -209,6 +232,13 @@ transactions_history_window = Window(
transactions_history_detail_window = Window( transactions_history_detail_window = Window(
DynamicMedia("photo_media"), DynamicMedia("photo_media"),
Format("{detail_content}", when=F["detail_content"]), Format("{detail_content}", when=F["detail_content"]),
Row(
Button(
Const("🗑 Удалить"),
id="delete_transaction_btn",
on_click=on_delete_transaction_click,
),
),
SwitchTo( SwitchTo(
Const("◀️ К списку"), Const("◀️ К списку"),
id="back_to_transactions_from_detail", id="back_to_transactions_from_detail",
@@ -217,3 +247,20 @@ transactions_history_detail_window = Window(
state=AdminMenuSG.transactions_history_detail, state=AdminMenuSG.transactions_history_detail,
getter=get_transaction_detail_data, getter=get_transaction_detail_data,
) )
transactions_history_delete_confirm_window = Window(
Const("<blockquote>🗑 <b>Удаление транзакции</b></blockquote>\n\n⚠️ Вы уверены, что хотите удалить эту транзакцию?\nЭто действие нельзя отменить."),
Row(
Button(
Const("✅ Да, удалить"),
id="confirm_delete_transaction_btn",
on_click=on_delete_transaction_confirm,
),
),
SwitchTo(
Const("◀️ Назад"),
id="back_to_transaction_detail",
state=AdminMenuSG.transactions_history_detail,
),
state=AdminMenuSG.transactions_history_delete_confirm,
)
@@ -73,6 +73,7 @@ class AdminMenuSG(StatesGroup):
add_admin_confirm = State() add_admin_confirm = State()
transactions_history = State() transactions_history = State()
transactions_history_detail = State() transactions_history_detail = State()
transactions_history_delete_confirm = State()
class CreatorMenuSG(StatesGroup): class CreatorMenuSG(StatesGroup):
@@ -144,6 +144,9 @@ class HoursTransactionsRepository:
) -> HoursTransaction | None: ) -> HoursTransaction | None:
return await self.transactions_dao.get_by_id(transaction_id) return await self.transactions_dao.get_by_id(transaction_id)
async def delete_transaction(self, transaction_id: int) -> None:
await self.transactions_dao.delete(transaction_id)
async def get_by_period(self, start_date, end_date) -> list[HoursTransaction]: async def get_by_period(self, start_date, end_date) -> list[HoursTransaction]:
return await self.transactions_dao.get_by_period(start_date, end_date) return await self.transactions_dao.get_by_period(start_date, end_date)