Re-bonjour,
Et comme il peut être pénible et compliqué de vérifier manuellement ces différents éléments (surtout si vous gérez plusieurs plateformes), voici quelques
requêtes SQL qui pourront permettre d'effectuer facilement certaines vérifications. Ces
requêtes sont à lancer par exemple grâce au
plugin Moodle Adminer.
Pour trouver les rôles qui sont définis comme attribuables sur des catégories :
SELECT r.id, r.name, r.shortname
FROM mdl_role r, mdl_role_context_levels rcl
WHERE rcl.roleid = r.id
AND rcl.contextlevel = '40';
Pour trouver les rôles ayant défini des droits sur la capacité de synchronisation des inscriptions par catégorie ("permission" doit être à 1 pour que cela puisse fonctionner) :
SELECT r.id, r.name, r.shortname, rc.contextid, rc.permission, FROM_UNIXTIME(rc.timemodified) AS Modifié, rc.modifierid
FROM mdl_role r, mdl_role_capabilities rc
WHERE rc.roleid = r.id
AND rc.capability = 'enrol/category:synchronised'
ORDER By Modifié;
Si des rôles issus de la première requête n’apparaissent pas dans la deuxième, cela ne fonctionnera pas correctement pour eux. Il faut donc ajouter les droits sur cette capacité pour les rôles manquants.
Par ailleurs, il sera nécessaire que la tâche planifiée de
"Synchronisation des inscriptions de catégorie" soit lancée après
l'attribution du rôle sur la catégorie afin que les utilisateurs
inscrits sur une catégorie se retrouvent correctement inscrits aux cours
!
Pour trouver les dernières exécutions de la tâche de synchronisation des inscriptions par catégorie (ordre chronologique inversé) :
SELECT FROM_UNIXTIME(timestart), FROM_UNIXTIME(timeend)
FROM mdl_task_log
WHERE component = 'enrol_category' AND classname = 'enrol_category\\task\\enrol_category_sync'
ORDER BY id DESC
LIMIT 10;
Si cette requête ne renvoi pas de résultat en adéquation, il faut
vérifier si cette tâche est bien programmée et si le cron est bien actif
!
Il reste éventuellement possible de la lancer manuellement si on ne
souhaite pas lancer la totalité du cron (sur une plateforme de test par
exemple).
Pour trouver les personnes ayant des rôles attribués sur des catégories :
SELECT
cc.id, cc.name AS Catégorie, cc.depth, cc.path,
r.name AS rôle, r.shortname,
u.lastname AS Nom, u.firstname AS Prénom, u.username, u.email
FROM mdl_course_categories cc
JOIN mdl_context cx ON cc.id = cx.instanceid AND cx.contextlevel = '40'
JOIN mdl_role_assignments ra ON cx.id = ra.contextid
JOIN mdl_role r ON ra.roleid = r.id
JOIN mdl_user u ON ra.userid = u.id
WHERE 1=1
ORDER BY cc.depth, cc.path, u.lastname, u.firstname, r.name, cc.name;
Cette requête, adaptée en rapport utilisable avec le plugin "Rapports personnalisés", intégrant des liens :
SELECT
concat('<a target="_new" href="%%WWWROOT%%/course/category.php?id=',cc.id,'">',cc.id,'</a>') AS id,
concat('<a target="_new" href="%%WWWROOT%%/course/category.php?id=',cc.id,'">',cc.name,'</a>') AS Catégorie,
cc.depth, cc.path, r.name AS rôle, r.shortname,
concat('<a target="_new" href="%%WWWROOT%%/user/view.php?id=',u.id,'">',u.lastname,'</a>') AS Nom,
u.firstname AS Prénom, u.username, u.email
FROM prefix_course_categories cc
INNER JOIN prefix_context cx ON cc.id = cx.instanceid AND cx.contextlevel = '40'
INNER JOIN prefix_role_assignments ra ON cx.id = ra.contextid
INNER JOIN prefix_role r ON ra.roleid = r.id
INNER JOIN prefix_user u ON ra.userid = u.id
WHERE 1=1
-- AND r.id !=5 -- Décommenter cette ligne pour ne pas sélectionner le rôle étudiant
ORDER BY cc.depth, cc.path, u.lastname, u.firstname, r.name, cc.name
Voila, j'espère que ces éléments vous permettront d'éviter les soucis avec les inscriptions sur les catégories.
Séverin