ctfy.sdk.admin_resources.achievements

client.admin.achievements — manual badge grant / revoke (admin).

 1"""``client.admin.achievements`` — manual badge grant / revoke (admin)."""
 2
 3from __future__ import annotations
 4
 5from ctfy.sdk._helpers import _raise_for_status
 6from ctfy.sdk.base import BaseHttpClient
 7from ctfy.server.models import TeamAchievement
 8
 9
10class AdminAchievementsResource:
11    """Manually grant or revoke achievements on a team."""
12
13    def __init__(self, http: BaseHttpClient) -> None:
14        self._http = http
15
16    def grant(self, team_id: str, achievement_id: str) -> TeamAchievement:
17        """Manually grant an achievement to a team. Idempotent — a second
18        call for the same pair returns the existing record."""
19        resp = self._http.request(
20            "POST",
21            f"/admin/teams/{team_id}/achievements/{achievement_id}",
22        )
23        _raise_for_status(resp)
24        return TeamAchievement.model_validate(resp.json())
25
26    def revoke(self, team_id: str, achievement_id: str) -> None:
27        """Manually revoke an achievement. Idempotent (204 either way)."""
28        resp = self._http.request(
29            "DELETE",
30            f"/admin/teams/{team_id}/achievements/{achievement_id}",
31        )
32        _raise_for_status(resp)
class AdminAchievementsResource:
11class AdminAchievementsResource:
12    """Manually grant or revoke achievements on a team."""
13
14    def __init__(self, http: BaseHttpClient) -> None:
15        self._http = http
16
17    def grant(self, team_id: str, achievement_id: str) -> TeamAchievement:
18        """Manually grant an achievement to a team. Idempotent — a second
19        call for the same pair returns the existing record."""
20        resp = self._http.request(
21            "POST",
22            f"/admin/teams/{team_id}/achievements/{achievement_id}",
23        )
24        _raise_for_status(resp)
25        return TeamAchievement.model_validate(resp.json())
26
27    def revoke(self, team_id: str, achievement_id: str) -> None:
28        """Manually revoke an achievement. Idempotent (204 either way)."""
29        resp = self._http.request(
30            "DELETE",
31            f"/admin/teams/{team_id}/achievements/{achievement_id}",
32        )
33        _raise_for_status(resp)

Manually grant or revoke achievements on a team.

AdminAchievementsResource(http: ctfy.sdk.base.BaseHttpClient)
14    def __init__(self, http: BaseHttpClient) -> None:
15        self._http = http
def grant( self, team_id: str, achievement_id: str) -> ctfy.server.models.TeamAchievement:
17    def grant(self, team_id: str, achievement_id: str) -> TeamAchievement:
18        """Manually grant an achievement to a team. Idempotent — a second
19        call for the same pair returns the existing record."""
20        resp = self._http.request(
21            "POST",
22            f"/admin/teams/{team_id}/achievements/{achievement_id}",
23        )
24        _raise_for_status(resp)
25        return TeamAchievement.model_validate(resp.json())

Manually grant an achievement to a team. Idempotent — a second call for the same pair returns the existing record.

def revoke(self, team_id: str, achievement_id: str) -> None:
27    def revoke(self, team_id: str, achievement_id: str) -> None:
28        """Manually revoke an achievement. Idempotent (204 either way)."""
29        resp = self._http.request(
30            "DELETE",
31            f"/admin/teams/{team_id}/achievements/{achievement_id}",
32        )
33        _raise_for_status(resp)

Manually revoke an achievement. Idempotent (204 either way).