Source code for tahrir.endpoints.admin.assertions
from datetime import datetime
from flask import abort, current_app, g, jsonify, request
from ...app import csrf, oidc
from ...utils.user import need_access_root, need_access_user
from . import blueprint as bp
[docs]
@bp.route("/api/admin/assertions", methods=["POST"])
@csrf.exempt
@oidc.accept_token()
@need_access_user
@need_access_root
def create_assertion():
"""Endpoint to create a new assertion (award badge)."""
data = request.get_json()
if not data:
return abort(400, "No details provided")
required_fields = ["badge_id", "username"]
for field in required_fields:
if not data.get(field):
return abort(400, f"No detail provided for {field!r}")
badge_id = data.get("badge_id")
username = data.get("username")
person_email = f"{username}@{current_app.config['TAHRIR_EMAIL_DOMAIN']}"
issued_on = data.get("issued_on")
if issued_on is not None:
try:
issued_on = datetime.fromtimestamp(issued_on)
except (ValueError, TypeError, OSError):
return abort(400, "Invalid issued_on timestamp")
# Check if assertion already exists
if g.tahrirdb.assertion_exists(badge_id, person_email):
return abort(409, f"User {person_email!r} already has badge {badge_id!r}")
result = g.tahrirdb.add_assertion(
badge_id=badge_id,
person_email=person_email,
issued_on=issued_on,
issued_for=data.get("issued_for"),
)
if not result:
return abort(400, "Failed to create assertion")
return jsonify({"message": f"Badge {badge_id!r} awarded to {person_email!r}"}), 201
[docs]
@bp.route("/api/admin/assertions", methods=["DELETE"])
@csrf.exempt
@oidc.accept_token()
@need_access_user
@need_access_root
def remove_assertion():
"""Endpoint to remove an assertion (retract awarded badge)."""
data = request.get_json()
if not data:
return abort(400, "No details provided")
required_fields = ["badge_id", "username"]
for field in required_fields:
if not data.get(field):
return abort(400, f"No detail provided for {field!r}")
badge_id = data.get("badge_id")
username = data.get("username")
person_email = f"{username}@{current_app.config['TAHRIR_EMAIL_DOMAIN']}"
result = g.tahrirdb.remove_assertion(
badge_id=badge_id,
person_email=person_email,
)
if not result:
return abort(404, f"Badge {badge_id!r} or User {person_email!r} or Assertion not found")
return jsonify({"message": f"Badge {badge_id!r} retracted from {person_email!r}"})