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:
100
docs/slotsystem.md
Normal file
100
docs/slotsystem.md
Normal 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]]
|
||||
Reference in New Issue
Block a user