Wichtel-Werkstatt: Secret-Santa-App mit Räumen, Ausschlüssen und Recovery-Links

- FastAPI + SQLite, serverseitig gerenderte Templates, mobil-zuerst
- Admin-Passwort, einseitige Ausschlüsse, eingefrorene Auslosung
- Teilnehmer sehen Ergebnis per Cookie; Einmal-Recovery-Links bei Verlust
- Docker/podman-tauglich (Entrypoint mit Privilegien-Drop, SELinux-:z)
- Unit-Tests für Auslosung, E2E-Testskript (30 Checks)
This commit is contained in:
2026-08-05 16:07:21 +02:00
commit d56be7b2c0
21 changed files with 1839 additions and 0 deletions
+42
View File
@@ -0,0 +1,42 @@
{% extends "base.html" %}
{% block title %}Wichtel-Werkstatt Raum erstellen oder beitreten{% endblock %}
{% block content %}
<section class="hero">
<h1>Wichtel-Werkstatt</h1>
<p>Wichteln ohne Zettel-Chaos: Raum erstellen, Mitmenschen einladen,
Ausschlüsse festlegen und fair auslosen. 🎁</p>
</section>
{% if error %}<div class="alert alert-error" role="alert">{{ error }}</div>{% endif %}
<section class="card">
<h2>Raum erstellen</h2>
<form method="post" action="/rooms" class="stack">
<label>
Name des Raums
<input type="text" name="room_name" maxlength="60" required
placeholder="z. B. Familie Müller 2026">
</label>
<label>
Admin-Passwort <small>(mind. 4 Zeichen)</small>
<input type="password" name="password" minlength="4" required
autocomplete="new-password" placeholder="Für die Raumverwaltung">
</label>
<button type="submit" class="btn btn-primary">Raum erstellen 🎄</button>
</form>
</section>
<div class="divider" aria-hidden="true">❄ oder ❄</div>
<section class="card">
<h2>Mit Code beitreten</h2>
<form method="post" action="/join" class="stack">
<label>
Raumcode
<input type="text" name="code" maxlength="6" required
autocapitalize="characters" spellcheck="false" placeholder="z. B. ABC123">
</label>
<button type="submit" class="btn btn-secondary">Zum Raum 🔔</button>
</form>
</section>
{% endblock %}