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

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

Hallo zusammen,

OK, nochmal ein wenig aufpoliert: cohortbulkdelete-0-0-4.zip (8,5 KB)

Insbesondere gibt es jetzt eigene CLI-Skripte. Wichtig ist, dass man sie aus dem Ordner cli aufruft, also sowas wie:

cd /var/www/moodle/local/cohortbulkdelete/cli
php listcohorts-cli.php
vi ../config.php
php deletecohorts-cli.php

Hoffentlich klappt es jetzt so.

LG Jörg

Hi.
Jetzt sieht’s gut aus … ich erhalte die zu erwartende Meldung

# Bulk delete cohorts
Trying to delete cohorts by id-number: Fachlehrer_7c_2021
Deleting cohort Fachlehrer_7c_2021 ... done
Trying to delete cohorts by name: Fachlehrer_7c_2021
No matching cohort for Fachlehrer_7c_2021

@jrichter – wow – du produzierst schneller neue Versionen als ich sie testen kann :slight_smile:
Wenn wir schon dabei sind: Wäre es viel Aufwand,wenn man aus der Liste eine Auswahl machen kann? Also konkret:
Zu löschende globale Gruppen:

[x] Gruppe1
[ ] Gruppe-will-ich-noch-haben
[x] Gruppe 3
(o) alle auswählen / nichts auswählen 

die dann in die config.php übernommen wird? Ist Luxus aber würde die Sache natürlich weiter vereinfachen…

Übrigens gerade noch ein Test: Ich hatte eine Klasse, in die die globale Gruppe „Klasse_7c_Fachlehrer_2021“ eingeschrieben war. Wenn man diese Gruppe mit Deinem Script löscht, erscheint die Gruppe auch nicht mehr bei den Einschreibemethoden zum entsprechenden Kurs. Die User der soeben gelöschten globalen Gruppe sind aber weiterhin einzeln in den Kurs eingeschrieben! Es scheint also wunderbar zu funktionieren, so dass ich das als nächstes auf alle Gruppen loslassen werde, die ich loswerden will.

Nachtrag: Auch das lief durch – aus über 300 globalen Gruppen sind jetzt wieder übersichtliche 60 geworden. Natürlich nur, bis ich die neuen Gruppen für das kommende Schuljahr importiert habe…

Ich markiere Version 0.0.4 als Lösung, ok!?
Besten Dank nochmal und viele Grüße,
Michael

Hallo Michael,

schön, dass es läuft. Und hätte ich gründlicher getestet, hätte es weniger Versionen bedurft :wink:

Das:

[x] Gruppe1
[ ] Gruppe-will-ich-noch-haben
[x] Gruppe 3
(o) alle auswählen / nichts auswählen 

ist natürlich das Ziel, auch ein sinnvoller Filter. Und ich habe noch ein paar andere Ideen, wie man das sinnvoller gestalten kann. Da brauche ich aber eine Weile, und in nächster Zeit wird das leider nichts. Vielleicht zu den nächsten Sommerferien!

Das eigentliche Löschen macht nicht mein Plugin, es ruft dazu dieselbe Funktion auf, die von der Einstellungsseite der Globalen Gruppen verwendet wird. Da werden zusätzlich die anderen Komponenten informiert, dass die Gruppe gelöscht wurde, und die reagieren darauf. Deshalb passt das auch mit den Einschreibemethoden – und deshalb kann man auch nicht einfach die Gruppe aus der Datenbank löschen.

Beste Grüße

Jörg

Hallo Jörg,

mit der Version 0.0.4 funktioniert es bei mir auch reibungslos. Vielen Dank nochmal für deine Entwicklungsarbeit und auch an Michael fürs Mitprobieren.

Wir setzen gerade einen Moodle-Server an unserer Schule auf und ich ertrage es sonst nicht, überflüssige Gruppen im System zu haben.

Viele Grüße
Alex

Hallo.
Ich pushe diesen Beitrag nochmal nach oben – und zwar mit der Frage, ob es mit dem Plugin cohortbulkdelete evtl auch möglich ist, sich gleich mit anzeigen zu lassen, wo oder ob eine globale Gruppe überhaupt noch eingeschrieben ist?

Ich habe hier das Problem, dass es noch viele globale Gruppen aus dem Jahr 2022 gibt. Einige (aber nicht alle) sind offenbar noch in Gebrauch (eingeschrieben), während viele andere zwar noch existieren aber gar nicht mehr verwendet werden (also nirgendwo eingeschrieben sind).

Natürlich will ich die nicht alle einzeln nachsehen. Daher liegt die Frage ja ganz nahe: Wäre es nicht großartig, wenn das Plugin das gleich mit anzeigen könnte?

Viele Grüße,
Michael

Hallo Michael,

das wäre in der Tat sinnvoll. Diese Information steht aber nicht bei den Globalen Gruppen in der Datenbank, sondern bei den Kursen - man müsste also alle Kurse durchgehen und Buch führen.

Sicherlich lösbar, aber so schnell komme ich leider nicht dazu - sorry. Aber es ist ja alles Open Source … :wink:

Beste Grüße

Jörg