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
148 lines
7.9 KiB
Markdown
148 lines
7.9 KiB
Markdown
---
|
|
type: konzept-modul
|
|
projekt: 3d.lehrstun.de
|
|
stand: 2026-05-24
|
|
tags: [konzept, admin, dashboard]
|
|
---
|
|
|
|
# Lehrer-Dashboard mit Drill-Down
|
|
|
|
> **V5 aus der Reality-Check-Analyse** ([[../decisions#E-020]]). Schließt eine
|
|
> bekannte Lücke des Arduino-Kurses, wo Herb manuell in jedes Gruppen-Cockpit
|
|
> schauen muss, um zu sehen, wer wo steht.
|
|
|
|
Route: `/admin/dashboard`. Berechtigung: `@admin_required`. Vom Cockpit nicht zu verwechseln — das ist der **Lehrer-Arbeitsplatz**.
|
|
|
|
## Layout-Skizze
|
|
|
|
```
|
|
┌─ Admin-Dashboard ──────────────────────────────────────────────┐
|
|
│ │
|
|
│ ┌─ Wer ist heute hier (basiert auf check_in von HEUTE) ───┐ │
|
|
│ │ 🦊 Mia "Schlüsselanhänger weitermachen" → [→] │ │
|
|
│ │ 🦦 Tom "neues Projekt: Wasserrakete" → [→] │ │
|
|
│ │ 🐧 Lara "L2 fertig machen" → [→] │ │
|
|
│ │ 3 SuS heute eingeloggt │ │
|
|
│ └──────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌─ Wartet auf Lehrer-Reaktion ─────────────────── [3] ─────┐ │
|
|
│ │ 🟡 Mia — "Schlüsselanhänger" zur Freigabe (2 Tage) │ │
|
|
│ │ 🟡 Tom — "Drohnenrahmen" zur Freigabe (heute) │ │
|
|
│ │ 🔵 Lara — Rückfrage offen seit 5 Tagen │ │
|
|
│ └──────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌─ Drucker-Status (live) ─────────────────────────────────┐ │
|
|
│ │ 🟢 P1S #1 drucken "Schlüsselanhänger Mia" 43% │ │
|
|
│ │ 🟢 P1S #2 idle │ │
|
|
│ │ 🟡 X1C drucken "Drohnenrahmen Tom" 89% │ │
|
|
│ │ 🔴 A1 mini offline (Status veraltet >5min) │ │
|
|
│ └──────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌─ Wer hängt fest (>2 Wochen kein Fortschritt) ───────────┐ │
|
|
│ │ 🐝 Anna — letzter Check-In vor 3 Wochen │ │
|
|
│ │ → [Erinnerungs-Notiz im Cockpit hinterlassen] │ │
|
|
│ └──────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Sektion 1: Wer ist heute hier
|
|
|
|
**Datenquelle:** `check_in` mit `besuch_datum = TODAY`.
|
|
|
|
**Inhalt pro Zeile:**
|
|
- Tier-Icon + Vorname (Klick → Profil-Detail)
|
|
- Modus aus Check-In (z.B. „weiter wie bisher", „neues Projekt", „onboarding", „helfen")
|
|
- Optionaler Freitext aus Check-In (falls vorhanden, in kursiv)
|
|
- Link zum aktuellen Projekt (falls vorhanden)
|
|
- Quick-Action: „Notiz hinterlassen" → schreibt Lehrer-Notiz ins SuS-Cockpit
|
|
|
|
**Zweck:** In den ersten 5 Minuten der AG-Stunde weiß der Lehrer ohne Rumfragen, was läuft.
|
|
|
|
## Sektion 2: Wartet auf Lehrer-Reaktion
|
|
|
|
**Datenquelle:** Zwei Untergruppen:
|
|
1. **Projekte mit `freigabe_status = 'wartet_auf_freigabe'`** — sortiert nach Wartezeit, älteste oben.
|
|
2. **Rückfragen** mit `status = 'offen'`, die schon länger als 3 Tage warten — der SuS hat möglicherweise vergessen, nachzubessern.
|
|
|
|
**Badge im Header:** Anzahl der zu reviewen Projekte. Sichtbar auch in der Navigation (klein, rote Zahl neben „Admin").
|
|
|
|
**Quick-Action:** Klick auf Eintrag → `/admin/projekt-freigabe/<id>` öffnet Detail-Review mit Three.js-Vorschau, allen Files, Edit-Möglichkeit, Freigeben-/Rückfrage-/Löschen-Buttons.
|
|
|
|
**Zweck:** Review-Last sichtbar machen, damit nichts liegen bleibt.
|
|
|
|
## Sektion 3: Drucker-Status (live)
|
|
|
|
**Datenquelle:** `drucker_status` (vom Bambu-Cloud-Polling befüllt — siehe [[druckerapi]]).
|
|
|
|
**Inhalt pro Drucker:**
|
|
- Status-Ampel (🟢 druckt/idle, 🟡 pausiert/Wartung, 🔴 offline/failed)
|
|
- Drucker-Name + Modell
|
|
- Aktueller Job-Name (wenn drucken)
|
|
- Fortschritt + Restzeit
|
|
- Quick-Action bei roter Ampel: „Manueller Status setzen" (Override)
|
|
|
|
**Zweck:** Der Lehrer sieht beim Reinkommen in den Druckraum sofort, welche Drucker frei sind, welche fertig zur Abholung sind, welche Probleme haben.
|
|
|
|
## Sektion 4: Wer hängt fest
|
|
|
|
**Datenquelle:** SuS, die in den letzten 2 Wochen weder einen `check_in` gemacht haben noch ein Projekt abgeschlossen haben.
|
|
|
|
**Zweck:** Stille Aussteiger erkennen. Wer 3 Wochen nicht da war, ist möglicherweise nicht mehr dabei — oder braucht eine kurze Nachricht.
|
|
|
|
**Quick-Action:** „Erinnerungs-Notiz im Cockpit hinterlassen" — beim nächsten Login sieht der SuS ein grünes Banner („Hey, lange nicht gesehen — alles okay?").
|
|
|
|
## Performance-Hinweise
|
|
|
|
Das Dashboard macht 4 Queries:
|
|
- `SELECT` aus `check_in WHERE besuch_datum = TODAY` + JOIN `profil` + LEFT JOIN aktives `projekt`
|
|
- `SELECT` aus `projekt WHERE freigabe_status IN ('wartet_auf_freigabe')` + JOIN `profil`
|
|
- `SELECT` aus `drucker_status` (4 Zeilen)
|
|
- Subquery für „hängt fest"-Liste
|
|
|
|
Alle Indexes setzen: `idx_projekt_freigabe`, FK-Index auf `check_in.besuch_datum`. Bei 8-10 SuS und ~50 Projekten/Jahr ist Performance kein Thema.
|
|
|
|
## Quick-Action-Mechanik: „Notiz im Cockpit hinterlassen"
|
|
|
|
Tabelle `lehrer_notiz` (neu):
|
|
|
|
```sql
|
|
CREATE TABLE lehrer_notiz (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
profil_id INTEGER NOT NULL, -- Adressat
|
|
von_profil_id INTEGER, -- Lehrer (NULL = System)
|
|
text TEXT NOT NULL,
|
|
erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
gelesen_am DATETIME, -- NULL = ungelesen
|
|
typ TEXT DEFAULT 'info', -- 'info'|'rueckfrage'|'erinnerung'
|
|
FOREIGN KEY (profil_id) REFERENCES profil(id) ON DELETE CASCADE
|
|
);
|
|
```
|
|
|
|
Wird im Cockpit als gelbes Banner gerendert (analog zur Rückfrage-Mechanik V6). SuS kann jede Notiz mit „verstanden" wegklicken → `gelesen_am` wird gesetzt.
|
|
|
|
## Was das Dashboard NICHT zeigt
|
|
|
|
- Keine Aggregate über die ganze AG-Historie (das wäre Statistik, gehört in `/admin/statistik` als optionaler späterer Bereich).
|
|
- Keine Daten anderer Lehrkräfte (es gibt nur Herb + Markus, gleiche Sicht).
|
|
- Kein Eingriff in laufende Druckjobs — das macht weiterhin die Bambu Handy App.
|
|
|
|
## Inline-Edit-Berechtigungen für Lehrer
|
|
|
|
Aus [[routen#inline-edit-whitelist]]:
|
|
- Lektionen: titel, aufgabe_md, tipp_md, extern_link — **immer**.
|
|
- Software-Seiten: titel, inhalt_md, url, quickstart_md — **immer**.
|
|
- Projekte: titel, beschreibung_md, tags — **nur während Review** (Status `wartet_auf_freigabe` oder `rueckfrage`).
|
|
- Einstellungen: wert — **immer**.
|
|
|
|
Jede Inline-Edit-Aktion landet in `aenderung_log` mit Lehrer-Profil-ID. So bleibt nachvollziehbar, wer was wann geändert hat.
|
|
|
|
## Querverweise
|
|
|
|
- Routen: [[routen#admin-routesadminpy--herb--markus]]
|
|
- Selbstlern-Loop (das Dashboard zeigt dessen Status): [[selbstlern-loop]]
|
|
- Drucker-Anbindung: [[druckerapi]]
|
|
- Datenmodell: [[datenmodell]]
|
|
- Entscheidung V5: [[../decisions#E-020]]
|
|
- Rückfrage-Mechanik V6: [[../decisions#E-020]]
|