Une réponse qui ne concerne pas le "sac à badges", mais qui permet de supprimer un badge spécifique à un utilisateur spécifique à l'intérieur de Moodle. Je ne vois qu'un moyen de le faire, c'est en bricolant directement dans la base de données. La difficulté, c'est qu'on a une réaction en chaîne : supprimer le badge ne sert à rien si on ne supprime pas les critères atteints qui ont permis de l'obtenir, ce qui ne sert à rien non plus si on n'a pas supprimé les actions qui ont permis d'atteindre ces critères. Au prochain cron, le badge serait à nouveau créé.
Voici l'ensemble des lignes qui permettent d'aboutir au résultat voulu, même lorsque l'obtention du badge est liée à la réussite d'un quiz, ou à la combinaison de plusieurs actions. Les lignes 3, 4 et 5 ne sont pas liées directement à la suppression du badge, mais elles permettent d'être plus "propre" : puisqu'on a éventuellement supprimé des tentatives de quiz, il est plus cohérent de supprimer aussi les tentatives de réponses qui correspondent.
Pour éviter des problèmes d'homonymie, je ne prends pas le nom de l'étudiant, mais le nom d'utilisateur, qui lui est unique. On peut le connaître en cliquant sur son profil, puis sur "modifier mon profil".
Je ne suis pas spécialiste de SQL, et quelqu'un qui connaît mieux que moi la syntaxe peut sans aucun doute faire plus sobre. Mais ça marche (testé sous Moodle 2.8). Malgré tout, comme à chaque fois qu'on bricole directement dans la base de données, la précaution d'usage s'impose: sauvegarde préalable obligatoire.
Pour reprendre la comparaison de Stefane avec un sportif dopé, on suppose donc un étudiant dont le nom d'utilisateur est "escroc", et un badge intitulé "champion"...
DELETE FROM `quiz_grades` WHERE (`userid`=(SELECT `id` FROM `user` WHERE `username`="escroc") AND `quiz` IN (SELECT `instance` FROM `course_modules` WHERE (`id` IN (SELECT `value` FROM `badge_criteria_param` WHERE (`critid` IN (SELECT `id` FROM `badge_criteria` WHERE `badgeid`=(SELECT `id` FROM `badge` WHERE `name`="champion")))))));
DELETE FROM `quiz_attempts` WHERE (`userid`=(SELECT `id` FROM `user` WHERE `username`="escroc") AND `quiz` IN (SELECT `instance` FROM `course_modules` WHERE (`id` IN (SELECT `value` FROM `badge_criteria_param` WHERE (`critid` IN (SELECT `id` FROM `badge_criteria` WHERE `badgeid`=(SELECT `id` FROM `badge` WHERE `name`="champion")))))));
DELETE FROM `question_attempts` WHERE `questionusageid` NOT IN (SELECT `uniqueid` FROM `quiz_attempts`);
DELETE FROM `question_attempt_steps` WHERE `questionattemptid` NOT IN (SELECT `id` FROM `question_attempts`);
DELETE FROM `question_attempt_step_data` WHERE `attemptstepid` NOT IN (SELECT `id` FROM `question_attempt_steps`);
DELETE FROM `course_modules_completion` WHERE (`userid`=(SELECT `id` FROM `user` WHERE `username`="escroc") AND `coursemoduleid` IN (SELECT `value` FROM `badge_criteria_param` WHERE (`critid` IN (SELECT `id` FROM `badge_criteria` WHERE `badgeid`=(SELECT `id` FROM `badge` WHERE `name`="champion")))));
DELETE FROM `badge_criteria_met` WHERE (`userid`=(SELECT `id` FROM `user` WHERE `username`="escroc") AND `critid` IN (SELECT `id` FROM `badge_criteria` WHERE `badgeid`=(SELECT `id` FROM `badge` WHERE `name`="champion")));
DELETE FROM `badge_issued` WHERE (`userid`=(SELECT `id` FROM `user` WHERE `username`="escroc") AND `badgeid`=(SELECT `id` FROM `badge` WHERE `name`="champion"));