UI: выбор игрока при создании партии — выпадашка в стиле подсказок

Вместо нативного select — кнопка-триггер (аватар + ник) с выпадающим
списком всех игроков группы в стилистике подсказок инвайта; игроки,
уже выбранные в других строках, не предлагаются (заодно исключены
дубли). Для аватаров в списке MemberRead теперь отдаёт avatar_url.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-18 03:00:26 +03:00
co-authored by Claude Fable 5
parent 4a681430af
commit f22ee1ec29
7 changed files with 137 additions and 16 deletions
+14 -5
View File
@@ -17,6 +17,7 @@ from app.services import (
notification_service,
notify,
stats_service,
user_service,
)
router = APIRouter(prefix="/groups", tags=["groups"])
@@ -127,7 +128,12 @@ def list_members(
) -> list[s.MemberRead]:
group_service.assert_member(session, group_id, user.id) # type: ignore[arg-type]
return [
s.MemberRead(user_id=u.id, nickname=u.nickname, role=m.role)
s.MemberRead(
user_id=u.id,
nickname=u.nickname,
role=m.role,
avatar_url=user_service.avatar_url_for(u.id, u.avatar_path, u.updated_at),
)
for m, u in membership_service.list_members(session, group_id)
]
@@ -195,10 +201,13 @@ def change_member_role(
group_service.assert_owner(session, group_id, user.id) # type: ignore[arg-type]
group = group_service.get_group(session, group_id)
member = membership_service.change_role(session, group, user_id, body.role)
from app.services.user_service import get_user
u = get_user(session, user_id)
return s.MemberRead(user_id=u.id, nickname=u.nickname, role=member.role)
u = user_service.get_user(session, user_id)
return s.MemberRead(
user_id=u.id,
nickname=u.nickname,
role=member.role,
avatar_url=user_service.avatar_url_for(u.id, u.avatar_path, u.updated_at),
)
# ─── Партии и статистика группы ──────────────────────────────────────────────
+1
View File
@@ -147,6 +147,7 @@ class MemberRead(BaseModel):
user_id: int
nickname: str
role: str
avatar_url: str | None = None
class MemberAdd(BaseModel):