bifroest/app/help/routes.py
2026-10-27 08:34:17 +01:00

48 lines
1.9 KiB
Python

"""Online-Hilfe unter /hilfe (nur angemeldet)."""
from typing import Annotated
from fastapi import APIRouter, Query, Request
from fastapi.responses import HTMLResponse
from sqlalchemy import select
from app import web
from app.core.errors import NotFound
from app.help import service as help_pages
from app.identity.models import User
from app.workspaces.models import WorkspaceMembership
def router() -> APIRouter:
r = APIRouter()
def roles(request: Request, principal) -> set[str]:
"""Für welche Seiten die Person zuständig ist, um sie hervorzuheben."""
found = {"nutzer"}
with web.db(request).session() as session:
workspace_roles = set(session.scalars(select(WorkspaceMembership.role)
.where(WorkspaceMembership.user_id == principal.user_id)))
global_approver = session.scalar(select(User.is_global_approver).where(User.id == principal.user_id))
if "admin" in workspace_roles:
found |= {"workspace-admin", "freigeben"}
if "approver" in workspace_roles or global_approver:
found.add("freigeben")
if principal.is_admin:
found.add("plattform-admin")
return found
@r.get("/hilfe")
def index(request: Request, principal: web.User, q: Annotated[str, Query(max_length=200)] = "") -> HTMLResponse:
return web.render(request, "help.html", {
"pages": help_pages.PAGES, "mine": roles(request, principal), "q": q.strip(),
"hits": help_pages.search(q) if q.strip() else None, "page": None})
@r.get("/hilfe/{slug}")
def page(request: Request, principal: web.User, slug: str) -> HTMLResponse:
if slug not in help_pages.BY_SLUG:
raise NotFound
return web.render(request, "help.html", {
"pages": help_pages.PAGES, "mine": roles(request, principal), "q": "",
"page": help_pages.render(slug), "hits": None})
return r