Modernize bot for Python 3.12
This commit is contained in:
@@ -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']
|
||||
|
||||
Reference in New Issue
Block a user