Molodetz blogrol volgens DPP-template
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
from fastapi import APIRouter, Request
|
||||
from fastapi.responses import RedirectResponse
|
||||
|
||||
from molodetz.constants import TOPICS
|
||||
from molodetz.database import get_post_by_slug, get_user
|
||||
from molodetz.rendering import content_preview, plain_title
|
||||
from molodetz.responses import respond
|
||||
from molodetz.schemas.posts import PostDetailOut
|
||||
from molodetz.seo import article_schema, base_seo_context
|
||||
from molodetz.utils.auth import get_current_user, is_admin, not_found
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/{slug}")
|
||||
async def post_detail(request: Request, slug: str):
|
||||
post = get_post_by_slug(slug)
|
||||
viewer = get_current_user(request)
|
||||
if post is None or (post["status"] != "published" and not is_admin(viewer)):
|
||||
not_found("Bericht niet gevonden")
|
||||
if slug != post["slug"]:
|
||||
return RedirectResponse(f"/posts/{post['slug']}", status_code=301)
|
||||
author = get_user(post["user_uid"])
|
||||
topic_title = TOPICS.get(post["topic"], post["topic"])
|
||||
seo = base_seo_context(
|
||||
request,
|
||||
plain_title(post["title"]),
|
||||
content_preview(post["body"], 160),
|
||||
robots="index,follow" if post["status"] == "published" else "noindex,nofollow",
|
||||
og_type="article",
|
||||
breadcrumbs=[("Molodetz", "/"), (topic_title, f"/{post['topic']}"), (post["title"], f"/posts/{post['slug']}")],
|
||||
schemas=[article_schema(request, post, author)],
|
||||
)
|
||||
ctx = {"post": post, "author": author, "topic_title": topic_title, "seo": seo}
|
||||
return respond(request, "post.html", ctx, model=PostDetailOut)
|
||||
Reference in New Issue
Block a user