Files
devplacepy/devplacepy/routers/bugs.py
T
retoor c3a8347cc0
DevPlace CI / test (push) Successful in 6m46s
iUpdate
2026-05-30 20:16:39 +02:00

79 lines
2.6 KiB
Python

import logging
from typing import Annotated
from datetime import datetime, timezone
from fastapi import APIRouter, Request, Form
from fastapi.responses import HTMLResponse, RedirectResponse
from devplacepy.models import BugForm
from devplacepy.database import get_table, load_comments
from devplacepy.attachments import get_attachments_batch, link_attachments
from devplacepy.templating import templates
from devplacepy.utils import generate_uid, require_user, time_ago, get_current_user, create_mention_notifications
from devplacepy.seo import base_seo_context
logger = logging.getLogger(__name__)
router = APIRouter()
@router.get("", response_class=HTMLResponse)
async def bugs_page(request: Request):
user = get_current_user(request)
bugs_table = get_table("bug_reports")
all_bugs = list(bugs_table.find(order_by=["-created_at"]))
from devplacepy.database import get_users_by_uids
uids = [b["user_uid"] for b in all_bugs]
users_map = get_users_by_uids(uids)
bug_list = []
bug_uids = [b["uid"] for b in all_bugs]
attachments_map = get_attachments_batch("bug", bug_uids) if bug_uids else {}
for b in all_bugs:
bug_list.append({
"bug": b,
"author": users_map.get(b["user_uid"]),
"time_ago": time_ago(b["created_at"]),
"comments": load_comments("bug", b["uid"], user),
"attachments": attachments_map.get(b["uid"], []),
})
seo_ctx = base_seo_context(
request,
title="Bug Reports",
description="Report bugs and issues on DevPlace.",
breadcrumbs=[
{"name": "Home", "url": "/feed"},
{"name": "Bug Reports", "url": "/bugs"},
],
)
return templates.TemplateResponse(request, "bugs.html", {
**seo_ctx,
"request": request,
"user": user,
"bugs": bug_list,
})
@router.post("/create")
async def create_bug(request: Request, data: Annotated[BugForm, Form()]):
user = require_user(request)
title = data.title.strip()
description = data.description.strip()
bugs_table = get_table("bug_reports")
bug_uid = generate_uid()
bugs_table.insert({
"uid": bug_uid,
"user_uid": user["uid"],
"title": title,
"description": description,
"status": "open",
"created_at": datetime.now(timezone.utc).isoformat(),
})
if data.attachment_uids:
link_attachments(data.attachment_uids, "bug", bug_uid)
create_mention_notifications(description, user["uid"], f"/bugs?highlight={bug_uid}")
logger.info(f"Bug report created by {user['username']}: {title}")
return RedirectResponse(url="/bugs", status_code=302)