On suit toutes les étapes expliquées ici :
https://moodle.gymnasedebeaulieu.ch/admin/category.php?category=webservicesettings
https://moodle.gymnasedebeaulieu.ch/admin/roles/manage.php
Le rôle webservice doit avoir les capabilités :
- moodle/course:viewhiddencourses pour pouvoir lister les cours cachés et obtenir leur id pour pouvoir les supprimer
- moodle/course:view pour pouvoir supprimer des cours dont l'utilisateur webservice n'est pas membre
- moodle/cohort:view pour voir les cohortes
- moodle/cohort:create pour créer les cohortes
- moodle/cohort:manage pour supprimer les cohortes
- moodle/user:viewdetails + moodle/site:viewuseridentity pour pouvoir récupérer les informations des élèves
Afin de pouvoir récupérer les emails des utilisateurs existants dans moodle, il faut que le champ "email" soit coché dans la section "Afficher l'identité de l'utilisateur" de cette page
https://moodle.gymnasedebeaulieu.ch/admin/settings.php?section=userpolicies
Cet utilisateur doit avoir la méthode d'authentification "comptes manuels" (on doit donc inventer un mot de passe)
On est forcé d'assigner une adresse email unique à cet utilisateur technique (on l'invente)
Assigner le rôle webservice role à cet utilisateur en utilisant
https://moodle.gymnasedebeaulieu.ch/admin/roles/assign.php?contextid=1
https://moodle.gymnasedebeaulieu.ch/admin/settings.php?section=externalservices
Avec les fonctions dont on a besoin:
-
core_cohort_create_cohorts
-
core_cohort_delete_cohorts
-
core_cohort_get_cohort_members
-
core_cohort_search_cohorts
-
core_course_delete_courses
-
core_course_get_categories
-
core_course_get_courses_by_field
-
core_course_search_courses
-
core_user_get_users_by_field`
Avec webservice user comme seul utilisateur autorisé
Générer un jeton pour l'utilisateur webservice_user.
https://moodle.gymnasedebeaulieu.ch/admin/webservice/tokens.php
-
Cliquer sur le bouton "Créer jeton"
- Utilisateur : webservice user
- Service : admin_api
- Valide jusqu'au : un an plus tard
-
Le jeton est affiché (et ne le sera plus jamais). Copier la valeur du jeton.
Exporter une variable d'environnement TOKEN avec la valeur de ce jeton.
Il est aussi possible de créer un fichier .env avec une ligne TOKEN=la valeur du jeton. Ce fichier sera automatiquement lu par le programme au démarrage
Note : Le script supprime aussi les backups de cours. Supprimer les cours à la main fait la même chose.
-
Aller sur la page https://moodle.gymnasedebeaulieu.ch/course/management.php pour trouver l'id de la catégorie de cours à supprimer (le script supprime récursivement tous les cours dans cette catégorie et ses sous-catégories)
-
Lancer le script en passant l'id de la catégorie à supprimer en paramètre
-
Le script liste les cours qui vont être supprimés. Confirmer la suppression. Le script tourne pendant plus d'une heure et affiche une barre de progression. En juillet 2023 le script a pris 1h20, l'utilisation disque est passée de 139GB a 51GB.
-
Vérifier dans Moodle que la catégorie et les sous-catégories ne contiennent plus de cours
-
Supprimer manuellement les catégories (choisir supprimer les sous-catégories)
Documentation automatique générée par notre instance https://moodle.gymnasedebeaulieu.ch/admin/webservice/documentation.php
Quand on se trompe de nom de fonction webservice on obtient une erreur très bas niveau:
'exception': 'dml_missing_record_exception', 'errorcode': 'invalidrecord',
'message': "Can't find data record in database table external_functions."
On obtient une accessexception si on a soit oublié d'ajouter la permission, soit oublié d'ajouter la fonction
En utilisant le code source de Moodle sur github:
- En cherchant sa définition . Par exemple : https://github.com/search?q=repo%3Amoodle%2Fmoodle%20core_cohort_create_cohorts&type=code
- Puis en suivant les infos, ici : https://github.com/moodle/moodle/blob/main/cohort/externallib.php#L84
En réglant les messages de déboggage à "Normal":
https://moodle.gymnasedebeaulieu.ch/admin/settings.php?section=debugging
on obtient un champ supplémentaire "debuginfo" dans les exceptions
On passe des contextes un peu partout aux fonctions webservice. Voici une doc qui aide à comprendre :
https://docs.moodle.org/404/en/Context
On trouve aussi les noms à utiliser dans l'API dans le code source de Moodle : moodle/lib/classes/context/