Molodetz blogrol volgens DPP-template
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
from fastapi import APIRouter, HTTPException, Request
|
||||
|
||||
from molodetz.constants import TOPICS
|
||||
from molodetz.content import create_post, delete_post, edit_post
|
||||
from molodetz.database import all_posts, get_post
|
||||
from molodetz.dependencies import json_or_form
|
||||
from molodetz.models import PostForm
|
||||
from molodetz.responses import action_result, respond
|
||||
from molodetz.routers.admin._shared import admin_seo
|
||||
from molodetz.schemas.admin import AdminPostsOut
|
||||
from molodetz.schemas.posts import PostDetailOut
|
||||
from molodetz.utils.audit import record
|
||||
from molodetz.utils.auth import is_admin, is_owner, not_found, require_admin
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/posts")
|
||||
async def posts_index(request: Request):
|
||||
require_admin(request)
|
||||
return respond(request, "admin/posts.html", {"posts": all_posts(), "seo": admin_seo(request, "Berichten")}, model=AdminPostsOut)
|
||||
|
||||
|
||||
@router.get("/posts/new")
|
||||
async def posts_new(request: Request):
|
||||
require_admin(request)
|
||||
ctx = {"post": None, "topics": TOPICS, "errors": [], "seo": admin_seo(request, "Nieuw bericht")}
|
||||
return respond(request, "admin/post_form.html", ctx, model=PostDetailOut)
|
||||
|
||||
|
||||
@router.post("/posts")
|
||||
async def posts_create(request: Request):
|
||||
user = require_admin(request)
|
||||
data = await json_or_form(request, PostForm)
|
||||
row = create_post(user, data.title, data.body, data.topic, data.status, data.is_placeholder, request=request)
|
||||
return action_result(request, "/admin/posts", data={"uid": row["uid"], "slug": row["slug"]})
|
||||
|
||||
|
||||
@router.get("/posts/{uid}/edit")
|
||||
async def posts_edit(request: Request, uid: str):
|
||||
require_admin(request)
|
||||
post = get_post(uid)
|
||||
if post is None:
|
||||
not_found("Bericht niet gevonden")
|
||||
ctx = {"post": post, "topics": TOPICS, "errors": [], "seo": admin_seo(request, "Bericht bewerken")}
|
||||
return respond(request, "admin/post_form.html", ctx, model=PostDetailOut)
|
||||
|
||||
|
||||
def _owned_post(request, user, uid):
|
||||
post = get_post(uid)
|
||||
if post is None:
|
||||
not_found("Bericht niet gevonden")
|
||||
if not is_owner(post, user):
|
||||
record(request, "post.edit.denied", result="denied", targets=[("post", uid)], user=user)
|
||||
raise HTTPException(403, "Alleen de auteur mag dit bericht bewerken")
|
||||
return post
|
||||
|
||||
|
||||
@router.post("/posts/{uid}")
|
||||
async def posts_update(request: Request, uid: str):
|
||||
user = require_admin(request)
|
||||
post = _owned_post(request, user, uid)
|
||||
data = await json_or_form(request, PostForm)
|
||||
edit_post(post, user, data.title, data.body, data.topic, data.status, data.is_placeholder, request=request)
|
||||
return action_result(request, "/admin/posts", data={"uid": uid})
|
||||
|
||||
|
||||
@router.post("/posts/{uid}/publish")
|
||||
async def posts_publish(request: Request, uid: str):
|
||||
user = require_admin(request)
|
||||
post = _owned_post(request, user, uid)
|
||||
status = "draft" if post["status"] == "published" else "published"
|
||||
edit_post(post, user, post["title"], post["body"], post["topic"], status, post.get("is_placeholder"), request=request)
|
||||
return action_result(request, "/admin/posts", data={"uid": uid, "status": status})
|
||||
|
||||
|
||||
@router.post("/posts/{uid}/delete")
|
||||
async def posts_delete(request: Request, uid: str):
|
||||
user = require_admin(request)
|
||||
post = get_post(uid)
|
||||
if post is None:
|
||||
not_found("Bericht niet gevonden")
|
||||
if not (is_owner(post, user) or is_admin(user)):
|
||||
record(request, "post.delete.denied", result="denied", targets=[("post", uid)], user=user)
|
||||
raise HTTPException(403, "Niet toegestaan")
|
||||
stamp = delete_post(post, user, request=request)
|
||||
return action_result(request, "/admin/posts", data={"uid": uid, "stamp": stamp})
|
||||
Reference in New Issue
Block a user