====== Classroom 50: Klassenzimmer und Aufgaben verwalten ====== Diese Seite beschreibt den **laufenden Betrieb**. Ein Klassenzimmer neu aufsetzen: [[.:einrichtung|Einrichtung]]. Von GitHub Classroom umsteigen: [[.:migration|Migration]]. ===== Werkzeug ===== Classroom 50 hat keine Web-Oberfläche zum Verwalten. Alles läuft über die GitHub-CLI-Erweiterung ''gh teacher'': gh extension install foundation50/gh-teacher gh auth refresh -h github.com -s admin:org,read:org,repo,workflow Der zweite Befehl ist keine Formalie: Ohne ''admin:org'' bricht **jeder** ''gh teacher''-Aufruf mit einer Scope-Meldung ab. Er öffnet den Browser und braucht deshalb ein interaktives Terminal. gh teacher classroom list ===== Klassenliste (Roster) ===== Die Klassenliste liegt als ''/roster.csv'' im Config-Repo, mit diesem Header: username,first_name,last_name,email,section,github_id,role Ältere Klassenzimmer haben stattdessen eine ''students.csv''. Damit scheitert jeder ''gh teacher roster''-Befehl, und die Namen in ''scores.json'' bleiben leer. Datei umbenennen und die Spalte ''role'' ergänzen. Das Roster steuert die Bewertung **nicht** — es liefert nur Anzeigedaten. Eingesammelt wird nach der Union aus Studenten-Team und **allen** Staff-Teams (''teacher'', ''hta'', ''ta''). Wer als Lehrperson eine Aufgabe annimmt, um den Ablauf zu testen, wird wie eine lernende Person bewertet und landet in ''scores.json'' — und damit im Moodle-Übertrag, wo der Account dann fehlt. Testrepos nach dem Test löschen **und** den Eintrag aus ''scores.json'' entfernen. ===== Aufgaben ===== Alle Aufgaben einer Klasse stehen in ''/assignments.json'' im Config-Repo. Ein Eintrag verweist auf das Template-Repo, den Slug, den Abgabetermin und den zu verwendenden Autograder. An der BZZ steht bei allen Aufgaben ''"autograder": "default"'' und ''"feedback_pr": true'', und **kein** ''tests''-Block. Damit greift überall der Klassen-Default, also pygrader50 mit pytest und pylint. Aufgaben auflisten: gh api repos//classroom50/contents//assignments.json \ -H 'Accept: application/vnd.github.raw' | jq -r '.assignments[].slug' Zu Templates siehe [[howto:git:template|Template-Repositories]], zum Aufbau des Config-Repos [[howto:git:classroom50repo|Das classroom50-Repository]]. ===== Resultate einsehen ===== * **Pro Abgabe** — Release und Commit-Status im Studi-Repo. * **Pro Klasse** — ''/scores.json'' im Config-Repo, nachts von ''collect-scores'' aktualisiert. * **In Moodle** — nachts um 04:57 durch ''moodle-sync'', siehe [[.:moodle|]]. gh api repos//classroom50/contents//scores.json \ -H 'Accept: application/vnd.github.raw' | jq '.' ===== Nachbewerten ===== Eine Abgabe neu bewerten lassen: im Studi-Repo unter **Actions** den Bewertungslauf erneut starten (//Re-run all jobs//). Das erzeugt ein neues Release; der nächste Moodle-Lauf überträgt die geänderte Punktzahl automatisch, weil sich die Punktzahl unterscheidet. Nur die Note in Moodle nachtragen, ohne neuen Lauf: gh workflow run moodle-sync.yaml --repo /classroom50 \ -f classroom= -f assignment= -f force=true ===== Betriebsfallen ===== ==== scores.json wird nie aufgeräumt ==== Das Einsammeln ist ein reiner Upsert, geschlüsselt auf den Repo-Owner. Ein Eintrag bleibt stehen, auch wenn das Repository gelöscht oder die Person ausgetragen wurde. Weil der Moodle-Übertrag mit Exit 1 endet, sobald **eine** Übertragung scheitert, färbt ein einziger solcher Karteileichen-Eintrag den Nachtlauf dauerhaft rot. **Nach einer Abmeldung den Eintrag von Hand aus ''/scores.json'' entfernen.** ==== Der Service-Token braucht Administration-Rechte ==== Fehlt dem ''CLASSROOM50_SERVICE_TOKEN'' das Recht //Repository → Administration: Read and write//, scheitert ''collect-scores'' mit ''staff-team access grant failed with HTTP 403''. Die Punkte werden trotzdem gesammelt, der Job endet aber rot und die TA-Teams bekommen keinen Zugriff. gh teacher rotate-service-token ==== Python-Version ==== Ohne Angabe von ''runtime.python'' wählt der Runner **Python 3.14**. Dort installieren sich pytest 9.x und pylint 4.x — die Lint-Punkte fallen strenger aus als mit den alten Template-Pins (''pytest==8.3.3'', ''pylint==3.2.7''). ===== Weiter ===== * [[.:bewertung|Wie bewertet wird]] * [[.:moodle|Noten nach Moodle übertragen]] * [[.:troubleshooting|Problembehandlung]]