|
import logging
|
|
from datetime import datetime, timezone
|
|
from fastapi import APIRouter, Request
|
|
from fastapi.responses import HTMLResponse, RedirectResponse
|
|
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"]),
|
|
"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):
|
|
user = require_user(request)
|
|
form = await request.form()
|
|
title = form.get("title", "").strip()
|
|
description = form.get("description", "").strip()
|
|
|
|
if not title or not description:
|
|
return RedirectResponse(url="/bugs", status_code=302)
|
|
|
|
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(),
|
|
})
|
|
|
|
attachment_uids = form.getlist("attachment_uids") if hasattr(form, "getlist") else []
|
|
if attachment_uids:
|
|
link_attachments(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)
|