Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
howto:git:classroom50:moodle_simple [2026/08/25 09:53] – [Schritt 1: Den Workflow ins Repo kopieren] adminhowto:git:classroom50:moodle_simple [2026/10/01 11:56] (aktuell) – [4. Testen] aprobst
Zeile 1: Zeile 1:
-====== Classroom 50: Noten nach Moodle übertragen ======+====== Classroom50: Moodle sync einrichten ======
  
-**Kurz gesagt:** Die Lernenden geben ihre Aufgabe auf GitHub ab. In der Nacht +<WRAP center round tip 60%> 
-holt ein Job die Punkte ab und trägt sie in Moodle ein. Du musst dafür nichts +Diese Seite erklärt, wie die Noten aus Classroom 50 automatisch ins 
-von Hand starten — aber einmal pro Kurs etwas einrichten. +Moodle-Notenbuch kommen. Der Übertrag läuft **nachts**, du musst nichts 
- +von Hand starten.
-<WRAP center round tip 90%> +
-**Die drei Dinge, die stimmen müssen** +
- +
-  - In Moodle gibt es eine Aktivität, die **genau gleich heisst wie der Slug der Aufgabe**. +
-  - Die lernende Person hat ihren **GitHub-Login im Moodle-Profil** eingetragen. +
-  - Die Person ist **im Kurs eingeschrieben**. +
- +
-Stimmt eines davon nicht, kommt die Note nicht an.+
 </WRAP> </WRAP>
  
-===== Schritt 1: Den Workflow ins Repo kopieren =====+===== Voraussetzungen =====
  
-''moodle-sync.yaml'' ist **BZZ-eigen** und wird //nicht// von +  * Die Organisation ist in GitHub und Classroom50 erstellt [[.:setup]]. 
-''gh teacher classroom add'' angelegt. Die anderen drei Workflows im Config-Repo +  * Die Klasse ist erstellt [[.:classes]]. 
-(''autograde-runner'', ''publish-pages'', ''collect-scores'') kommen mit, +  * Die Assignments sind erstellt — inklusive //external assignment// in Moodle [[.:assignments]].
-dieser nicht — du kopierst ihn einmal von Hand hinein.+
  
-Die Vorlage liegt im Repo [[https://github.com/BZZ-Commons/pygrader50|BZZ-Commons/pygrader50]] +===== 1. Workflow ins Repo kopieren =====
-im Ordner ''classroom50/'':+
  
-<code bash> +''moodle-sync.yaml'' ist **BZZ-eigen** und wird //nicht// von Classroom50 
-cp classroom50/moodle-sync.yaml <config-repo>/.github/workflows/moodle-sync.yaml +mitgeliefert. Du kopierst sie einmal pro Config-Repo von Hand hinein — die 
-</code>+Vorlage liegt im Repository [[https://github.com/BZZ-Commons/pygrader50|BZZ-Commons/pygrader50]] 
 +im Ordner ''classroom50/''.
  
-Danach committen und pushen. Ab jetzt erscheint der Workflow im Config-Repo +  - Öffne das Repository ''classroom50'' in deiner GitHub-Organisation, z.B. ''https://github.com/m320-ix25/classroom50''. 
-unter **Actions → Moodle Sync**.+  - Kopiere ''moodle-sync.yaml'' nach ''.github/workflows/moodle-sync.yaml''. 
 +  - Committen. Der Workflow erscheint danach unter **Actions → Moodle Sync**.
  
-<WRAP center round important 90%> +<WRAP center round important 60%> 
-**Eigener Dateiname, keine bestehende Datei anfassen.** ''gh teacher'' +Den Dateinamen so lassen und **keine bestehende Workflow-Datei** dafür 
-überschreibt seine mitgelieferten Workflows bei einem Refresh — was du +verwenden: Classroom50 überschreibt seine eigenen Workflows bei einem Update.
-hineinschreibst, wäre weg.+
 </WRAP> </WRAP>
  
-Die Datei gilt für **alle** Classrooms im Repo. Ein Config-Repo mit mehreren +Die Datei gilt für **alle** Klassen im Repo — eine Kopie genügt, auch bei 
-Klassen braucht also keine zweite Kopie. Anzupassen ist höchstens der gepinnte +mehreren Klassenordnern.
-pygrader50-Tag, falls er von dem in ''bootstrap/autograder.py'' abweicht.+
  
 +===== 2. Zugangsdaten hinterlegen =====
  
-===== Schritt 2: Aktivität in Moodle anlegen ===== +Ebenfalls im Repo ''classroom50'', unter **Settings → Secrets and variables → 
- +Actions**:
-Pro Aufgabe **eine** Aktivität vom Typ **External Assignment** +
-(''mod_externalassignment''). +
- +
-Der Name der Aktivität muss **exakt** der Slug der Aufgabe sein, zum Beispiel: +
- +
-<code>m323-lu01-a02-imperativer-ggt</code> +
- +
-Kein zusätzliches Wort, kein Leerzeichen davor oder dahinter. Am besten den +
-Slug kopieren und einfügen. +
- +
-===== Schritt 3: GitHub-Login im Moodle-Profil ===== +
- +
-Jede lernende Person trägt ihren GitHub-Login im eigenen Moodle-Profil ein, +
-im Feld //GitHub Classroom//. Anleitung dazu: [[howto:git:github_moodle|]]. +
- +
-Wichtig: Der **Moodle-Benutzername spielt keine Rolle**. Gesucht wird nur in +
-diesem einen Profilfeld. Welches Feld das ist, legt die Plugin-Einstellung +
-''mod_externalassignment/external_username'' fest (Vorgabe: ''github_user''). +
- +
-===== Schritt 4: Zugangsdaten hinterlegen ===== +
- +
-Das machst du **einmal** — und zwar im Repo ''classroom50'', //nicht// in der +
-Organisation der Lernenden.+
  
 ^ Art ^ Name ^ Wert ^ ^ Art ^ Name ^ Wert ^
 | Secret | ''MOODLE_TOKEN'' | Webservice-Token aus Moodle | | Secret | ''MOODLE_TOKEN'' | Webservice-Token aus Moodle |
-| Variable | ''MOODLE_URL'' | z.B. ''https://moodle.bzz.ch'' | +| Variable | ''MOODLE_URL'' | ''https://moodle.bzz.ch'' | 
-| Variable | ''MOODLE_FUNCTION'' | optional, Vorgabe ''mod_externalassignment_update_grade'' |+ 
 +Oder im Terminal:
  
 <code bash> <code bash>
Zeile 79: Zeile 48:
 </code> </code>
  
-Für den Token in Moodle einen **eigenen Webservice-Benutzer** anlegen, der nur +<WRAP center round important 60%> 
-diese eine Funktion ausführen darf. Je weniger der Token kann, desto kleiner +Der Token gehört **nur** ins ''classroom50''-Repo, nie in ein Repo der 
-der Schaden, falls er einmal ausserhalb landet.+Lernenden — damit lassen sich Noten für beliebige Personen setzen. 
 +</WRAP>
  
-===== Schritt 5: Testen =====+===== 3. Zuordnung prüfen =====
  
-Teste mit einem **echten Login einer lernenden Person**. Dein eigener +Damit eine Note ankommt, muss die Person in Moodle gefunden werden:
-Lehrer-Account ist im Kurs meistens kein Teilnehmer — damit schlägt der Test +
-fehl, obwohl alles richtig eingerichtet ist.+
  
-Trockenlauf (ändert nichts in Moodle):+  - 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''.
  
-<code bash> +Der Moodle-Benutzername spielt keine Rolle — gesucht wird nur im Profilfeld. 
-gh workflow run moodle-sync.yaml --repo <ORG>/classroom50 \ + 
-  -f classroom=<CLASSROOM> -f dry_run=true +===== 4. Testen =====
-</code>+
  
-So sieht es aus, wenn es klappt:+Im Repo ''classroom50'' unter **Actions → Moodle Sync → Run workflow**, 
 +Häkchen bei ''dry_run'' (zeigt nur an, schreibt nichts):
  
 <code> <code>
Zeile 105: Zeile 75:
 </code> </code>
  
-===== Wann läuft der Übertrag? =====+Sieht das gut aus, dasselbe ohne ''dry_run'' laufen lassen. Danach ist die 
 +Einrichtung fertig.
  
-^ Job ^ Zeit ^ Was er tut ^ +<WRAP center round important 60%> 
-| ''collect-scores'' | nachts | sammelt alle Abgaben in ''<CLASSROOM>/scores.json'' | +Zum Testen einen **echten Login einer lernenden Person** nehmen. Der eigene 
-| ''moodle-sync'' | 04:57 (''57 4 * * *'') | trägt sie von dort nach Moodle ein |+Lehrer-Account ist im Kurs meist kein Teilnehmer — der Test scheitert dann, 
 +obwohl alles richtig eingerichtet ist. 
 +</WRAP> 
 +{{:howto:git:classroom50:classroom50workflowdryrun.png?200|}}
  
-Zwischen den beiden liegen 40 Minuten, damit der erste Job sicher fertig ist.+===== Ab jetzt automatisch =====
  
-Übertragen wird pro Person und Aufgabe immer die **neueste** Abgabe. Was schon +^ Wann ^ Was ^ 
-übertragen wurde, merkt sich die Datei ''<CLASSROOM>/moodle-state.json''. +| nachts | Classroom 50 sammelt alle Abgaben ein | 
-Übersprungen wird nur, wenn Abgabe //und// Punktzahl gleich geblieben sind — +| 04:57 | ''moodle-sync'' trägt sie ins Moodle-Notenbuch ein |
-eine Nachbewertung derselben Abgabe geht also erneut raus.+
  
-Das kommt in Moodle an:+Ü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.
  
-^ Moodle-Feld ^ Inhalt ^ +Zwischendurch von Hand: **Actions → Moodle Sync → Run workflow**. Der Schalter 
-| ''assignment_name'' | Slug der Aufgabe | +''force'' sendet auch schon Übertragenes nochmals.
-| ''user_name'' | GitHub-Login der Person | +
-| ''points'' / ''max'' | Punkte der neuesten Abgabe | +
-| ''externallink'' | Link zum GitHub-Release | +
-| ''feedback'' | Text des Releases, bei verspäteter Abgabe mit Hinweis davor | +
- +
-===== Von Hand auslösen ===== +
- +
-Im Repo ''classroom50'': **Actions → Moodle Sync → Run workflow**. +
- +
-Eingaben: Classroom, optional Aufgabe und Login, dazu die Schalter ''dry_run'' +
-(nur anzeigen) und ''force'' (auch schon Übertragenes nochmals senden). +
-Lässt du den Classroom leer, laufen **alle** Ordner mit einer ''scores.json''.+
  
 ===== Wenn etwas nicht klappt ===== ===== Wenn etwas nicht klappt =====
  
-^ Meldung / Symptom ^ Das steckt dahinter ^ Das hilft ^ +^ Meldung / Symptom ^ Das hilft ^ 
-| ''No Moodle user found with username "X"'' | Profilfeld leer oder falsch geschrieben | Person trägt ihren GitHub-Login im Moodle-Profil nach | +| kein Eintrag **Moodle Sync** unter Actions | Schritt 1 nachholen | 
-| ''No matching assignment found'' | Aktivität fehlt **oder** Person ist nicht im Kurs | Beides prüfen — das Plugin sucht Aktivität und Person zusammen | +| ''No Moodle user found with username "X"'' | Person trägt ihren GitHub-Login im Moodle-Profil nach | 
-| ''keine XML-Antwort erhalten'' | falsche ''MOODLE_URL'' oder ungültiger Token | Moodle schickt eine Login-Seite statt Daten — URL und Token prüfen | +| ''No matching assignment found'' | Aktivitätsname stimmt nicht **oder** Person ist nicht im Kurs — beides prüfen | 
-| Note kommt nicht an, Log sagt „unverändert" | Zustandsfile hält sie für erledigt | Workflow mit ''force'' erneut auslösen | +| ''keine XML-Antwort erhalten'' | ''MOODLE_URL'' oder Token falsch | 
-| Kein Eintrag **Moodle Sync** unter Actions | Workflow-Datei fehlt im Config-Repo | Schritt 1 nachholen | +| 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 [[.:lehrpersonen|Betriebsfallen]] |+| 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]] |
  
-===== Zum Nachschauen ===== +===== Details =====
- +
-==== Warum zentral und nicht im Repo der Lernenden? ==== +
- +
-Mit dem Moodle-Token kann man Noten für **beliebige Personen** setzen. Läge er +
-in einem Studi-Repo, könnte ihn ein selbst hinzugefügter Workflow in drei +
-Zeilen auslesen. Genau so war es unter GitHub Classroom +
-(''secrets: inherit''). Mit Classroom 50 ist damit Schluss: Der zentrale +
-Workflow ''autograde-runner.yaml'' gibt **keine Secrets** an den +
-Bewertungs-Job weiter. +
- +
-==== Warum nachts und nicht bei jedem Push? ==== +
- +
-Der direkte Weg hätte einen Token in jedem Studi-Repo gebraucht, eine eigene +
-Workflow-Datei pro Repo, eine nachgebaute Skip-Logik und rund 33 % mehr +
-Actions-Minuten — und einen Nacht-Fallback hätte es trotzdem gebraucht. +
- +
-==== Lokal prüfen, ohne Zugangsdaten ==== +
- +
-<code bash> +
-gh api repos/<ORG>/classroom50/contents/<CLASSROOM>/scores.json \ +
-   -H 'Accept: application/vnd.github.raw' > scores.json +
-GH_TOKEN=$(gh auth token) python -m pygrader50.moodle scores.json --dry-run +
-</code>+
  
-Alle Optionen: [[.:cli|CLI-Referenz]].+  * [[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
  
  • howto/git/classroom50/moodle_simple.1787644433.txt.gz
  • Zuletzt geändert: 2026/08/25 09:53
  • von admin