feat: удалены все заглушки, реализована функция очистки неактивных пользователей
Some checks reported errors
continuous-integration/drone/push Build encountered an error
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:
45
main.py
45
main.py
@@ -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():
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user