Modernize bot for Python 3.12

This commit is contained in:
Андрей Цой
2026-07-01 18:24:16 +09:00
parent 733298bf06
commit 3906398136
21 changed files with 263 additions and 161 deletions

View File

@@ -179,7 +179,8 @@ def get_participant_management_keyboard() -> InlineKeyboardMarkup:
[InlineKeyboardButton(text="📋 Список всех", callback_data="admin_list_all_participants"),
InlineKeyboardButton(text="🔍 Поиск", callback_data="admin_search_participants")],
[InlineKeyboardButton(text="📊 По розыгрышам", callback_data="admin_participants_by_lottery")],
[InlineKeyboardButton(text="📄 Отчет", callback_data="admin_participants_report")],
[InlineKeyboardButton(text="📄 Отчет", callback_data="admin_participants_report"),
InlineKeyboardButton(text="🏦 Счета", callback_data="admin_participants_accounts_report")],
[InlineKeyboardButton(text="◀️ Назад", callback_data="admin_panel")]
]
return InlineKeyboardMarkup(inline_keyboard=buttons)
@@ -2359,16 +2360,16 @@ async def show_participants_by_lottery(callback: CallbackQuery):
await callback.message.edit_text(text, reply_markup=InlineKeyboardMarkup(inline_keyboard=buttons))
@admin_router.callback_query(F.data == "admin_participants_report")
async def show_participants_report(callback: CallbackQuery):
"""Отчет по участникам"""
@admin_router.callback_query(F.data == "admin_participants_accounts_report")
async def show_participants_accounts_report(callback: CallbackQuery):
"""Отчет по участникам и привязанным счетам"""
if not await check_admin_access(callback.from_user.id):
await callback.answer("❌ Недостаточно прав", show_alert=True)
return
async with async_session_maker() as session:
from sqlalchemy import func, select
from ..core.models import User, Participation, Lottery
from ..core.models import User, Participation, Account
# Общая статистика по участникам
total_participants = await session.scalar(
@@ -2378,32 +2379,33 @@ async def show_participants_report(callback: CallbackQuery):
)
total_participations = await session.scalar(select(func.count(Participation.id)))
total_users = await session.scalar(select(func.count(User.id)))
# Топ активных участников
top_participants = await session.execute(
select(
User.first_name,
User.username,
User.account_number,
func.count(Participation.id).label('participations')
func.min(Account.account_number).label('account_sample'),
func.count(func.distinct(Participation.id)).label('participations')
)
.select_from(User)
.join(Participation)
.outerjoin(Account, Account.owner_id == User.id)
.group_by(User.id)
.order_by(func.count(Participation.id).desc())
.order_by(func.count(func.distinct(Participation.id)).desc())
.limit(10)
)
top_participants = top_participants.fetchall()
# Участники с аккаунтами vs без
users_with_accounts = await session.scalar(
select(func.count(User.id)).where(User.account_number.isnot(None))
select(func.count(func.distinct(Account.owner_id)))
)
users_without_accounts = await session.scalar(
select(func.count(User.id)).where(User.account_number.is_(None))
)
users_without_accounts = max((total_users or 0) - (users_with_accounts or 0), 0)
text = "📈 Отчет по участникам\n\n"
text = "📈 Отчет по участникам и счетам\n\n"
text += f"👥 Всего уникальных участников: {total_participants}\n"
text += f"📊 Всего участий: {total_participations}\n"
text += f"🏦 С номерами счетов: {users_with_accounts}\n"
@@ -2420,7 +2422,7 @@ async def show_participants_report(callback: CallbackQuery):
await callback.message.edit_text(
text,
reply_markup=InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text="🔃 Обновить", callback_data="admin_participants_report")],
[InlineKeyboardButton(text="🔃 Обновить", callback_data="admin_participants_accounts_report")],
[InlineKeyboardButton(text="◀️ Назад", callback_data="admin_participants")]
])
)
@@ -4827,7 +4829,7 @@ async def admin_broadcast_menu(callback: CallbackQuery, state: FSMContext):
buttons = [
[InlineKeyboardButton(text="✉️ Создать рассылку", callback_data="admin_broadcast_start")],
[InlineKeyboardButton(text="📱 Управление каналами", callback_data="admin_broadcast_channels")],
[InlineKeyboardButton(text="<EFBFBD> Статистика рассылок", callback_data="admin_broadcast_stats")],
[InlineKeyboardButton(text="📊 Статистика рассылок", callback_data="admin_broadcast_stats")],
[InlineKeyboardButton(text="◀️ Назад", callback_data="admin_panel")]
]
@@ -6085,4 +6087,4 @@ async def confirm_remove_admin(callback: CallbackQuery, state: FSMContext):
# Экспорт роутера
__all__ = ['admin_router']
__all__ = ['admin_router']