Moodle: viele globale Gruppen in einem Rutsch löschen?

Hallo.
Wir haben per Script sehr viele globale Gruppen erzeugt und zur Einschreibung verwendet. Beim Löschen dieser Gruppen stellt sich nun heraus, dass man sie scheinbar nur einzeln wieder löschen kann :thinking: :interrobang:

Gibt es dazu irgendeinen Trick, so dass man auch alle Gruppen in einem Rutsch wieder loswerden kann?

Danke für eine gute Idee.
Michael

ich verstehe nicht so ganz wieso du globale Gruppen in großer Zahl löschen willst.
Bei uns werden die moodlenutzer anhand von einem Eintrag im Nutzerprofil (Klasse oder so) per LDAP übertragen wurde automatisch den globalen Gruppen (=Klassen) zugewiesen. Diese Zuweisungsregeln muss man einmal mühsam erstellen (kein Spass), dafür hat man danach Ruhe. Klar müssen die Lehrer dann natürlich die Einschreibung anpassen auf ihre neuen Kurse zu Schuljahresbeginn.

Hallo Michael,

leider geht das nicht. Wenn ich mal Zeit habe, schreibe ich vielleicht ein Plugin dafür. Derzeit hacke ich dazu vorübergehend irgendein Plugin, das einen geplanten Task mitbringt (ich nehme Ldap-Syncing-Scripts, weil das sowieso schon mit den Cohorts arbeitet).

Im Wesentlichen läuft es darauf hinaus, dass man mit:

$cohort = $DB->get_record('cohort', array('idnumber' => $groupname), '*'))

ein Datenbank-Objekt für die Globale Gruppe mit dem Namen „$groupname“ bekommt, das man dann mit:

cohort_delete_cohort($cohort);

löschen kann. Dazu braucht man:

global $CFG;
require_once($CFG->dirroot . '/cohort/lib.php');

Ich schreibe also in die PHP-Datei, die bei dem Task ausgeführt wird, einen Loop über die zu löschenden Gruppen mit den obigen Anweisungen:

global $CFG;
require_once($CFG->dirroot . '/cohort/lib.php');

$groupstodelete = array("gruppe1", "gruppe2", "gruppe3");

foreach ($groupstodelete as $groupname) {

  $cohort = $DB->get_record('cohort', array('idnumber' => $groupname), '*'))
  cohort_delete_cohort($cohort);
}

Nicht gerade schön, aber schnell :slight_smile:

Beste Grüße

Jörg

Hallo.
Also zunächst zu der Frage warum wir so viele globale Gruppen haben … das ist einfach: Wir haben die Oberstufenstruktur damit abgebildet. Es gibt also eine globale Gruppe „Kurs XY (Schuljahr 2021/2022)“ mit den richtigen Schülern darin. Diese Zuordnung ist für das kommende Schuljahr dann natürlich (teilweise) hinfällig und kann gelöscht werden. Die Einschreibung mit globalen Gruppen geht natürlich wesentlich schneller als das einzelne Zusammenklicken der richtigen SuS. Zudem ist die gesamte Struktur für alle Klassen und Kurse zu Schuljahresbeginn direkt fertig („zusätzlicher Service der IT-Abteilung“ :slight_smile: ). Den Nachteil an der Sache sieht man aber jetzt: Das System müllt voll mit veralteten Gruppen die niemand mehr braucht…

Es wäre natürlich sehr viel schöner, wenn im Webinterface einfach eine Mehrfachauswahl möglich wäre und man alle globalen Gruppen, die man nicht mehr benötigt, direkt vor Ort löschen könnte. Weiß jemand, wo man Feature-Requests für Moodle eröffnen kann?

Und zuletzt: Danke für Deinen Vorschlag, Jörg! Ich bin leider noch nicht ganz im Bilde, wo/wie genau Du das einsetzt? Sehe ich das richtig: Du bohrst das Script "local_ldap.php" (aus dem Plugin LDAP syncing scripts) auf und ergänzt die Einträge von oben?

In der moodle-Datenbank kann man ja auch nach „cohort“ suchen … da gibt es die Tabellen „cohort“ und „cohort_members“. Natürlich ist es nicht sonderlich schlau, direkt in der DB herumzupfuschen. Wenn es NUR diese Einträge wären, die zu löschen sind, wäre man sie ja schnell los. Aber vermutlich holt man sich damit ungeahnte Probleme rein, die keiner braucht.

Viele Grüße,
Michael

Hallo Michael,

Dann verbleiben halt alle Referenzen in anderen Tabellen. Das würde ich nicht machen.

Beste Grüße

Jörg

Hallo Jörg,

wo genau finde ich denn die von dir beschriebene PHP-Datei, in die der Code eingefügt werden muss. Habe mich schon durchgegoogelt und gesucht, bin aber nicht wirklich fündig geworden.

Viele Grüße
Alex

Hallo Alex,
ich nehme an, dass es um dieses Plugin geht … aber wo man den o.g. Code einbauen soll bzw was man ansonsten alles deaktivieren muss, weiß ich auch nicht:

Viele Grüße,
Michael

Hallo zusammen,

nun habe ich das Ganze mal in ein Moodle-Plugin gepackt. Es ist abslolut alpha und eher ein Proof-of-Konzept. Globale Gruppen löschen geht aber.

Man entpackt diese Datei:

cohortbulkdelete.zip (6,0 KB)

in den Ordner local in seiner Moodle-Installation (es sollte dann eine Datei local/cohortbulkdelete/settings.php geben). Anschließend meldet man sich als Administrator an und klickt die Installation durch (dabei passiert nicht wirklich etwas).

Zum Verwenden editiert man die Datei local/cohortbulkdelete/config.php. Dort sind zwei PHP-Arrays mit den zu löschenden Globalen Gruppen definiert, man kann entweder die Namen oder die IDs der Globalen Gruppen verwenden. Beide Arrays werden gleichzeitig abgearbeitet. Das Format geht aus dem Beispiel hervor.

Dann ruft man bei den Plugins unter Local Plugins die Einstellungsseite auf, kontrolliert, ob die ausgegebenen Gruppen passen, und drückt auf den roten Knopf.

Wie gesagt funktioniert das bei mir so, ist aber natürlich komplett auf eigenes Risiko und nicht wirklich im Hinblick auf Fehlbedienung etc. getestet.

Für mich ist das aber extrem hilfreich, weil ich nicht weit über hundert Gruppen per Hand löschen will.

Beste Grüße

Jörg

1 „Gefällt mir“

Hallo Jörg,
ich habe das direkt ausprobiert – das Prinzip funktioniert. Super!

Nun wäre es allerdings noch extrem hilfreich, wenn man sich alle bereits existierenden globalen Gruppen kommasepariert auflisten lassen kann. Unter …/moodle/cohort/index.php bekommt man sie zwar angezeigt; aber man kann dort nichts weiter damit machen (kein Export o.ä.).

Du hast bei Dir ja offenbar auch sehr viele globale Gruppen – wie erzeugst Du Dir diese Liste für die config.php?

Vielen Dank und viele Grüße,
Michael

Hallo Michael,

so?

cohortbulkdelete.zip (6,2 KB)

Ich selbst mache das tatsächlich anders. Wir nutzen die Ldap Syncing Scripts, um die Globalen Gruppen mit Projekten in der Schule synchron zu halten. Und in den Sommerferien ersetze ich den Code zum Synchronisieren einfach durch einen Löschbefehl. Dann werden die Projekte in der Schule gelöscht und das Plugin wieder auf den ursprünglichen Code zurückgesetzt. Aber vielleicht nutze ich ja in Zukunft mein Plugin, vor allem, wenn eine zukünftige Version mal mehr Komfort bieten sollte – zur Zeit habe ich dazu aber leider keine Zeit.

Herzliche Grüße

Jörg

Hallo Jörg,

erstmal vielen für die Arbeit, die du da rein gesteckt hast.

Ich habe dein Plugin über die Moodle Weboberfläche im Verzeichnis /var/www/moodle/local installiert. Das lief auch alles problemlos durch.

Wenn ich allerdings den Task ausführen möchte, erhalte ich nur einen HTTP Error 500 und es passiert nichts. Hier vielleicht auch die Frage an Michael, ob du die Installation genauso wie ich vorgenommen hast. Muss in der deletecohorts.php noch etwas angepasst werden?

Viele Grüße
Alex

Hallo nochmal.
Ein Error 500 könnte auch daher kommen, dass Du die User-Rechte der Files nicht entsprechend angepasst hast, oder?

Hier funktioniert die neue Version. Alle globalen Gruppen werden jetzt gelistet! Super Sache und weniger Handarbeit! Danke, Jörg!

Bei mir gibt es übrigens keinen Unterschied zwischen cohortstodeleteidnumbers und cohortstodeletenames – die Einträge sind in beiden Zeilen identisch. Bei Dir nicht?

Nachtrag:
Hoppla – zu früh gefreut. Gerade habe ich es ausprobiert und zum Testen diese config.php mit nur einem Eintrag verwendet:

$cohortstodeleteidnumbers = array("Fachlehrer_7c_2021");
$cohortstodeletenames = array("Fachlehrer_7c_2021");

Der rote Button „Jetzt löschen“ wird zwar angezeigt, aber wenn man ihn betätigt, lande ich hier auf einer weißen Seite, auf der nichts weiter geschieht. Ein Reload hat die Gruppe dann aber nicht entfernt. Sie ist weiterhin im System. Etwas stimmt also leider doch noch nicht ganz.

Hallo Michael, hallo Alex,

es freut mich, wenn es hilft.

Eine Globale Gruppe muss einen Namen und kann eine ID haben. ID und Name können, müssen aber nicht identisch sein. Es hängt davon ab, wie die Gruppen angelegt werden.

Dabei fällt mir auf, dass für den Fall, dass eine Gruppe keine ID hat, die ausgegebene Liste nicht passt. Vielleicht ist es doch besser, es erst einmal mit den Namen zu versuchen.

Zu dem Fehler 500 kann ich leider nichts sagen. Tritt er schon bei der Plugin-Seite auf oder erst, wenn Du auf Löschen drückst?

Beste Grüße

Jörg

Die User-Rechte habe ich in der Tat nicht extra angepasst. Allerdings habe ich dem Ordner und den Dateien nun alle Rechte gegeben und es hat bislang nichts bewirkt. Wie hast du die Rechte denn genau angepasst?

Bei mir gibt es den Unterschied zwischen den idnumbers und den names auch nicht.

@Michael Wie sieht denn deine „weiße Seite“ aus? Vielleicht haben wir einen ähnlichen Fehler.

@jrichter Der Fehler tritt erst auf, wenn man auf Löschen klickt. Bis dahin wird alles einwandfrei angezeigt.

Viele Grüße
Alex

Hallo.
Es stimmt, was Alex sagt … Chrome meldet auch hier einen Error 500. Firefox scheint das zu ignorieren. Da ist die Seite wirklich komplett weiß und es steht auch nichts im Header o.ä.
Jedenfalls sagt die Logdatei des Webservers lediglich:

500 GET /moodle/local/cohortbulkdelete/deletecohorts.php HTTP/1.1

Einen anderen Browser habe ich bislang noch nicht bemüht. Mit Firefox erhalte ich genau wie du keine Errorpage mehr.
Allerdings werden die von mir in die config.php geschriebenen Gruppen leider auch mit Firefox nicht gelöscht.

Ich weiß nicht, ob das irgendwie weiterhilft, aber wenn man das PHP-Script direkt auf der Konsole startet, erscheint bei mir:

[.../moodle/local/cohortbulkdelete]$ php7.2 deletecohorts.php
Command line scripts must define CLI_SCRIPT before requiring config.php

Ich habe daher mal folgendes geändert:

Jetzt hat sich die Fehlermeldung geändert und es erscheint:

 php deletecohorts.php 

PHP Notice:  Undefined variable: CFG in /var/www/vhosts/meine-domain.de/httpdocs/moodle/local/cohortbulkdelete/deletecohorts.php on line 31
PHP Notice:  Trying to get property 'dirroot' of non-object in /var/www/vhosts/meine-domain.de/httpdocs/moodle/local/cohortbulkdelete/deletecohorts.php on line 31
PHP Warning:  require(/local/cohortdelete/config.php): failed to open stream: No such file or directory in /var/www/vhosts/meine-domain.de/httpdocs/moodle/local/cohortbulkdelete/deletecohorts.php on line 31
PHP Warning:  require(/local/cohortdelete/config.php): failed to open stream: No such file or directory in /var/www/vhosts/meine-domain.de/httpdocs/moodle/local/cohortbulkdelete/deletecohorts.php on line 31
PHP Fatal error:  require(): Failed opening required '/local/cohortdelete/config.php' (include_path='.:/usr/share/php') in /var/www/vhosts/meine-domain.de/httpdocs/moodle/local/cohortbulkdelete/deletecohorts.php on line 31

@jrichter, noch eine Idee, woran das jetzt noch scheitern könnte?

Hmm, gute Überlegung. Ich habe es auch mal bei mir so umgesetzt und herausgefunden, dass die Fehlermeldungen verschwinden, wenn man

> define('CLI_SCRIPT', true);
> require_once(dirname(__FILE__) . '/config.php');

in die deletecohorts.php hinzufügt. Im define-Befehl müsste allerdings false stehen, wenn man das Plugin über die Moodle-Oberfläche ausführen möchte.

Leider bewirkt es immer noch keine Lösung der globalen Gruppen. Nun erhalte ich nach dem Klicken auf „Jetzt löschen“ einfach eine weiße Seite ohne Inhalt.

Hallo Alex,

sorry, da war noch ein falscher Pfad übrig geblieben. Ist hier korrigiert:

cohortbulkdelete-0-0-3.zip (6,2 KB)

Mich wundert nur, dass es bei Michael lief.

Dass ein Server-Error vom Browser abhängt, kann eigentlich nur an Cookies oder Session-Keys oder so etwas liegen.

In der Datei deletecohorts.php ist jetzt die CLI-Option vorgesehen, man muss nur die Zeile aktivieren. Bei mir lief es auch als CLI-Skript.

Michael, Deine Fehlermeldungen könnten daher kommen, dass bei Dir entweder in der globalen config.php die Variable dirroot nicht passt oder Du einen abweichenden Installationsort hast. Aus Sicht von deletecohorts.php muss die globale Konfiguration unter …/…/config.php liegen.

Viele Grüße

Jörg