- API и страницы профиля (редактирование, смена пароля, аватар), публичные карточки. - Сайдбар: блок пользователя, пункт Users для admin/root, исправлен порядок инициализации (показ admin-only после initAuthSession, currentUser). - GET /auth/me: ответ через ProfileMeResponse, исправлена валидация (is_founder bool). Команды и роли - Маршруты и UI команд; при редактировании роли: видимость Team, выбор команды в модалке, только команды с активным членством; API team_id в details/ update. - GET /api/v1/teams?membership=active для списка «своих» команд. - Форма роли: сегмент Team, панель выбора команды только при Team и не при с
30 lines
1.1 KiB
Python
30 lines
1.1 KiB
Python
from datetime import datetime, timezone
|
|
from typing import Literal
|
|
|
|
from pydantic import BaseModel, Field, field_validator
|
|
|
|
|
|
class AdminUserPatchRequest(BaseModel):
|
|
is_active: bool = Field(..., description="Whether the user may sign in (ignored if user is directory-removed).")
|
|
|
|
|
|
class AdminUserRoleUpdateRequest(BaseModel):
|
|
role: Literal["root", "admin", "user"] = Field(
|
|
...,
|
|
description="Chief (root) group appoints other roots or admin staff; users group is everyone else by account_group.",
|
|
)
|
|
|
|
|
|
class TemporaryBanRequest(BaseModel):
|
|
"""Suspend account until a fixed time (chief administrators only)."""
|
|
|
|
until: datetime = Field(..., description="Timestamp when the suspension ends (timezone-aware or UTC).")
|
|
reason: str = Field(..., min_length=1, max_length=4000, description="Reason shown to the user on login.")
|
|
|
|
@field_validator("until", mode="after")
|
|
@classmethod
|
|
def assume_utc_if_naive(cls, v: datetime) -> datetime:
|
|
if v.tzinfo is None:
|
|
return v.replace(tzinfo=timezone.utc)
|
|
return v
|