# retoor <retoor@molodetz.nl>
from fastapi import Request
from devplacepy.responses import json_error, wants_json
from devplacepy.templating import templates
from devplacepy.seo import base_seo_context, site_url, website_schema
from devplacepy.services.gitea.client import STATE_ALL, STATE_CLOSED, STATE_OPEN
PER_PAGE = 20
VALID_STATES = (STATE_OPEN, STATE_CLOSED, STATE_ALL)
def state_or_default(raw: str) -> str:
return raw if raw in VALID_STATES else STATE_OPEN
def author_fields(author_uid: str | None, users_map: dict, fallback_login: str) -> dict:
user = users_map.get(author_uid) if author_uid else None
if user:
return {
"author_username": user["username"],
"author_uid": author_uid,
"author_avatar_seed": user["username"],
"is_local_author": True,
}
return {
"author_username": fallback_login or "developer",
"author_uid": None,
"author_avatar_seed": None,
"is_local_author": False,
}
def issue_item(issue: dict, author_uid: str | None, users_map: dict) -> dict:
login = (issue.get("user") or {}).get("login", "")
return {
"number": int(issue.get("number", 0)),
"title": issue.get("title", ""),
"state": issue.get("state", "open"),
"html_url": issue.get("html_url"),
"comments_count": int(issue.get("comments", 0)),
"created_at": issue.get("created_at"),
"updated_at": issue.get("updated_at"),
**author_fields(author_uid, users_map, login),
}
def comment_item(comment: dict, author_uid: str | None, users_map: dict) -> dict:
login = (comment.get("user") or {}).get("login", "")
return {
"id": int(comment.get("id", 0)),
"body": comment.get("body", ""),
"html_url": comment.get("html_url"),
"created_at": comment.get("created_at"),
**author_fields(author_uid, users_map, login),
}
def issue_seo(request: Request, **extra) -> dict:
base = site_url(request)
return base_seo_context(
request,
breadcrumbs=[
{"name": "Home", "url": "/feed"},
{"name": "Issue Reports", "url": "/issues"},
],
schemas=[website_schema(base)],
**extra,
)
def tracker_unavailable(request: Request):
if wants_json(request):
return json_error(503, "The issue tracker is temporarily unavailable")
seo_ctx = base_seo_context(
request,
title="Issue tracker unavailable - DevPlace",
description="The issue tracker is temporarily unavailable.",
robots="noindex",
)
return templates.TemplateResponse(
request,
"error.html",
{
**seo_ctx,
"request": request,
"error_code": 503,
"error_message": "The issue tracker is temporarily unavailable.",
},
status_code=503,
)