From 0a5ca6ba2607a269740e9a000239bc848760abb0 Mon Sep 17 00:00:00 2001 From: devproject Date: Sun, 14 Jun 2026 21:20:58 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20admin.py=20=D1=85=D0=B5=D0=BD=D0=B4=D0=BB=D0=B5=D1=80?= =?UTF-8?q?=20(=D0=B7=D0=B0=D0=B1=D1=8B=D1=82=20=D0=B2=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D1=8B=D0=B4=D1=83=D1=89=D0=B5=D0=BC=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BC=D0=B8=D1=82=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/handlers/admin.py | 73 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 app/handlers/admin.py diff --git a/app/handlers/admin.py b/app/handlers/admin.py new file mode 100644 index 0000000..ebb5451 --- /dev/null +++ b/app/handlers/admin.py @@ -0,0 +1,73 @@ +from aiogram import Router, F +from aiogram.types import Message, CallbackQuery +from aiogram.filters import Command +from app.db.memory import load_bookings +from app.config import ADMIN_IDS +from app.keyboards.menu import menu +from app.logger import logger + +router = Router() + + +def is_admin(user_id: int) -> bool: + return user_id in ADMIN_IDS + + +@router.message(Command("admin")) +async def admin_panel(message: Message): + if not is_admin(message.from_user.id): + await message.answer( + "⛔️ Доступ запрещен" + ) + return + + logger.info("Admin {uid} opened admin panel", uid=message.from_user.id) + + bookings = load_bookings() + active = [b for b in bookings if b.get("status") == "active"] + + if not active: + await message.answer( + "📋 Активных записей нет" + ) + return + + from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton + + for booking in active: + buttons = [ + [ + InlineKeyboardButton( + text="❌ Отменить", + callback_data=f"admin_cancel_{booking['id']}" + ) + ] + ] + user_name = booking.get("user_name", f"id{booking['user_id']}") + await message.answer( + f"📋 Запись #{booking['id']}\n" + f"👤 Клиент: {user_name}\n" + f"💆 Услуга: {booking['service']}\n" + f"👤 Мастер: {booking['master']}\n" + f"📅 Дата: {booking['date']}\n" + f"🕒 Время: {booking['time']}", + reply_markup=InlineKeyboardMarkup(inline_keyboard=buttons) + ) + + +@router.callback_query(F.data.startswith("admin_cancel_")) +async def admin_cancel_booking(callback: CallbackQuery): + if not is_admin(callback.from_user.id): + await callback.answer("⛔️ Нет доступа") + return + + booking_id = int(callback.data.split("_")[2]) + logger.info("Admin {uid} cancelled booking #{bid}", uid=callback.from_user.id, bid=booking_id) + + from app.db.memory import cancel_booking + cancel_booking(booking_id) + + await callback.message.edit_text( + f"✅ Запись #{booking_id} отменена админом" + ) + await callback.answer("Запись отменена")