|
# 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})
|