|
# retoor <retoor@molodetz.nl>
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter, Request
|
|
from devplacepy.database import get_table
|
|
from devplacepy.database.awards import revoke_award
|
|
from devplacepy.responses import action_result, json_error, wants_json
|
|
from devplacepy.services.audit import record as audit
|
|
from devplacepy.utils import not_found, require_admin, safe_next
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
|
|
|
|
def _redirect_back(request: Request, award: dict) -> str:
|
|
referer = request.headers.get("referer", "")
|
|
if referer and safe_next(referer, "") == referer:
|
|
return referer
|
|
receiver = get_table("users").find_one(uid=award.get("receiver_uid", ""))
|
|
if receiver:
|
|
return f"/profile/{receiver['username']}?tab=awards"
|
|
return "/admin"
|
|
|
|
|
|
@router.post("/awards/{uid}/revoke")
|
|
async def admin_revoke_award(request: Request, uid: str):
|
|
admin = require_admin(request)
|
|
row = revoke_award(uid, admin["uid"])
|
|
if not row:
|
|
if wants_json(request):
|
|
return json_error(404, "Award not found")
|
|
raise not_found("Award not found")
|
|
receiver = get_table("users").find_one(uid=row.get("receiver_uid", ""))
|
|
logger.info("Admin %s revoked award %s", admin["username"], uid)
|
|
audit.record(
|
|
request,
|
|
"award.revoke",
|
|
user=admin,
|
|
target_type="award",
|
|
target_uid=uid,
|
|
target_label=row.get("slug", uid),
|
|
summary=f"admin {admin['username']} revoked award {row.get('slug', uid)}",
|
|
links=[
|
|
audit.target("award", uid, row.get("slug")),
|
|
audit.target("user", row.get("receiver_uid"), receiver.get("username") if receiver else None),
|
|
],
|
|
)
|
|
return action_result(request, _redirect_back(request, row)) |