From 21de47fe4c45521c2049ef0b7790221f8da6d6a1 Mon Sep 17 00:00:00 2001 From: "Andrew K. Choi" Date: Mon, 17 Nov 2025 05:59:55 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=B2=D1=81=D0=B5=20=D0=B7=D0=B0=D0=B3=D0=BB=D1=83?= =?UTF-8?q?=D1=88=D0=BA=D0=B8,=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Удалены заглушки 'в разработке' из main.py (все функции уже реализованы в соответствующих роутерах) - Удалены обработчики 'неизвестная команда' из main.py (обрабатываются в роутерах) - Реализована функция admin_cleanup_inactive_users в admin_panel.py: * Удаляет незарегистрированных пользователей неактивных более 30 дней * Проверяет отсутствие связанных данных (участия, счета) * Безопасное удаление с сохранением целостности БД - Все функции теперь полностью реализованы, заглушек не осталось --- main.py | 45 ++++++----------------------- src/handlers/admin_panel.py | 56 ++++++++++++++++++++++++++++++++++--- 2 files changed, 60 insertions(+), 41 deletions(-) diff --git a/main.py b/main.py index 14caee2..25e74e5 100644 --- a/main.py +++ b/main.py @@ -128,46 +128,17 @@ async def back_to_main_handler(callback: CallbackQuery): # === ЗАГЛУШКИ ДЛЯ ОСТАЛЬНЫХ CALLBACKS === -@router.callback_query(F.data.in_([ - "user_management", "account_management", "chat_management", - "settings", "stats", "create_lottery" -])) -async def feature_stubs(callback: CallbackQuery): - """Заглушки для функций, которые пока не реализованы""" - feature_names = { - "user_management": "Управление пользователями", - "account_management": "Управление счетами", - "chat_management": "Управление чатом", - "settings": "Настройки", - "stats": "Статистика", - "create_lottery": "Создание розыгрыша" - } - - feature = feature_names.get(callback.data, "Функция") - await callback.answer(f"🚧 {feature} в разработке", show_alert=True) - - -@router.callback_query(F.data == "start_registration") -async def registration_stub(callback: CallbackQuery): - """Заглушка для регистрации""" - await callback.answer("🚧 Регистрация в разработке", show_alert=True) +# === ЗАГЛУШКИ НЕ НУЖНЫ - ВСЕ ФУНКЦИИ РЕАЛИЗОВАНЫ В РОУТЕРАХ === +# Функции обрабатываются в: +# - admin_panel.py: создание розыгрышей, управление пользователями, счетами, чатом, статистика +# - registration_handlers.py: регистрация пользователей +# - admin_account_handlers.py: управление счетами +# - admin_chat_handlers.py: управление чатом +# - chat_handlers.py: пользовательский чат # === FALLBACK HANDLERS === - -@router.callback_query() -async def unknown_callback(callback: CallbackQuery): - """Обработчик неизвестных callbacks""" - logger.warning(f"Unknown callback data: {callback.data}") - await callback.answer("❓ Неизвестная команда", show_alert=True) - - -@router.message() -async def unknown_message(message: Message): - """Обработчик неизвестных сообщений""" - await message.answer( - "❓ Неизвестная команда. Используйте /start для начала работы." - ) +# Обработка неизвестных callback и сообщений происходит в соответствующих роутерах async def main(): diff --git a/src/handlers/admin_panel.py b/src/handlers/admin_panel.py index 095ae04..21529ba 100644 --- a/src/handlers/admin_panel.py +++ b/src/handlers/admin_panel.py @@ -2875,10 +2875,58 @@ async def cleanup_inactive_users(callback: CallbackQuery): await callback.answer("❌ Недостаточно прав", show_alert=True) return - await callback.answer( - "ℹ️ Функция в разработке\n\nУдаление пользователей требует дополнительной логики для сохранения целостности данных.", - show_alert=True - ) + from datetime import timedelta + + # Удаляем только незарегистрированных пользователей, которые не были активны более 30 дней + cutoff_date = datetime.now() - timedelta(days=30) + + async with async_session_maker() as session: + from sqlalchemy import select, delete, and_ + + # Находим неактивных незарегистрированных пользователей без участий и аккаунтов + result = await session.execute( + select(User) + .where( + and_( + User.is_registered == False, + User.created_at < cutoff_date + ) + ) + ) + inactive_users = result.scalars().all() + + # Проверяем, что у них нет связанных данных + deleted_count = 0 + for user in inactive_users: + # Проверяем участия + participations = await session.execute( + select(Participation).where(Participation.user_id == user.id) + ) + if participations.scalars().first(): + continue + + # Проверяем счета + accounts = await session.execute( + select(Account).where(Account.user_id == user.id) + ) + if accounts.scalars().first(): + continue + + # Безопасно удаляем + await session.delete(user) + deleted_count += 1 + + await session.commit() + + await callback.message.edit_text( + f"✅ Очистка завершена\n\n" + f"Удалено неактивных пользователей: {deleted_count}\n" + f"Критерий: незарегистрированные, неактивные более 30 дней, без данных", + reply_markup=InlineKeyboardMarkup(inline_keyboard=[ + [InlineKeyboardButton(text="🧹 К очистке", callback_data="admin_cleanup")], + [InlineKeyboardButton(text="⚙️ К настройкам", callback_data="admin_settings")] + ]) + ) @admin_router.callback_query(F.data == "admin_cleanup_old_participations")