58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
"""Раздел «Пользователи»: список с поиском и карточка игрока."""
|
||
|
||
from __future__ import annotations
|
||
|
||
from fastapi import APIRouter, HTTPException, Request
|
||
from fastapi.responses import HTMLResponse
|
||
|
||
from common import __version__
|
||
from common.repositories import users_admin_repo
|
||
|
||
router = APIRouter(prefix="/users", tags=["users"])
|
||
|
||
#: Сколько пользователей показывать на странице.
|
||
PAGE_SIZE = 25
|
||
|
||
|
||
@router.get("", response_class=HTMLResponse)
|
||
async def list_users(request: Request, q: str = "", page: int = 1) -> HTMLResponse:
|
||
"""Список пользователей: поиск по нику/username/имени/ID и пагинация."""
|
||
total = await users_admin_repo.count_users(q)
|
||
pages = max((total + PAGE_SIZE - 1) // PAGE_SIZE, 1)
|
||
page = min(max(page, 1), pages)
|
||
|
||
return request.app.state.templates.TemplateResponse(
|
||
request=request,
|
||
name="users/list.html",
|
||
context={
|
||
"version": __version__,
|
||
"users": await users_admin_repo.list_users(
|
||
q,
|
||
limit=PAGE_SIZE,
|
||
offset=(page - 1) * PAGE_SIZE,
|
||
),
|
||
"q": q,
|
||
"page": page,
|
||
"pages": pages,
|
||
"total": total,
|
||
},
|
||
)
|
||
|
||
|
||
@router.get("/{user_id}", response_class=HTMLResponse)
|
||
async def user_card(request: Request, user_id: int) -> HTMLResponse:
|
||
"""Карточка пользователя со сводкой и последними операциями по балансу."""
|
||
user = await users_admin_repo.get_user(user_id)
|
||
if user is None:
|
||
raise HTTPException(status_code=404, detail="Пользователь не найден")
|
||
|
||
return request.app.state.templates.TemplateResponse(
|
||
request=request,
|
||
name="users/card.html",
|
||
context={
|
||
"version": __version__,
|
||
"user": user,
|
||
"money": await users_admin_repo.money_history(user_id),
|
||
},
|
||
)
|