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.
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).