Virtuelle Lostrommel für Messeauftritte der Firma B1 Systems
Webanwendung um die physische Lostrommel auf Messeständen zu ersetzen. Teilnehmende können sich über einen Link/QR-Code registrieren, Teilnahmebedingungen einsehen und zustimmen, und sich optional am Newsletter anmelden. Die Registrierung wird über eine E-Mail mit Linkklick bestätigt. Danach erhalten die Teilnehmenden einen Gewinncode, mit dem sie der Losziehung beiwohnen können.
Die Präsentation der Gewinnlose erfolgt dann auch durch die virtuelle Lostrommel.
Es können beliebig viele Gewinnspiele parallel angelegt werden und laufen.
Vorteile im Vergleich zur physischen Lostrommel ist ein höherer Zufallsfaktor, weniger Vorbereitung nötig für Standleute, und eine höhere Wahrscheinlichkeit, dass wir funktionierende Mailaddressen kriegen.
- Gewinnspiel unter
/admin/dashboardanlegen (mit Name, Start, Ende, Messe und case-sensitiven Kürzel) - QR-Code fürs Teilnehmen findet sich dann auch im Dashboard
- Direktlink zur Gewinnspielteilnahme:
/register/[Gewinnspielkürzel] - Link zur Gewinnspiel-Landingpage:
/[Gewinnspielkürzel] - Gewinnspiel nach Zeit beenden oder im Dashboard, dann in Gewinnspielübersicht Präsentation der Ergebnisse starten
Benötigt u.a. folgende Pakete:
- sqlite3
- Python
- fastapi[all]
- sqlalchemy
In pyproject.toml sind alle benötigten Module hinterlegt
.envaus.env.distkopieren und befüllenexport TAG=[...]mit dem gewünschten Tag (feste Version,latest, oder Tag von Feature-Branch)podman compose up
Wenn "403 Unauthorized": podman login registry.intern.b1-systems.de
- Installation von uv
pip install uv
- Installation der benötigten Pakete
uv sync
.envaus.env.distkopieren und befüllen- je nachdem ob Dev-Setup oder Nutzung existierender Mailserver:
mailpitstarten:- mailpit-Docker-Setup, dann ist standardmäßig
1025der SMTP-Port undlocalhostoder0.0.0.0die Mailserveradresse fürs.env-File
- mailpit-Docker-Setup, dann ist standardmäßig
- Lostrommel-Server starten
uv run uvicorn app.main:app --reload--host 0.0.0.0anhängen, um mit Geräten im selben Netzwerk auf Seite zugreifen zu können (brauchthttp://[lokale IP]:8000alsHOSTin.env)
Sämtliche Strings, bei denen man sich zwischen formeller und informeller Anrede entscheiden müsste, werden in beiden
Varianten bereitgestellt. Dafür nutzen wir pybabel und gettext, mit dem Shorthand _("...") für übersetzbare Strings.
Die Entscheidung zwischen formaler und informeller Ansprache findet auf Gewinnpsielebene statt. Dafür wird das Toggle
"Siezen" in der Gewinnspielerstellung benutzt.
Nach Änderungen, folgende Schritte ausführen, damit die Übersetzungsdateien in translations/ geupdated werden und man
dann die Sie-Version ergänzen kann:
pybabel extract -F babel.cfg -o translations/messages.pot .
pybabel update -i translations/messages.pot -d translations/
# ggf. neue Übersetzungen hinzufügen / Anpassungen machen
pybabel compile -d translations # nur nötig für lokales Ausführen, der Schritt wird auch im Containerbau ausgeführtIm Verzeichnis tests/ finden sich Ende-zu-Ende-Tests für die virtuelle Lostrommel.
Diese werden bei Commits und Merge Requests in das GitLab-Repo automatisiert ausgeführt.
Um sie während der Entwicklung auch lokal auszuführen:
- in
.envden IMAP-Port des MailserversMAIL_IMAP_PORTeintragen (fürmailpitstandardmäßig Port 8025) - die Test-Requirements mit
uv sync --only-group testinstallieren uv run pytest "." --order-dependencies
Die Tests sind nicht komplett unabhängig voneinander, um vielfaches Erstellen von neuen Gewinnspielen und Anlegen neuer
Teilnehmender zu verhindern. Daher werden pytest-order und pytest-dependency verwendet, um die Tests in verschiedene
Stufen zu sortieren und Abhängigkeiten wie Gewinnspielerstellung > Gewinnspielregistrierung abzubilden.
Idee und erster Prototyp von Corbinian Koch im Rahmen seines Abschlussprojekts