- 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 и не при с
25 lines
618 B
Python
25 lines
618 B
Python
"""Account availability (temporary ban expiry, etc.)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import asyncpg
|
|
|
|
|
|
async def clear_expired_temporary_ban(conn: asyncpg.Connection, user_id: str) -> None:
|
|
"""If ban_until has passed, clear ban fields and re-enable login."""
|
|
await conn.execute(
|
|
"""
|
|
update users
|
|
set
|
|
is_active = true,
|
|
ban_until = null,
|
|
ban_reason = null,
|
|
banned_by_id = null,
|
|
updated_at = now()
|
|
where id = $1::uuid
|
|
and ban_until is not null
|
|
and ban_until <= now()
|
|
""",
|
|
user_id,
|
|
)
|