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.

AdminUsersResource(http: ctfy.sdk.base.BaseHttpClient)
16    def __init__(self, http: BaseHttpClient) -> None:
17        self._http = http
def list( self, offset: int = 0, limit: int = 50) -> list[ctfy.server.models.AdminUserInfo]:
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.

def get(self, user_id: str) -> ctfy.server.models.AdminUserInfo:
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.

def set_role(self, user_id: str, role: str) -> ctfy.server.models.AdminUserInfo:
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.