"""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