# retoor <retoor@molodetz.nl>
import logging
from typing import Annotated
from fastapi import APIRouter, Form, Request
from devplacepy.models import BugStatusForm
from devplacepy.responses import action_result, json_error
from devplacepy.services.audit import record as audit
from devplacepy.services.gitea import runtime
from devplacepy.services.gitea.client import GiteaError
from devplacepy.services.gitea.config import gitea_config
from devplacepy.utils import is_admin, require_user
logger = logging.getLogger(__name__)
router = APIRouter()
@router.post("/{number}/status")
async def status_bug(
request: Request, number: int, data: Annotated[BugStatusForm, Form()]
):
user = require_user(request)
if not is_admin(user):
audit.record(
request,
"bug.status",
user=user,
result="denied",
target_type="bug",
target_uid=str(number),
summary=f"{user['username']} denied changing status of bug #{number}",
)
return json_error(403, "Admins only")
if not gitea_config().is_configured:
return json_error(503, "The bug tracker is not configured")
try:
await runtime.get_client().set_state(number, data.status)
except GiteaError as exc:
logger.warning("Could not change status of #%s: %s", number, exc)
audit.record(
request,
"bug.status",
user=user,
result="failure",
target_type="bug",
target_uid=str(number),
summary=f"Failed to change status of bug #{number}: {exc}",
)
return json_error(exc.status or 502, "Could not change the status")
audit.record(
request,
"bug.status",
user=user,
target_type="bug",
target_uid=str(number),
new_value=data.status,
summary=f"{user['username']} set bug #{number} to {data.status}",
metadata={"number": number, "state": data.status},
links=[audit.target("bug", str(number))],
)
logger.info("Bug #%s set to %s by %s", number, data.status, user["username"])
return action_result(request, f"/bugs/{number}", data={"state": data.status})