====== Classroom50: Moodle sync einrichten ======
Diese Seite erklärt, wie die Noten aus Classroom 50 automatisch ins
Moodle-Notenbuch kommen. Der Übertrag läuft **nachts**, du musst nichts
von Hand starten.
===== Voraussetzungen =====
* Die Organisation ist in GitHub und Classroom50 erstellt [[.:setup]].
* Die Klasse ist erstellt [[.:classes]].
* Die Assignments sind erstellt — inklusive //external assignment// in Moodle [[.:assignments]].
===== 1. Workflow ins Repo kopieren =====
''moodle-sync.yaml'' ist **BZZ-eigen** und wird //nicht// von Classroom50
mitgeliefert. Du kopierst sie einmal pro Config-Repo von Hand hinein — die
Vorlage liegt im Repository [[https://github.com/BZZ-Commons/pygrader50|BZZ-Commons/pygrader50]]
im Ordner ''classroom50/''.
- Öffne das Repository ''classroom50'' in deiner GitHub-Organisation, z.B. ''https://github.com/m320-ix25/classroom50''.
- Kopiere ''moodle-sync.yaml'' nach ''.github/workflows/moodle-sync.yaml''.
- Committen. Der Workflow erscheint danach unter **Actions → Moodle Sync**.
Den Dateinamen so lassen und **keine bestehende Workflow-Datei** dafür
verwenden: Classroom50 überschreibt seine eigenen Workflows bei einem Update.
Die Datei gilt für **alle** Klassen im Repo — eine Kopie genügt, auch bei
mehreren Klassenordnern.
===== 2. Zugangsdaten hinterlegen =====
Ebenfalls im Repo ''classroom50'', unter **Settings → Secrets and variables →
Actions**:
^ Art ^ Name ^ Wert ^
| Secret | ''MOODLE_TOKEN'' | Webservice-Token aus Moodle |
| Variable | ''MOODLE_URL'' | ''https://moodle.bzz.ch'' |
Oder im Terminal:
gh secret set MOODLE_TOKEN --repo /classroom50
gh variable set MOODLE_URL --repo /classroom50 --body "https://moodle.bzz.ch"
Der Token gehört **nur** ins ''classroom50''-Repo, nie in ein Repo der
Lernenden — damit lassen sich Noten für beliebige Personen setzen.
===== 3. Zuordnung prüfen =====
Damit eine Note ankommt, muss die Person in Moodle gefunden werden:
- Die lernende Person hat ihren **GitHub-Login im Moodle-Profil** eingetragen, im Feld //GitHub Classroom// → [[howto:git:github_moodle|Anleitung]].
- Die Person ist **im Moodle-Kurs eingeschrieben**.
- Die Aktivität //external assignment// heisst **exakt wie der Slug** der Aufgabe, z.B. ''m323-lu01-a02-imperativer-ggt''.
Der Moodle-Benutzername spielt keine Rolle — gesucht wird nur im Profilfeld.
===== 4. Testen =====
Im Repo ''classroom50'' unter **Actions → Moodle Sync → Run workflow**,
Häkchen bei ''dry_run'' (zeigt nur an, schreibt nichts):
Moodle-Übertrag: 2 Abgaben
[dry-run] / anna: 5/7
[dry-run] / bruno: 7/7
übertragen: 2 | unverändert: 0 | fehlgeschlagen: 0
Sieht das gut aus, dasselbe ohne ''dry_run'' laufen lassen. Danach ist die
Einrichtung fertig.
Zum Testen einen **echten Login einer lernenden Person** nehmen. Der eigene
Lehrer-Account ist im Kurs meist kein Teilnehmer — der Test scheitert dann,
obwohl alles richtig eingerichtet ist.
===== Ab jetzt automatisch =====
^ Wann ^ Was ^
| nachts | Classroom 50 sammelt alle Abgaben ein |
| 04:57 | ''moodle-sync'' trägt sie ins Moodle-Notenbuch ein |
Übertragen wird pro Person und Aufgabe die **neueste** Abgabe, zusammen mit
Punktzahl, Feedback und Link zur Abgabe. Schon Übertragenes wird übersprungen —
ausser die Punktzahl hat sich geändert.
Zwischendurch von Hand: **Actions → Moodle Sync → Run workflow**. Der Schalter
''force'' sendet auch schon Übertragenes nochmals.
===== Wenn etwas nicht klappt =====
^ Meldung / Symptom ^ Das hilft ^
| kein Eintrag **Moodle Sync** unter Actions | Schritt 1 nachholen |
| ''No Moodle user found with username "X"'' | Person trägt ihren GitHub-Login im Moodle-Profil nach |
| ''No matching assignment found'' | Aktivitätsname stimmt nicht **oder** Person ist nicht im Kurs — beides prüfen |
| ''keine XML-Antwort erhalten'' | ''MOODLE_URL'' oder Token falsch |
| Note kommt nicht an, Log sagt „unverändert" | nochmals auslösen, diesmal mit ''force'' |
| Nachtlauf jede Nacht rot, immer dieselbe Person | alter Eintrag in ''scores.json'', siehe [[https://github.com/BZZ-Commons/pygrader50/blob/main/docs/betrieb.md|Betrieb]] |
===== Details =====
* [[https://github.com/BZZ-Commons/pygrader50/blob/main/docs/moodle.md|Moodle]] — Hintergründe, alle Felder, Zustandsfile
* [[https://github.com/BZZ-Commons/pygrader50/blob/main/docs/einrichtung.md|Einrichtung]] — vollständige Einrichtung inkl. Autograder
* [[https://github.com/BZZ-Commons/pygrader50/blob/main/docs/cli.md|CLI-Referenz]] — Übertrag lokal prüfen, alle Optionen
* [[.:hilfe|Hilfe und Dokumentation]] — Übersicht über die ganze Dokumentation