Initial commit: Konzept v2 + Etappe 1 (Blueprints + Login + Profile)

Schwester-Projekt zu arduino.lehrstun.de fuer die 3D-Druck-AG am
Lessing-Gymnasium. Offene jahrelange Nachmittags-AG (kein Trimester),
8-10 Einzel-SuS mit optionalen 2er-Paarungen, 4 Bambu-Lab-Drucker
(3 geschlossen + 1 A1 mini).

Konzept v2 (Reality-Check-Iteration 2026-05-24):
- Onboarding-Pfad statt Pflicht-Lektionen (L1-L3 selbst-zertifiziert)
- Selbstlern-Loop als Kern: SuS-Projekte wachsen die interne Bibliothek
- Drill-Down-Lehrer-Dashboard (Wer ist hier / Wartet Review / Haengt fest)
- Cockpit progressiv: zeigt nur was zum Status passt
- Bambu-Cloud-API fuer Drucker-Live-Status (fragil + Fallback manuell)
- Three.js-Vorschau fuer Cover-aus-3D-Ansicht (Etappe 6)
- Vollstaendige Doku als Obsidian-Vault (24 Markdown-Dateien)
- Entscheidungen E-001 bis E-022 in docs/decisions.md

Etappe 1 lauffaehig (~1800 Zeilen Code):
- Blueprint-Struktur (V8): routes/oeffentlich+profil+admin+api,
  services/auth+bambu+datei
- Komplettes Schema in database.py (14 Tabellen, idempotent)
- Login mit bcrypt + persistentem Lockout in DB (V7, verbessert ggue
  Arduino-Kurs der In-Memory-Dict nutzt)
- Admin-Login + Profile-CRUD + PIN-Reset + PIN-Karten-Druckbogen
- Inline-Edit-Endpunkt mit Whitelist + Audit-Log
- Seeds: AG lessing-3d-ag + 4 Drucker + Default-Einstellungen
- Smoke-Test bestanden (Login, Profil-Anlage, Lockout-Logging)

Nicht im Repo (.gitignore): .env, *.db, venv/, .obsidian/workspace.json
This commit is contained in:
2026-05-24 18:56:59 +02:00
commit 4658d4931a
59 changed files with 4653 additions and 0 deletions

100
docs/slotsystem.md Normal file
View File

@@ -0,0 +1,100 @@
---
type: konzept-modul
projekt: 3d.lehrstun.de
stand: 2026-05-23
tags: [konzept, slots, reservierung]
---
# Slot-System (Drucker-Reservierung)
> DB-Tabelle: [[datenmodell#slot]]. Routes: [[routen]]. Drucker-Status: [[druckerapi]].
## Ziel
Faire Verteilung der 4 Drucker auf 8-10 SuS, die unterschiedlich lange Drucke
fahren. Funktioniert auch bei Drucker-Ausfall ([[druckerapi]] kann brechen).
## Default: Windhund-Prinzip
- Wer zuerst kommt, bekommt den Slot.
- Jede:r SuS reserviert selbst über das Cockpit.
- Konflikt-Check: keine Überlappung mit aktiver/zukünftiger reservierter Reservierung
auf demselben Drucker.
## Override: Lehrer-Priorität
- Im [[routen#admin|Admin-Dashboard]] kann Herb/Markus pro Slot `prioritaet`
setzen (Default 0, höher = wichtiger).
- Sortierung im UI: `ORDER BY prioritaet DESC, erstellt_am ASC`.
- Bei Konflikt durch Priorisierung: Site zeigt eine Warnung, verschiebt
nichts automatisch — Herb entscheidet.
## Slot-Granularität (Entscheidung **offen**)
Drei Optionen, siehe [[offene-fragen#slot-granularität]]:
| Option | Vorteil | Nachteil |
|---|---|---|
| **Freie Zeitspannen** (Start + Dauer) | flexibel, passt zu realer Druckzeit (15 Min - 8 h) | Konflikt-Check komplexer |
| **Feste Stunden-Slots** | einfach zu buchen, kalenderartig | unflexibel — 4-h-Druck blockiert 4 Slots |
| **Tages-Slots** (Vormittag/Nachmittag/Nacht) | passt zu langen Drucken | zu grob für kurze Drucke |
Empfehlung aus Recherche: **freie Zeitspannen**, weil Druckzeit stark variiert.
## Drucker-Ausfall-Handling
Wenn [[druckerapi]] meldet `status = failed` oder `offline` für > 10 Min:
```mermaid
flowchart TB
A[Drucker fällt aus] --> B{Aktive Slots betroffen?}
B -- ja --> C[Dashboard: rote Markierung]
C --> D[Vorschlag: Slot auf anderen Drucker verschieben]
D --> E[Admin: 1-Klick-Verschieben]
E --> F[Slot.drucker_id ändern]
F --> G[Cockpit-Notiz für betroffene SuS]
B -- nein --> H[Drucker als 'Wartung nötig' markieren]
```
## Konflikt-Erkennung
```sql
-- Neue Reservierung würde mit bestehender überlappen?
SELECT COUNT(*) FROM slot
WHERE drucker_id = :drucker_id
AND status IN ('reserviert', 'aktiv')
AND start_zeit < :neue_ende
AND ende_zeit > :neue_start;
```
Falls > 0 Treffer: Reservierung abgelehnt mit Liste der Konflikte.
## UI-Skizze (Cockpit-Slot-Buchung)
```
┌─ Drucker reservieren ──────────────────────────┐
│ │
│ Drucker: [ ▼ P1S #1 ] │
│ Start: [ Heute, 14:30 ] │
│ Dauer: [ 2 h 30 m ] (Schätzung aus 3MF) │
│ │
│ ┌─ Kalender ────────────────────────────────┐ │
│ │ P1S #1 ▓▓░░░░░░░░░░░░▓▓▓▓▓░░░░░░░░░░░ │ │
│ │ P1S #2 ░░░░░▓▓▓▓░░░░░░░░░░░░░░░▓▓▓░░░ │ │
│ │ X1C ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │ │
│ │ A1 mini ▓▓▓▓▓▓▓░░░░░░░░░░░▓▓░░░░░░░░░░ │ │
│ │ 09 11 13 15 17 19 21 23 │ │
│ └────────────────────────────────────────────┘ │
│ │
│ [ Reservieren ] │
└─────────────────────────────────────────────────┘
```
(Genaues Design folgt in [[etappen#etappe-6]].)
## Querverweise
- DB-Schema: [[datenmodell#slot]]
- Drucker-Live-Status (für Ausfall-Erkennung): [[druckerapi]]
- Routes: [[routen#profil]] + [[routen#admin]]
- Offene Frage zur Granularität: [[offene-fragen]]