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:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user