ctfy.sdk.admin_resources.users
client.admin.users — user roster + role mutation (admin).
1"""``client.admin.users`` — user roster + role mutation (admin).""" 2 3from __future__ import annotations 4 5import builtins 6 7from ctfy.sdk._helpers import _raise_for_status 8from ctfy.sdk.base import BaseHttpClient 9from ctfy.server.models import AdminUserInfo 10 11 12class AdminUsersResource: 13 """Admin-or-better user listing, lookup and promotion.""" 14 15 def __init__(self, http: BaseHttpClient) -> None: 16 self._http = http 17 18 def list(self, offset: int = 0, limit: int = 50) -> builtins.list[AdminUserInfo]: 19 """Every user known to the platform, with role + promotion audit.""" 20 resp = self._http.request("GET", "/admin/users", params={"offset": offset, "limit": limit}) 21 _raise_for_status(resp) 22 return [AdminUserInfo.model_validate(u) for u in resp.json()["items"]] 23 24 def get(self, user_id: str) -> AdminUserInfo: 25 """Admin-or-better: single-user lookup with the audit fields 26 (role, promoted_by, promoted_at, current team summary). Skips 27 the list scan :meth:`list` would otherwise force.""" 28 resp = self._http.request("GET", f"/admin/users/{user_id}") 29 _raise_for_status(resp) 30 return AdminUserInfo.model_validate(resp.json()) 31 32 def set_role(self, user_id: str, role: str) -> AdminUserInfo: 33 """Promote / demote between ``"user"`` and ``"admin"``. 34 35 Requires **super-admin**. ``super_admin`` role is env-anchored and 36 cannot be changed via API; trying returns 403. 37 """ 38 resp = self._http.request( 39 "PATCH", 40 f"/admin/users/{user_id}/role", 41 json={"role": role}, 42 ) 43 _raise_for_status(resp) 44 return AdminUserInfo.model_validate(resp.json())
class
AdminUsersResource:
13class AdminUsersResource: 14 """Admin-or-better user listing, lookup and promotion.""" 15 16 def __init__(self, http: BaseHttpClient) -> None: 17 self._http = http 18 19 def list(self, offset: int = 0, limit: int = 50) -> builtins.list[AdminUserInfo]: 20 """Every user known to the platform, with role + promotion audit.""" 21 resp = self._http.request("GET", "/admin/users", params={"offset": offset, "limit": limit}) 22 _raise_for_status(resp) 23 return [AdminUserInfo.model_validate(u) for u in resp.json()["items"]] 24 25 def get(self, user_id: str) -> AdminUserInfo: 26 """Admin-or-better: single-user lookup with the audit fields 27 (role, promoted_by, promoted_at, current team summary). Skips 28 the list scan :meth:`list` would otherwise force.""" 29 resp = self._http.request("GET", f"/admin/users/{user_id}") 30 _raise_for_status(resp) 31 return AdminUserInfo.model_validate(resp.json()) 32 33 def set_role(self, user_id: str, role: str) -> AdminUserInfo: 34 """Promote / demote between ``"user"`` and ``"admin"``. 35 36 Requires **super-admin**. ``super_admin`` role is env-anchored and 37 cannot be changed via API; trying returns 403. 38 """ 39 resp = self._http.request( 40 "PATCH", 41 f"/admin/users/{user_id}/role", 42 json={"role": role}, 43 ) 44 _raise_for_status(resp) 45 return AdminUserInfo.model_validate(resp.json())
Admin-or-better user listing, lookup and promotion.
19 def list(self, offset: int = 0, limit: int = 50) -> builtins.list[AdminUserInfo]: 20 """Every user known to the platform, with role + promotion audit.""" 21 resp = self._http.request("GET", "/admin/users", params={"offset": offset, "limit": limit}) 22 _raise_for_status(resp) 23 return [AdminUserInfo.model_validate(u) for u in resp.json()["items"]]
Every user known to the platform, with role + promotion audit.
25 def get(self, user_id: str) -> AdminUserInfo: 26 """Admin-or-better: single-user lookup with the audit fields 27 (role, promoted_by, promoted_at, current team summary). Skips 28 the list scan :meth:`list` would otherwise force.""" 29 resp = self._http.request("GET", f"/admin/users/{user_id}") 30 _raise_for_status(resp) 31 return AdminUserInfo.model_validate(resp.json())
Admin-or-better: single-user lookup with the audit fields
(role, promoted_by, promoted_at, current team summary). Skips
the list scan list() would otherwise force.
33 def set_role(self, user_id: str, role: str) -> AdminUserInfo: 34 """Promote / demote between ``"user"`` and ``"admin"``. 35 36 Requires **super-admin**. ``super_admin`` role is env-anchored and 37 cannot be changed via API; trying returns 403. 38 """ 39 resp = self._http.request( 40 "PATCH", 41 f"/admin/users/{user_id}/role", 42 json={"role": role}, 43 ) 44 _raise_for_status(resp) 45 return AdminUserInfo.model_validate(resp.json())
Promote / demote between "user" and "admin".
Requires super-admin. super_admin role is env-anchored and
cannot be changed via API; trying returns 403.