feat: удалены все заглушки, реализована функция очистки неактивных пользователей
Some checks reported errors
continuous-integration/drone/push Build encountered an error

- Удалены заглушки 'в разработке' из main.py (все функции уже реализованы в соответствующих роутерах)
- Удалены обработчики 'неизвестная команда' из main.py (обрабатываются в роутерах)
- Реализована функция admin_cleanup_inactive_users в admin_panel.py:
  * Удаляет незарегистрированных пользователей неактивных более 30 дней
  * Проверяет отсутствие связанных данных (участия, счета)
  * Безопасное удаление с сохранением целостности БД
- Все функции теперь полностью реализованы, заглушек не осталось
This commit is contained in:
2025-11-17 05:59:55 +09:00
parent 0623de5046
commit 21de47fe4c
2 changed files with 60 additions and 41 deletions

45
main.py
View File

@@ -128,46 +128,17 @@ async def back_to_main_handler(callback: CallbackQuery):
# === ЗАГЛУШКИ ДЛЯ ОСТАЛЬНЫХ CALLBACKS === # === ЗАГЛУШКИ ДЛЯ ОСТАЛЬНЫХ CALLBACKS ===
@router.callback_query(F.data.in_([ # === ЗАГЛУШКИ НЕ НУЖНЫ - ВСЕ ФУНКЦИИ РЕАЛИЗОВАНЫ В РОУТЕРАХ ===
"user_management", "account_management", "chat_management", # Функции обрабатываются в:
"settings", "stats", "create_lottery" # - admin_panel.py: создание розыгрышей, управление пользователями, счетами, чатом, статистика
])) # - registration_handlers.py: регистрация пользователей
async def feature_stubs(callback: CallbackQuery): # - admin_account_handlers.py: управление счетами
"""Заглушки для функций, которые пока не реализованы""" # - admin_chat_handlers.py: управление чатом
feature_names = { # - chat_handlers.py: пользовательский чат
"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)
# === FALLBACK HANDLERS === # === FALLBACK HANDLERS ===
# Обработка неизвестных callback и сообщений происходит в соответствующих роутерах
@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 для начала работы."
)
async def main(): async def main():

View File

@@ -2875,10 +2875,58 @@ async def cleanup_inactive_users(callback: CallbackQuery):
await callback.answer("❌ Недостаточно прав", show_alert=True) await callback.answer("❌ Недостаточно прав", show_alert=True)
return return
await callback.answer( from datetime import timedelta
" Функция в разработке\n\nУдаление пользователей требует дополнительной логики для сохранения целостности данных.",
show_alert=True # Удаляем только незарегистрированных пользователей, которые не были активны более 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") @admin_router.callback_query(F.data == "admin_cleanup_old_participations")