gitea-classroom/README.md

223 lines
5.7 KiB
Markdown

# gitea-classroom
GitHub Classroom Ersatz für selbst-gehostete Gitea-Instanzen.
Unterstützt **Einzel-Assignments** (ein Repo pro Student) und **Gruppen-Assignments** (ein Repo pro Gruppe mit eigenem Gitea-Team).
**Hinweis:** Dieses Tool wurde durch KI erstellt.
## Installation
```bash
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```
## Konfiguration
```bash
export GITEA_URL="https://gitea.meine-uni.de"
export GITEA_TOKEN="dein_persönliches_api_token"
```
API-Token erstellen: Gitea → Einstellungen → Anwendungen → Token generieren
Benötigte Scopes: `repo`, `org`, `admin:org`
---
## Template-Repo vorbereiten
Das Template-Repo muss in Gitea als Template markiert sein:
**Repo → Einstellungen → Erweiterte Einstellungen → "Dieses Repository ist ein Template"**
Das Template kann in der eigenen Org oder bei einem anderen Nutzer liegen.
Das Template-Repo selbst wird nie verändert.
---
## CSV-Formate
### students.csv — für Einzel-Assignments
```csv
username,name,email
max.mustermann,Max Mustermann,max@uni.de
erika.musterfrau,Erika Musterfrau,erika@uni.de
```
### groups.csv — für Gruppen-Assignments
```csv
group,username
team-a,max.mustermann
team-a,erika.musterfrau
team-b,lena.schmidt
team-b,tom.mueller
```
Gruppenname (`group`) wird Teil des Repo-Namens: `proj01-team-a`
---
## Befehle
### `add-students` — Studenten zur Organisation hinzufügen
```bash
python classroom.py add-students --org info2-ss25 --csv students.csv
```
Fügt alle Nutzer aus der CSV dem `students`-Team der Org hinzu.
Die Gitea-Accounts müssen vorher existieren.
---
### `create-assignment` — Einzel-Assignment erstellen
```bash
python classroom.py create-assignment \
--org info2-ss25 \
--assignment ueb01 \
--template uebung01-template \
--csv students.csv
```
| Option | Beschreibung |
|---|---|
| `--org` | Ziel-Organisation |
| `--assignment` | Prefix für Repo-Namen (z. B. `ueb01`) |
| `--template` | Name des Template-Repos |
| `--template-owner` | Owner des Templates (Standard: `--org`) |
| `--csv` | students.csv |
| `--public` | Repos öffentlich erstellen (Standard: privat) |
Erstellt pro Student:
- Ein privates Repo (`ueb01-max.mustermann`) als Kopie des Templates
- Schreibzugriff nur auf das eigene Repo
- Einen **Feedback-PR** (`main``feedback`), der alle Student-Commits zeigt
```
info2-ss25/
ueb01-max.mustermann
ueb01-erika.musterfrau
...
```
---
### `create-group-assignment` — Gruppen-Assignment erstellen
```bash
python classroom.py create-group-assignment \
--org info2-ss25 \
--assignment proj01 \
--template projekt-template \
--csv groups.csv
```
| Option | Beschreibung |
|---|---|
| `--org` | Ziel-Organisation |
| `--assignment` | Prefix für Repo-Namen (z. B. `proj01`) |
| `--template` | Name des Template-Repos |
| `--template-owner` | Owner des Templates (Standard: `--org`) |
| `--csv` | groups.csv |
| `--public` | Repos öffentlich erstellen (Standard: privat) |
Erstellt pro Gruppe:
- Ein privates Repo (`proj01-team-a`) als Kopie des Templates
- Ein Gitea-Team (`proj01-team-a`) mit Schreibzugriff für alle Gruppenmitglieder
- Einen **Feedback-PR** (`main``feedback`), der alle Gruppen-Commits zeigt
- Studenten sehen ausschließlich das eigene Gruppen-Repo
```
info2-ss25/
proj01-team-a ← max.mustermann + erika.musterfrau
proj01-team-b ← lena.schmidt + tom.mueller
```
---
### `list-submissions` — Abgaben einsehen (Übersicht)
```bash
python classroom.py list-submissions --org info2-ss25 --assignment ueb01
```
Zeigt den letzten Commit je Repo in einer kompakten Tabelle.
Funktioniert für Einzel- und Gruppen-Assignments.
---
### `list-group-submissions` — Abgaben einsehen (Detailansicht)
```bash
python classroom.py list-group-submissions --org info2-ss25 --assignment proj01
```
Zeigt die letzten 5 Commits je Gruppen-Repo.
---
### `clone-submissions` — Abgaben lokal klonen
```bash
python classroom.py clone-submissions \
--org info2-ss25 \
--assignment ueb01 \
--dir ./abgaben
```
| Option | Beschreibung |
|---|---|
| `--org` | Organisation |
| `--assignment` | Assignment-Name |
| `--dir` | Zielverzeichnis (Standard: `.`) |
Klont alle Repos des Assignments nach `<dir>/<assignment>/<student>/`.
Bei erneutem Aufruf wird `git pull` auf bereits geklonte Repos ausgeführt.
---
### `delete-assignment` — Assignment löschen
```bash
python classroom.py delete-assignment --org info2-ss25 --assignment ueb01
```
Löscht alle Repos und die zugehörigen Gruppen-Teams des Assignments.
Verlangt manuelle Bestätigung durch Eingabe des Assignment-Namens.
---
## Feedback-PR
Jedes Repo erhält automatisch einen offenen Pull Request mit dem Titel **„Feedback"**:
- **`feedback`-Branch** — eingefrorener Template-Stand (Referenzpunkt)
- **`main`-Branch** — Student-Commits werden hier gepusht
- Der PR zeigt alle Änderungen relativ zum Template und wächst mit jedem Push
Dozenten können direkt im PR Zeilen kommentieren oder ein Review hinterlassen.
Der PR wird nie gemergt — er dient ausschließlich als Feedback-Kanal.
---
## Typischer Semesterablauf
```
Semesterbeginn:
add-students (einmalig, students.csv)
Übungsblätter (Einzel):
create-assignment → ueb01, ueb02, ...
list-submissions (Abgabe-Übersicht)
clone-submissions (lokal klonen / aktualisieren)
Projekt (Gruppe):
create-group-assignment → proj01
list-group-submissions (während der Bearbeitung)
list-submissions (kompakte Abgabe-Übersicht)
clone-submissions (lokal klonen / aktualisieren)
Semesterende:
delete-assignment (optional, für jedes Assignment)
```