supprimer un calendrier importé / erreur Catégorie inconnue d'ID

supprimer un calendrier importé / erreur Catégorie inconnue d'ID

par Anne Parlebas,
Nombre de réponses : 12

Bonjour à tous,

Je viens de mettre à jour Moodle : version 4.4

J'avais (ré)importé un calendrier google (.ics) tout en oubliant qu'il suffisait d'attendre la mise à jour

Me voilà alors avec des doublons

image%20%281%29.png

Comment faire pour supprimer un calendrier importé ?

Je clique sur "Importer ou exporter des calendriers" mais j'arrive sur cette page qui contient une erreur

image%20%282%29.png

Je m'imagine qu'elle devrait a priori lister les calendriers importés et que je devrais pouvoir en supprimer un ici ?
Merci d'avance pour tout éclaircissement

Moyenne des évaluations  -
En réponse à Anne Parlebas

Re: supprimer un calendrier importé / erreur Catégorie inconnue d'ID

par Anne Parlebas,

Pour donner plus d'info :
J'ai mis Moodle en mode debug et voilà ce que donne la page 
calendar/managesubscriptions.php?

image.png

J'aimerais à la place que la liste des calendriers exportés apparaissent pour que je puisse en supprimer un

Est-ce que si je supprime le dernier enregistrement de la table (id:22) le calendrier importé en trop va disparaître ? Le lien pointe en effet vers le même calendrier que l'id 21
image%20%281%29.png

En réponse à Anne Parlebas

Re: supprimer un calendrier importé / erreur Catégorie inconnue d'ID

par Céline Perves,
Avatar Développeurs Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles

Bonjour,

effacer via la base de donnée est toujours très risqué

De ce que je vois dans le code :

Quand on importe un calendrier via un fichier cela

  • ajoute une entrée dans la table event_subscriptions
  • puis des évènements associés à cette subscription sont créé (les évènements 1 à 1) dans la table event avec subscriptionid comme référence
  • => supprimer seulement la ligne de event_subscriptions est inssuffisant
  • A noter que dans le cas d'une importation via une URL une tâche cron passe régulièrement pour récupérer de nouveaux évènements et les ajouter à la table event 

les données du calendrier dépendent donc de deux tables

  • les évènements qui sont la table event ainsi que des évènements associés par répétition (notion de parent d'évènements)
  • les inscriptions aux évènements sont dans la event_subscriptions

D'autres mécanismes sont à prendre en compte lors de la suppression d'un évènement

  • tout ce qui peut être déclenché et avoir un impact sur d'autres plugins (via calendar_event_deleted)
    • rien trouvé dans le coeur Moodle qui se déclencherai mais certains pliugins additionnels pourraient être concernés
  • la suppression de fichiers associés à un évènement
  • les évènements répétés

Une simple suppression en base de donnée peut donc être risquée selon le type d'import et le type d'évènements  importés notamment s'ils sont répétés

J'espère que ceci vous éclairera

Bonne Journée

Céline

Moyenne des évaluations Utile (2)
En réponse à Anne Parlebas

Re: supprimer un calendrier importé / erreur Catégorie inconnue d'ID

par Christian Bocquet,
Avatar Moodleurs particulièrement utiles

Bonjour,

D'après votre copie d'écran de la table event_subscriptions, sur la première ligne id=6, ce calendrier est un calendrier de type category

Est-ce que la catégorie avec categoryid=10 existe encore ? Son URL serait:
votresitemoodle/course/index.php?categoryid=10

Christian

Moyenne des évaluations Utile (2)
En réponse à Christian Bocquet

Re: supprimer un calendrier importé / erreur Catégorie inconnue d'ID

par Anne Parlebas,
Bonjour Christian,
Bien vu !
Peut-être que c'est ce calendrier de type category qui pose problème et empêche d'afficher les calendriers importés ?

En tout cas lorsque je fais ça
monsite/course/index.php?categoryid=10

J'arrive sur cette page : je vois donc que la catégorie n'existe plus

image%20%281%29.png
Et je ne trouve aucun événement associé dans la table mdl_event (merci Céline pour cette info !)
SELECT * FROM `mdl_event` WHERE `subscriptionid` = 6;
=> renvoie vide

Comment supprimer correctement ce calendrier/catégorie bancal ?

Moyenne des évaluations Utile (1)
En réponse à Anne Parlebas

Re: supprimer un calendrier importé / erreur Catégorie inconnue d'ID

par Céline Perves,
Avatar Développeurs Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles
peut être qu'en changeant l'id de category dans mdl_event_subscriptions et dans mdl_event pour les calendriers concernés pourrait arranger le soucis sous réserve qu'il n'y ait pas de fichiers associés à vos évènements de calendrier
les fichiers associés à un évènement semblent associés au contexte de la catégorie qui dans votre cas n'existe plus
Si vous pouvez faite une sauvegarde de votre base de donnée et essayez ceci:
update mdl_event_subscriptions set categoryid= where id=6
update mdl_event set category= where subscriptionid=6 and categoryid=10

on voit qu'il est possible de revenir en arrière en remettant le mauvais id de categorie
 
Une fois ceci fait vous devriez être débloqué sur Moodle et pourrez alors supprimer le calendrier via Moodle
Moyenne des évaluations Utile (1)
En réponse à Anne Parlebas

Re: supprimer un calendrier importé / erreur Catégorie inconnue d'ID

par Christian Bocquet,
Avatar Moodleurs particulièrement utiles

J'ai facilement pu reproduire (moodle version 4.4) le bug sur lequel vous êtes tombée.
J'ai créé une nouvelle catégorie, importé un calendrier attaché à cette catégorie puis supprimé la nouvelle catégorie. Moodle m'indique qu'il va tout supprimer sans possibilité de retour en arrière mais il ne supprime pas le calendrier attaché à cette catégorie, d'où le bug.
Il faudrait voir dans le tracker si ce bug a été signalé...

Christian 

Moyenne des évaluations Utile (2)
En réponse à Christian Bocquet

Re: supprimer un calendrier importé / erreur Catégorie inconnue d'ID

par Anne Parlebas,
Merci à tous les deux ! Le problème est résolu de mon côté !

@Celine : J'ai mis à jour la BDD comme ceci :
update mdl_event_subscriptions set categoryid=0 where id=6

En effet je peux maintenant voir la liste des calendriers importés - magnifique !
Je vais ainsi pouvoir supprimer proprement celui qui pose problème
image.png

@Christian : ça fait un petit temps, mais en effet c'est très probablement quelque chose comme ça que j'avais fait : créer une catégorie / essayer d'importer un calendrier et puis supprimer la catégorie associée me rendant compte que ce n'est pas ça que je voulais faire

A priori ce bug a déjà été signalé ici : https://tracker.moodle.org/browse/MDL-73309
Moyenne des évaluations Utile (2)
En réponse à Anne Parlebas

Re: supprimer un calendrier importé / erreur Catégorie inconnue d'ID

par Christian Bocquet,
Avatar Moodleurs particulièrement utiles

Une autre façon de faire aurait été de recréer la catégorie supprimée d'id 10 dans la table mdl_course_categories, puis purger les caches.

En réponse à Christian Bocquet

Re: supprimer un calendrier importé / erreur Catégorie inconnue d'ID

par Céline Perves,
Avatar Développeurs Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles
surtout pas car il manquerai la liaison dans la table mdl_context, ça pourait casser la plate-forme
En réponse à Céline Perves

Re: supprimer un calendrier importé / erreur Catégorie inconnue d'ID

par Christian Bocquet,
Avatar Moodleurs particulièrement utiles

En purgeant les caches, un nouveau contexte pour la catégorie est enregistré dans la table mdl_context.

En réponse à Christian Bocquet

Re: supprimer un calendrier importé / erreur Catégorie inconnue d'ID

par Céline Perves,
Avatar Développeurs Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles
vraiment?
En réponse à Céline Perves

Re: supprimer un calendrier importé / erreur Catégorie inconnue d'ID

par Céline Perves,
Avatar Développeurs Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles

en effet en 4.4 (lib/classes/context/coursecat.php), bien vu!

Mais bon je ne m'y risquerai pas quand même tant il y a de mécanisme liés aux évènements (event api) et contextes

public static function instance($categoryid, $strictness = MUST_EXIST) {
        global $DB;

        if ($context = context::cache_get(self::LEVEL, $categoryid)) {
            return $context;
        }

        if (!$record = $DB->get_record('context', array('contextlevel' => self::LEVEL, 'instanceid' => $categoryid)) {
            if ($category = $DB->get_record('course_categories', array('id' => $categoryid), 'id,parent', $strictness)) {
                if ($category->parent) {
                    $parentcontext = self::instance($category->parent);
                    $record = context::insert_context_record(self::LEVEL, $category->id, $parentcontext->path);
                } else {
                    $record = context::insert_context_record(self::LEVEL, $category->id, '/'.SYSCONTEXTID, 0);
                }
            }
        }

   [...]
    }

(En 4.1 dans une autre classe)