48 lines
1.9 KiB
Python
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
|