Moodle - automatisches Erstellen von Gruppen und Einschreiben der SuS

Hallo, liebe Linuxmustler,

so, wie vielleicht bei Euch allen, war ich dank Corona auf einmal sehr als Moodle-Admin gefragt und habe mein externes Moodle (Vers. 3.32) aufgepimpt. Im Nu sollte nun die Schulstruktur abgebildet werden. Schade, dass es das gute alte enrollment-Plugin nicht mehr für diese Moodle-Version (einschl. PHP7.x) gibt.

Ich habe daher nach etwas Recherche ein tolles tool gefunden, mit dem man das scriptgesteuert machen kann. Damit habe ich in einem Rutsch Kategorien, globale Gruppen und Kurse angelegt. Dann habe ich alle SuS mithilfe der Sophomorix-Datei all-unix.csv und einem Script in die Gruppen einsortiert.

Das Vorgehen beschreibe ich hier jetzt für alle Interessenten:

  1. Zuerst installiert man moosh (=moodle-shell), eine Art Kommandozeile für Moodle.
    Das geht entweder über die Paketverwaltung oder über git, Zweiteres hat bei mir (auch) funktioniert. Installationsanleitung hier:

https://moosh-online.com/

Ich musste allerdings
composer.phar
statt
composer
eingeben, um zu installieren.

In der ersten Zeile der moosh.php habe ich aus
#!/usr/bin/env php
#!/usr/bin/env php7.1
gemacht, da mit meinem normalen PHP7.2 moosh nicht funktioniert.

Dann muss man generell sich als www-data anmelden, da dieser keine shell besitzt, muss dies beim su-Befehl temporär erzwungen werden:

cd /usr/share/moodle
su www-data -s /bin/bash

Nun muss nur noch die Datei all-unix.csv mit
sophomorix-print -a
auf dem Linuxmuster-Server erzeugt werden, die holt man sich mit einem sftp-fähigen Dateibrowser (Nemo, Dolphin, …) einfach rüber in das Verzeichnis von Moodle, bei mir also
/usr/share/moodle.

Nun das Script:

#!/bin/bash
# Hier werden die Schüler in Klassen einsortiert
# Ich hab das hier "hartverdrahtet", sicher kann man dies variabler machen !
# Schuljahr angeben
year="2019-20"
array=(\     
 Klasse_5a_\ 
 Klasse_5b_\
 Klasse_5c_\
 Klasse_6a_\
 Klasse_6b_\
 Klasse_6c_\
 Klasse_7a_\
 Klasse_7b_\
 Klasse_7c_\
 Klasse_8a_\
 Klasse_8b_\
 Klasse_8c_\
 Klasse_9a_\
 Klasse_9b_\
 Klasse_9c_\
 Klasse_ef_\
 Klasse_q1_\
 Klasse_q2_\
 )
# Alle Elemente im Array durchlaufen
for value in ${array[*]}
do
   echo "Lege an: $value$year"
   moosh cohort-create -d "$value$year" -i "$value$year" "$value$year"
done
# Nun werden die SuS in die obigen Klassen einsortiert:
# Zuerst legen wir eine Datei mit den Schüler-IDs und Login-Namen an:
moosh user-list "id>1" >all_users.txt
# Dann suchen wir den Login, 
# vergleichen ihn mit dem aus sophomorix -> all-unix.csv
# und erzeugen eine neue Datei mit Login-Namen, Moodle-IDs und Klassen
awk -F"," '{print $1}' all_users.txt >all_users_with_id.txt

while read line
do 
   if [[ $line != *"@"* ]]
   then
     logname=`echo $line | cut -d' ' -f1`
     id_temp=`echo $line | cut -d' ' -f2`
     id=`echo ${id_temp:1:-1}`
     # Suche nach dem loginnamen in der sophomorix-user-Datei
     logindata=`grep ";$logname;" all-unix.csv`
     group=`echo $logindata | cut -d';' -f2`   
     echo "Ich ordne der Gruppe zu:"
     echo $logname 
     moosh cohort-enrol -u "$id" "Klasse_${group}_${year}"
     echo "Klasse_${group}_${year}" 
     echo ".................." 
   fi
done < all_users_with_id.txt

(Dies alles, wie gesagt, im Moodle-Hauptverzeichnis ausführen).

Man kann noch viel mehr mit moosh machen, im nächsten Jahr werden wir versuchen, mit einem SCHILD-Export die komplette Schule in einem Rutsch in Moodle abzubilden.

Vielleicht gefällt dem einen oder der anderen ja das Script -
viel Spaß

Christoph Gü

1 Like

Hallo Christoph,
ist das auch bei einem Belwue-Moodle möglich?

Viele Grüße
Jürgen

Hallo, Jürgen,

das hängt davon ab, ob Ihr die moosh-shell installieren dürft. Sofern das geht und Ihr einen Terminalzugang ins webroot besitzt, müsste das funktionieren. Da ich kein Belwue so nicht kenne, bin ich da aber eher skeptisch: die lassen Euch doch nicht per ssh auf Eure Instanz, oder ?

L.G-
Christoph

Hallo!

nein. Nur per ftp. Oder man nutzt den Webspace und macht das moodle selber (aber warum sollte man).
Die Script-Idee finde ich jedoch super.
Nutzer kriegt man ja auch mit .csv-Datei ins Moodle, incl. Gruppenzugehörigkeit.
Wenn ich Zeit gehabt hätte, hätte ich mir schon ein Script gebastelt, dass die schueler.txt in so eine csv umwandelt.
Vielleicht lass ich das meinen Info-Kurs oder die Info-AG oder so machen.
Idee für nächstes Jahr:
Bestands-csv holen, Klassen per Script (oder java-Programm) ändern, neue Schüler dazu, alte weg.
Hochladen und fertig?
Naja, die Schüler sind noch nicht in den passendne Gruppen. Mal sehen, was die Zukunft bringt. Das Enrol-Plugin fehlt jedenfalls echt.
LG
Max

Hallo Max,

Bestands-csv holen, Klassen per Script (oder java-Programm) ändern, neue
Schüler dazu, alte weg.
Hochladen und fertig?

bist du dir sicher, dass du über die Listen auch Leute raus schmeißen
kannst?

LG

Holger

Hallo,

moosh erlaubt all dies: Rollen, Kurse, Teilnehmer, Gruppen, … anzulegen und zu löschen. AUch das Auflisten funktioniert. Vermutlich kann man damit locker das enrol-Plugin nachbauen.

L.G.
Christoph G.

Hi Holger,
ich glaube, mann kann beim Import sagen, dass alles, was nicht auf der Liste steht, weg soll. Irgendwo (oder war es beim enrol-Script) hab ich das gelesen.
Das müsste man dann halt abgleichen:
Wer ist bereits drinnen (also bestehender Export), außerdem die Sonderkonten abfangen…
LG
Max

Hallo Christoph,
wenn das halt nicht beim BelWü geht, lohnt das Nachbauen nicht wriklich, da die meisten sicher bei BelWü sind…
LG
Max

Naja,

es gibt noch ein weiteres Bundesland…sehr klein…wie hieß es doch gleich…ich unterrichte da - Moment: NRW !
Wir haben (vermutlich wegen des Kohlestaubs) kein „belle vue“ …

herzlich
Christoph

Hallo zusammen,

ich hatte dazu schon mal etwas geschrieben und es auf dem WE in Essen kurz erwähnt: wir nutzen bei uns ein Python-Skript, welches die REST-Schnittstelle von Moodle nutzt. Damit lässt sich wirklich ALLES realisieren.

Einige Beispiele:

  • Nutzer aus der lml werden per LDAP eingelesen und dann in Moodle angelegt (Authentifizierung geht natürlich weiterhin wie bisher über den LDAP von linuxmuster, aber dann sind auch wirklich alle Nutzer in Moodle verfügbar).
  • alle Klassen und Kurse (wir lesen die aus den CSVs der Schulverwaltung ein, tricky aber geht) sind als globale Gruppen verfügbar und werden in entsprechende Moodle-Kurse eingeschrieben
  • unsichtbare „Vorlagenkurse“ mit einer vorgefertigten Struktur dienen als Template für neue Klassenkurse
  • die gleiche Gruppenstruktur ist über das gleiche Skript auch in Nextcloud abgebildet (über occ), das heißt, man kann z.B. mit der 6a oder den 6a-Lehrern teilen

Das läuft bei uns seit diesem Schuljahr und die KuK sind mehr als zufrieden (und die Nutzerzahlen bei Moodle ordentlich in die Höhe gegangen).

Ich komme im Moment (Ernstfall Digitalisierung) nicht dazu, das benutzerfreundlich zu verpacken, da unser Paket noch einige Bausteine mehr hat. Aber ich versuche, in den nächsten Tagen mal eine zusammengestrichene Version des Python-Skripts zu basteln, mit der die Grundfunktionen (herunterladen der Nutzer aus dem LDAP, Anlegen von Nutzern und Kursen bei Moodle) möglich ist und mit dem man weiter arbeiten kann.

Aber bevor sich jetzt jemand in Moosh einarbeitet (mit dem vieles geht, aber manches auch nicht) lohnt da ein Blick. Und die REST-Schnittstelle geht mit JEDEM Moodle, ob BelWue oder anderswo, auch ohne Shell auf dem Server. Man legt einmalig einen entsprechenden Benutzer bei Moodle an, erzeugt einen Token und trägt den in das Skript ein. Der Rest ist nicht schwer zu verstehen/programmieren.

Viele Grüße
Thomas

4 Like

Hallo Thomas,

… dann warte ich doch gerne noch eine Woche und bin sehr gespannt ;-).

TAUSEND DANK schon im Voraus!

Viele Grüße
Jürgen

Ja, super !
(zumal PHP7.2 aufwärts mit moosh nicht funktioniert !)

Bin auch gespannt -
L.G.

Christoph

Hi Thomas @thoschi .
Ich will ja nicht drängeln … aber bist du an der Sache noch dran? Auch wir wollen künftig moodle großflächiger einsetzen. Wenn da direkt alle eigenen Kurse inkl Teilnehmer usw für die Kollegen, die sich neu damit auseinandersetzen (müssen) vorhanden wären, wäre das wirklich der Knaller…
Wie schätzt du das ein? Wird es kompliziert sein, euer Setup auf andere Installationen zu übertragen?
Danke nochmal und schöne Grüße,
Michael

Hi Michael,

  ich bin seit Ende der Woche dran und hoffe mal, dass ich morgen

oder Anfang der Woche etwas fertig habe.

  Das wird dann erstmal ein Grundgerüst sein, mit dem man loslegen

kann - und jeder mit etwas Ahnung von Python kann das
weiterentwickeln.

  Wir arbeiten gerade daran, dass das ganze interaktiv ist - das

werde ich alles herausschmeißen, so dass ein Python-Skript übrig
bleibt, das die lmn-Nutzer/Gruppen zu Moodle überträgt und die
entsprechenden Kurse in einer festen Struktur anlegt.

Aber mehr dann.

Viele Grüße
Thomas

1 Like

Hallo,

ich muss jetzt mal ganz unbedarft fragen:
Kann man bei der Anmeldung am Moodle via LDAP gegen den LMN-Server nicht ein Klassen-Attribut übergeben, so dass die SuS schonmal zumindest in den Kurs ihrer Klasse landen?

Ich habe gehört, dass das gehen soll (mit upgedatetem Moodle bei Belwue ).

Gruß
Stefan

Hallo zusammen,

ich habe mal ein paar lml- und Moodle-spezifische Dinge aus unserem „Schulzeug“-Projekt extrahiert und in ein einzelnes Python-Skript gepackt:

Dieses Skript liest einen 6.2-LDAP aus und erstellt über die REST-Schnittstelle von Moodle Kursbereiche und Klassen und schreibt die Nutzer entsprechend ein.

Projekte nutzen wir nicht - die werden also vermutlich noch nicht korrekt behandelt. Derzeit ist jeder Nutzer in genau einer Klasse - das dürfte aber recht leicht zu erweitern sein.

Das ist jetzt natürlich noch nicht der komplette OPENLML-ENROL-Ersatz. Aber ich hoffe, es zeigt, wie der Workflow LDAP->Moodle grundsätzlich über die REST-Schnittstelle zu realisieren ist.

Um das in Betrieb zunehmen, muss man in Moodle die Webservices aktivieren, einen Nutzer hinzufügen und ihm die Rechte an den im Skript benötigten Funktionen geben. Eine Schritt für Schritt-Anleitung gibt es z.B. hier.

Außerdem müssen ein paar Variablen gesetzt werden (z.B. der Token, ggf. die LDAP-Einstellungen). Leider muss man auch die ID der globalen Rollen für Schüler und Lehrer aus der Datenbank von Moodle lesen (Tabelle mdl_role), da seltsamerweise keine Funktion zum Auslesen der globalen Rollen zu existieren scheint. Wer keinen Datenbank-Zugriff hat, kann sie aber auch leicht aus den Links von der Rollenverwaltung aus auslesen (dort jeweils nach „roleid=“ im Link suchen).

Eine Übersicht über die wirklich mächtige Moodle-REST-Schnittstelle gibt es hier.

Ich hoffe, die Codebeispiele zeigen, wie man bei Bedarf auch andere Befehle aufrufen kann. Im Rahmen des ursprünglichen Projekts arbeiten wir an einer umfangreichen Moodle- und Nextcloud-Befehlsbibliothek, die dann später auch für andere Projekte zur Verfügung steht - aber das dauert noch.

Ich hoffe, es finden sich Leute, die das zu testen wagen - Anregungen arbeite ich auch gerne noch in die Vorlage ein. Commits sind natürlich eh willkommen!

Viele Grüße
Thomas

1 Like

PS: Man kann natürlich den LDAP-Kram auch weglassen und z.B. CSV-Dateien parsen. Wenn da jemand Hilfe benötigt oder für eine konkrete CSV mal ein Beispiel sehen möchte, einfach schreiben.

Hallo Thomas,

vorab vielen Dank für deine Arbeit.
Mein über Jahre gewachsenes moodle hat natürlich schon eine Kursstruktur und viele meist über Selbsteinschreibung aufgenommene Nutzer.
Lässt sich vorhersagen, wie sich da lml2moodle auswirken würde?

Viele Grüße

Wilfried

Hallo Wilfried,

im derzeitigen Zustand legt es 2 Bereiche an (Schüler und Lehrer, kann man aber ändern) und erzeugt dort Unterbereiche und Klassenkurse.
Alle Nutzer werden angelegt (und ich vermute, bei gleicher UID erzeugt der Aufruf einfach einen Fehler). Beim Einschreiben der Nutzer in die neuen Kurse nutzt das Skript die UID, insofern sollte das dennoch funktionieren.

Da das Skript ja nur anlegt und nichts löscht, wird es vermutlich vor allem Fehler generieren, wenn etwas schon da ist. Andererseits, wenn potentiell Kurse gleich heißen, etc, entsteht evtl. eine halbfertige Struktur. Ich glaube, ich würde da erst einmal Tests abwarten (oder mit Teilen des Skripts vorsichtig anfangen).

Wir haben letztes Schuljahr ein neues Moodle begonnnen, für einen „sauberen Neuanfang“. Theoretisch kann man aber auch mit neuen Kursunterbereichen anfangen und dann bleibt das sauber getrennt.

Viele Grüße
Thomas

Hallo Thomas.
Super – vielen Dank. Ich schaue es mir an und versuche es in unsere Struktur zu integrieren.

Wir hatten das Thema ja neulich schon mal: „Ressourcen bündeln --> gemeinsame Kurse einführen“. Ich weiß nicht, ob das jemand so macht – aber evtl wäre so ein Aufbau klassenübergreifend

Fachschaften 
  |-> Mathematik 
         |-- Thema 1
  |-> Englisch
         |-- Thema 1

genauso gut, da man dann nicht 134623347 Kurs erzeugt?? Das ist bei dir so aber nicht vorgesehen, richtig?

Schöne Grüße,
Michael