HEX
Server: LiteSpeed
System: Linux houston.panomity.com 6.8.0-100-generic #100-Ubuntu SMP PREEMPT_DYNAMIC Tue Jan 13 16:40:06 UTC 2026 x86_64
User: nudepix (1011)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //opt/kw-schueler.bak.21032025/README_DB_SETUP.md
# MySQL-Datenbank für Lehrerkonten

Diese README-Datei beschreibt die Einrichtung und Konfiguration der MySQL-Datenbank für das Klausurenweb-Projekt.

## Inhalt
1. [Voraussetzungen](#voraussetzungen)
2. [Installation und Einrichtung](#installation-und-einrichtung)
3. [Konfiguration](#konfiguration)
4. [Datenbankstruktur](#datenbankstruktur)
5. [Lehrerkonten-Verwaltung](#lehrerkonten-verwaltung)
6. [Fächer und Aufgabentypen](#fächer-und-aufgabentypen)
7. [Materialien-Verwaltung](#materialien-verwaltung)
8. [Passwort-Reset-Funktionalität](#passwort-reset-funktionalität)
9. [Sicherheitshinweise](#sicherheitshinweise)

## Voraussetzungen

- MySQL Server (5.7 oder höher)
- Python 3.8 oder höher
- Folgende Python-Bibliotheken:
  - `mysql-connector-python`
  - `streamlit` (für die Webanwendung)
  - `bcrypt` (für Passworthashing)

## Installation und Einrichtung

1. MySQL Server installieren (falls noch nicht vorhanden):
   ```bash
   sudo apt-get update
   sudo apt-get install mysql-server
   ```

2. Abhängigkeiten installieren:
   ```bash
   pip install mysql-connector-python bcrypt streamlit
   ```

3. MySQL-Datenbank erstellen:
   ```bash
   mysql -u root -p < mysql_setup.sql
   ```

4. Initialisieren der Lehrerkonten:
   ```bash
   python update_teacher_passwords.py \
       --host=localhost \
       --user=klausurenweb_db \
       --password=DEIN_PASSWORT \
       --database=klausurenweb_db \
       --csv-file=teachers_import.csv
   ```

5. Migration der vorhandenen Fächer und Aufgabentypen:
   ```bash
   python migrate_subjects_types.py \
       --host=localhost \
       --user=klausurenweb_db \
       --password=DEIN_PASSWORT \
       --database=klausurenweb_db \
       --json-file=fach_aufgaben.json \
       --admin-teacher-id=1
   ```

6. Migration der Materialien aus dem Dateisystem:
   ```bash
   python migrate_materials.py \
       --host=localhost \
       --user=klausurenweb_db \
       --password=DEIN_PASSWORT \
       --database=klausurenweb_db \
       --setup-tables \
       --materials-dir=schule-materialien
   ```

## Konfiguration

Erstelle eine `.streamlit/secrets.toml`-Datei im Anwendungsverzeichnis:

```toml
[mysql]
host = "localhost"
user = "klausurenweb_db"
password = "DEIN_PASSWORT"
database = "klausurenweb_db"

[email]
smtp_server = "smtp.example.com"
smtp_port = 587
username = "dein_username"
password = "dein_passwort"
sender = "no-reply@example.com"

# Basis-URL für Passwort-Reset-Links
base_url = "https://klausurenweb.de"
```

## Datenbankstruktur

Die Datenbank enthält folgende Tabellen:

- **teachers**: Enthält die Lehrerkonten.
- **password_reset_tokens**: Speichert temporäre Token für das Zurücksetzen von Passwörtern.
- **subjects**: Enthält alle verfügbaren Fächer.
- **assignment_types**: Enthält alle verfügbaren Aufgabentypen.
- **teacher_subjects**: Verknüpft Lehrer mit ihren unterrichteten Fächern.
- **teacher_subject_assignment_types**: Verknüpft Lehrer, Fächer und Aufgabentypen.
- **materials**: Enthält die Basisdaten der Lehrmaterialien.
- **material_contents**: Speichert die Inhalte der Lehrmaterialien (Aufgaben, Prompts, Kriterien, Originaltexte).

## Lehrerkonten-Verwaltung

Lehrerkonten können über die Admin-Oberfläche oder die CSV-Import-Funktionalität verwaltet werden.

### CSV-Format für den Import von Lehrerkonten:

```
username,email,password,school_code,teacher_code
lehrer1,lehrer1@schule.de,passwort1,mos,leh
lehrer2,lehrer2@schule.de,passwort2,gbd,l2
```

## Fächer und Aufgabentypen

Jeder Lehrer kann für sich eigene Fächer und Aufgabentypen definieren.

### Fächer verwalten

1. Lehrer können in der Admin-Oberfläche im Tab "Meine Fächer & Aufgabentypen" ihre Fächer auswählen
2. Die verfügbaren Fächer sind zentral im System hinterlegt
3. Lehrer wählen aus, welche Fächer sie unterrichten

### Aufgabentypen verwalten

1. Pro Fach können spezifische Aufgabentypen ausgewählt werden
2. Lehrer können bestehende Aufgabentypen auswählen
3. Neue Aufgabentypen können hinzugefügt werden
4. Diese Aufgabentypen stehen dann bei der Erstellung neuer Materialien zur Verfügung

### Wichtig: Mehrere Aufgabentypen mit gleichem Namen

Nach einem Update des Systems können mehrere Lehrer Aufgabentypen mit identischen Namen erstellen. Jeder Aufgabentyp ist dennoch spezifisch für den jeweiligen Lehrer und kann unterschiedliche Inhalte haben. Beispielsweise können zwei Lehrer jeweils einen Aufgabentyp "Analyse" haben, die völlig unterschiedliche Bewertungskriterien enthalten.

Die Zuordnung erfolgt wie folgt:
1. Jeder Lehrer kann eigene Aufgabentypen erstellen
2. Die Aufgabentypen werden in der Datenbank gespeichert
3. Die Verknüpfung zwischen Lehrer, Fach und Aufgabentyp wird in einer separaten Tabelle gespeichert
4. Bei der Anzeige werden nur die Aufgabentypen angezeigt, die dem aktuellen Lehrer zugeordnet sind

### Migration von bestehenden Fächern und Aufgabentypen

Das Migrationsskript `migrate_subjects_types.py` importiert bestehende Fächer und Aufgabentypen aus der JSON-Datei in die Datenbank und weist sie optional einem Admin-Lehrer zu.

## Materialien-Verwaltung

Lehrmaterialien werden in der Datenbank gespeichert und sind einem Lehrer, Fach und Aufgabentyp zugeordnet.

### Struktur der Materialien

Jedes Material besteht aus:
- **Basisdaten**: Name, Beschreibung, Jahr, Zuordnung zu Lehrer, Fach und Aufgabentyp
- **Inhalte**: Die eigentlichen Inhalte des Materials, kategorisiert nach Typ:
  - **Prompt**: Die Vorlage für das Feedback-Modell
  - **Kriterien**: Bewertungskriterien für die Schülerarbeiten
  - **Aufgabe**: Die Aufgabenstellung für die Schüler
  - **Originaltexte**: Mehrere Originaltexte, die als Grundlage für die Aufgaben dienen

### Migration von bestehenden Materialien

Das Migrationsskript `migrate_materials.py` importiert bestehende Materialien aus dem Dateisystem in die Datenbank. Die Materialien werden dabei dem entsprechenden Lehrer, Fach und Aufgabentyp zugeordnet.

Die Verzeichnisstruktur für die Migration lautet:
```
schule-materialien/
└── <school_code>/
    └── <teacher_code>/
        └── <year>/
            └── <subject>/
                └── <assignment_type>/
                    ├── prompt.html
                    ├── kriterien.html
                    ├── aufgabe.html
                    └── originaltexte/
                        ├── text1.html
                        └── text2.html
```

### Anzeige und Bearbeitung von Materialien

Im Lehrkräftebereich können Materialien:
1. Angezeigt werden: Alle Materialien eines Lehrers werden aufgelistet
2. Erstellt werden: Neue Materialien können mit einem Namen und Beschreibung erstellt werden
3. Bearbeitet werden: Vorhandene Materialien können aktualisiert werden
4. Gelöscht werden: Nicht mehr benötigte Materialien können entfernt werden

### Verwendung in der Schüleransicht

Statt den Dateinamen der Originaltexte sehen Schüler nun die vom Lehrer definierten Namen. Die Auswahl der Materialien erfolgt über Dropdown-Menüs, die aus der Datenbank befüllt werden.

## Passwort-Reset-Funktionalität

Die Anwendung bietet eine "Passwort vergessen"-Funktion:

1. Lehrer gibt seine E-Mail-Adresse ein
2. System generiert ein temporäres Token und sendet einen Reset-Link per E-Mail
3. Lehrer klickt auf den Link und wird zur Passwort-Reset-Seite weitergeleitet
4. Neues Passwort wird eingegeben und in der Datenbank aktualisiert

## Sicherheitshinweise

- Alle Passwörter werden mit bcrypt gehasht gespeichert (nie im Klartext).
- Die Datenbank sollte nur auf dem Serverhost (localhost) erreichbar sein, nicht öffentlich.
- Verwende komplexe Passwörter für den Datenbankzugriff.
- Passwort-Reset-Token haben eine Gültigkeit von 24 Stunden.
- Die SMTP-Zugangsdaten für den E-Mail-Versand sollten sicher aufbewahrt werden.