Admin: eigenen Einladungslink festlegen

Statt des zufälligen Links kann der Admin einen sprechenden Link wählen
(z. B. /z/sommerfest2026, mind. 6 Zeichen: A–Z, a–z, 0–9, - und _).
Alte Zugänge werden dabei ungültig; der QR-Code passt sich an.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-17 20:53:37 +01:00
co-authored by Claude Opus 5.5
parent fc15f2b933
commit 35985fe66d
4 changed files with 59 additions and 5 deletions
+19 -3
View File
@@ -354,15 +354,19 @@ def neu_mischen(db: sqlite3.Connection = Depends(get_db)) -> dict:
# --- Gastzugang (Einladungslink / QR-Code) ---------------------------------------
def _link_basis(request: Request) -> str:
return (konfig().public_url or str(request.base_url).rstrip("/")) + "/z/"
def _einladungslink(request: Request, token: str) -> str:
basis = konfig().public_url or str(request.base_url).rstrip("/")
return f"{basis}/z/{token}"
return _link_basis(request) + token
@api.get("/access")
def zugang(request: Request, db: sqlite3.Connection = Depends(get_db)) -> dict:
e = einstellungen(db)
return {"enabled": e["access_enabled"], "link": _einladungslink(request, e["access_token"])}
return {"enabled": e["access_enabled"], "link": _einladungslink(request, e["access_token"]),
"base": _link_basis(request), "token": e["access_token"]}
class ZugangSchalter(BaseModel):
@@ -382,6 +386,18 @@ def zugang_erneuern(db: sqlite3.Connection = Depends(get_db)) -> dict:
return {"ok": True}
class EigenerLink(BaseModel):
# sprechend, aber nicht zu kurz (Raten wird zusätzlich durch die Einladungs-Drossel gebremst)
token: str = Field(pattern=r"^[A-Za-z0-9_-]{6,64}$")
@api.post("/access/token")
def zugang_eigener_link(z: EigenerLink, db: sqlite3.Connection = Depends(get_db)) -> dict:
"""Eigenen Link festlegen (z. B. /z/sommerfest2026) – alte Zugänge werden ungültig."""
einstellung_setzen(db, "access_token", z.token)
return {"ok": True}
@api.get("/access/qr")
def zugang_qr(request: Request, format: Literal["svg", "png"] = "svg",
db: sqlite3.Connection = Depends(get_db)) -> Response: