Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Bruno Malaval,
Nombre de réponses : 16
Avatar Moodleurs particulièrement utiles

Salut Séverin,

Je n'ai pas de requête toute faite pour ça.
Par contre, je bosse actuellement sur les liens entre les devoirs et les fichiers déposés par les étudiants.
Nous avons quelques soucis avec les conversions unoconv qui ne donnent pas toujours de résultat.

J'ai donc un embryon de diagrame sur les devoirs, si cela peut t'aider à retrouver des éléments.

C'est un format "dia", je le mets en pièce jointe

Bruno

En réponse à Bruno Malaval

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs
Salut Bruno,

Sinon, il y a aussi l'outil Examulator, et le détail pour les Devoirs.

Séverin
En réponse à Séverin Terrier

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Bruno Malaval,
Avatar Moodleurs particulièrement utiles
Sinon j'ai ceci :

SELECT *
FROM mdl_files as f JOIN mdl_context as c ON c.id = f.contextid WHERE c.instanceid = 61499 AND c.contextlevel = 70

61499 = id du contexte du devoir (provenant de l'url du devoir https://mon.moodle/mod/assigne/view.php?id=61499)

Cela liste les entrées de la table mdl_files associées à ce devoir
Donc cela comprend également les devoirs déposés par les étudiants

Il faut ensuite trier selon le champ "filearea" de la table mdl_files

Bruno
En réponse à Bruno Malaval

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Christian Bocquet,
Avatar Moodleurs particulièrement utiles

Bonsoir,

Requête à tester pour obtenir la liste des devoirs qui ont au moins un fichier attaché à l'introduction :

SELECT a.id,a.name AS Devoir,cm.id AS cmid,c.id AS contextid, f.filename AS Fichier
FROM mdl_context AS c
JOIN mdl_course_modules AS cm ON c.instanceid = cm.id
JOIN mdl_files AS f ON f.contextid = c.id
JOIN mdl_assign AS a ON a.id = cm.instance
WHERE f.component = 'mod_assign' AND f.filearea = 'introattachment' AND f.source IS NOT NULL
En réponse à Christian Bocquet

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs
Bonjour,

Merci Bruno et Christian pour vos pistes. C'est exactement sur ce genre d'éléments que j'étais effectivement tombé hier, après quelques recherches et requêtes.

Il faut que j'approfondisse et affine tout ça, et je reviendrai poster les résultats.

Séverin
En réponse à Séverin Terrier

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Re-bonjour,

Voila la requête que j'ai écrite, à utiliser avec le plugin Requêtes personnalisées, qui est une extension de celle qui listait les devoirs des cours.

SELECT DISTINCT
    c.id       AS 'ID Cours'
  , c.visible  AS 'Ouvert'
  , c.idnumber
  , CONCAT('<a target="_new" href="%%WWWROOT%%/course/view.php?id=',c.id,'">',c.fullname,'</a>') AS 'Nom du cours'
  , CONCAT('<a target="_new" href="%%WWWROOT%%/mod/assign/view.php?id=',cm.id,'">',a.name,'</a>') AS 'Nom du devoir'
  , cm.visible AS 'Visible' , IF (a.allowsubmissionsfromdate= 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.allowsubmissionsfromdate), '%Y-%m-%d %H:%i' )) AS 'Date ouverture'
  , IF (a.duedate    = 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.duedate)   , '%Y-%m-%d %H:%i' )) AS 'Date de rendu'
  , IF (a.cutoffdate = 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.cutoffdate), '%Y-%m-%d %H:%i' )) AS 'Date limite'
  , a.id                             AS 'ID Devoir'
  , f.filename                       AS 'Fichier consigne'
  , FORMAT ( (f.filesize / 1024), 2) AS 'Taille Ko'
  , FROM_UNIXTIME(f.timecreated)     AS 'Créé'
  , FROM_UNIXTIME(f.timemodified)    AS 'Modifié'
  , f.itemid
  , f.filepath
FROM   prefix_course_modules AS cm
  JOIN prefix_modules        AS m   ON m.id           = cm.module
  JOIN prefix_course         AS c   ON c.id           = cm.course
  JOIN prefix_assign         AS a   ON a.id           = cm.instance
  JOIN prefix_context        AS ctx ON ctx.instanceid = cm.id
LEFT JOIN prefix_files       AS f   ON f.contextid    = ctx.id AND f.component = 'mod_assign' AND f.filearea = 'introattachment' AND filename != '.'
WHERE m.name = 'assign'


Par contre, j'ai un souci :
Pour la table des fichiers (files), si je laisse un JOIN simple, je n'affiche que les devoirs ayant un fichier attaché dans sa description.
Et si je met LEFT JOIN, j'ai du coup plusieurs lignes pour les devoirs ayant un fichier attaché.

Je ne sais pas trop comment faire pour lister tous les devoirs, mais éviter les lignes en doublon.

Séverin

En réponse à Séverin Terrier

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Christian Bocquet,
Avatar Moodleurs particulièrement utiles

Bonsoir,

En utilisant SQL GROUP_CONCAT() ..... GROUP BY

SELECT DISTINCT 
    c.id AS 'ID Cours',
    c.fullname AS 'Nom du cours',
    a.name AS 'Nom du devoir',
    a.id AS 'ID Devoir',
    GROUP_CONCAT( f.filename ) AS 'Fichiers',
    GROUP_CONCAT( f.filesize ) AS 'Taille'
FROM   mdl_course_modules AS cm
  JOIN mdl_modules        AS m   ON m.id           = cm.module
  JOIN mdl_course         AS c   ON c.id           = cm.course
  JOIN mdl_assign         AS a   ON a.id           = cm.instance
  JOIN mdl_context        AS ctx ON ctx.instanceid = cm.id
LEFT JOIN mdl_files       AS f   ON f.contextid    = ctx.id AND
f.component = 'mod_assign' AND f.filearea = 'introattachment' AND
filename != '.'
WHERE m.name = 'assign'
GROUP BY a.id


Christian

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

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs
Bonjour Christian,

Merci encore pour cette fonction. C'est une très bonne idée. Le pire est que je l'avais utilisée une fois, il y a longtemps, mais n'y ait plus pensé...

Par contre, autant ta requête fonctionne correctement lorsque je la lance telle qu'elle en direct dans MySql, autant lorsque j'essaie d'intégrer cela dans l'outil de requêtes personnalisables, j'obtiens un message d'erreur :
"FUNCTION MaBase.GROUP_CONCAT does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual"
Je ne comprends pas pourquoi il refuse d'utiliser cette fonction...

Séverin
En réponse à Séverin Terrier

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Christian Bocquet,
Avatar Moodleurs particulièrement utiles

En utilisant "Rapports personnalisés" (customsql) et la requête :

SELECT DISTINCT 
    c.id AS 'ID Cours',
    c.fullname AS 'Nom du cours',
    a.name AS 'Nom du devoir',
    a.id AS 'ID Devoir',
    GROUP_CONCAT( f.filename ) AS 'Fichiers',
    GROUP_CONCAT( f.filesize ) AS 'Taille'
FROM   {course_modules} AS cm
  JOIN {modules}        AS m   ON m.id           = cm.module
  JOIN {course}        AS c   ON c.id           = cm.course
  JOIN {assign}         AS a   ON a.id           = cm.instance
  JOIN {context}       AS ctx ON ctx.instanceid = cm.id
LEFT JOIN {files}       AS f   ON f.contextid    = ctx.id AND
f.component = 'mod_assign' AND f.filearea = 'introattachment' AND filename != '.'
WHERE m.name = 'assign'
GROUP BY a.id

la fonction GROUP_CONCAT() n'a pas été bloquée et j'ai obtenu le rapport.

Christian

En réponse à Christian Bocquet

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Bruno Malaval,
Avatar Moodleurs particulièrement utiles
Hello,

Idem de mon coté, je peux lancer la requête directement dans l'interface phpMyAdmin ou rapports personnalisés
Mais sur mon ancienne plateforme (moodle 3.8), pas la nouvelle car nous sommes passés sur Postgres
et là, la fonction n'est pas disponible

Ci-dessous, 2 liens qui traitent de cette fonction, visiblement pas implémentée partout
Sur le 2ème lien, ils est question de remplacer par STRING_AGG ..

https://sql.sh/fonctions/group_concat
https://stackoverflow.com/questions/41298741/function-not-found-group-concat

Peut-être un problème de librairies, de configuration MySQL entre les modes "Standard" et "Legacy" .. (cf 2ème lien)

Bruno
En réponse à Bruno Malaval

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs
Bonjour,

Merci encore pour votre aide.

Bruno : les indications du second lien sont liées à des éléments spécifiques à Google.

Christian : en fait, si je copie directement ta requête, elle fonctionne correctement, que ce soit en direct, ou bien avec les plugins customsql ou configurable_reports.

Par contre, ça bloque quand j'essaie d'avoir des éléments plus évolués, avec des fonctions, ou la "construction" de chaînes plus élaborées permettant de créer des liens vers les éléments... mais je n'ai pas encore cerné exactement ce qui pose problème.

C'est un peu pénible de perdre du temps bêtement sur ces aspects là... mais il est vrai que les liens directs sont très utiles lors de l'exploitation !

Séverin
En réponse à Séverin Terrier

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Bruno Malaval,
Avatar Moodleurs particulièrement utiles
C'était une piste possible ... 😉

J'ai cherché pour Postgres, la requête m'intéresse vu que je travaille sur le dépôt de devoir
je pense avoir trouvé la solution, avec quelques différences :

SELECT DISTINCT
    c.id AS "ID Cours",
    c.fullname AS "Nom du cours",
    a.name AS "Nom du devoir",
    a.id AS "ID Devoir",
    STRING_AGG( f.filename , ',') AS "Fichiers",
    STRING_AGG( f.filesize::character , ',') AS "Taille"
FROM   mdl_course_modules AS cm
  JOIN mdl_modules        AS m   ON m.id           = cm.module
  JOIN mdl_course         AS c   ON c.id           = cm.course
  JOIN mdl_assign         AS a   ON a.id           = cm.instance
  JOIN mdl_context        AS ctx ON ctx.instanceid = cm.id
LEFT JOIN mdl_files       AS f   ON f.contextid    = ctx.id AND
f.component = 'mod_assign' AND f.filearea = 'introattachment' AND
filename != '.'
WHERE m.name = 'assign'
GROUP BY a.id , c.id
Différences :
  • Utiliser STRING_AGG au lieu de GROUP_CONCAT
  • STRING_AGG fonctionne avec des chaînes de caractères, donc nécessiter de convertir dans la 2ème fonction ( ::character )
  • Nécessiter de groupe les résultats sur c.id également

Bruno
Moyenne des évaluations Utile (1)
En réponse à Bruno Malaval

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs
Effectivement, en utilisant Postgres, il y a quelques fonctions à remplacer. Merci de les expliquer pour ceux que cela intéressera(it) sourire

Séverin
En réponse à Séverin Terrier

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Christian Bocquet,
Avatar Moodleurs particulièrement utiles

Bonsoir Séverin,

J'ai fait un copier-coller de tes premières lignes 2 à 13 :
     c.id   AS 'ID Cours'
     .........
    , a.id  AS 'ID Devoir'

et cela fonctionne en obtenant les liens vers les cours ou les devoirs. Cette fois j'ai mis la requête dans le bloc configurable_reports.

En réponse à Christian Bocquet

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs
Bonsoir,

Merci encore à vous deux. J'ai enfin réalisé ce que je voulais, avec un peu d'acharnement...

Du coup, ma requête complète (pour MySQL / MariaDB) est celle-ci (utilisée avec configurable_reports) :

SELECT DISTINCT 
c.id AS 'ID Cours'
, c.visible AS 'Ouvert'
, c.idnumber
, CONCAT('<a target="_new" href="%%WWWROOT%%/course/view.php?id=',c.id,'">',c.fullname,'</a>') AS 'Nom du cours'
, CONCAT('<a target="_new" href="%%WWWROOT%%/mod/assign/view.php?id=',cm.id,'">',a.name,'</a>') AS 'Nom du devoir'
, CONCAT('<a target="_new" href="%%WWWROOT%%/course/modedit.php?up','date=',cm.id,'">Modifier</a>') AS 'Modifier'
, cm.visible AS 'Visible'
, IF (a.allowsubmissionsfromdate= 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.allowsubmissionsfromdate), '%Y-%m-%d %H:%i' )) AS 'Date ouverture'
, IF (a.duedate = 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.duedate) , '%Y-%m-%d %H:%i' )) AS 'Date de rendu'
, IF (a.cutoffdate = 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.cutoffdate), '%Y-%m-%d %H:%i' )) AS 'Date limite'
, a.id AS 'ID Devoir'
, GROUP_CONCAT( f.filename ) AS 'Fichiers'
, GROUP_CONCAT( f.filesize ) AS 'Taille'
, FROM_UNIXTIME(GROUP_CONCAT(f.timecreated)) AS 'Créé'
, FROM_UNIXTIME(GROUP_CONCAT(f.timemodified)) AS 'Modifié'
, GROUP_CONCAT(f.itemid) AS 'ItemId'
, GROUP_CONCAT(f.filepath) AS 'Filepath'
, GROUP_CONCAT(u.firstname) AS 'Prénom'
, GROUP_CONCAT(u.lastname) AS 'Nom'

FROM {course_modules} AS cm
JOIN {modules} AS m ON m.id = cm.module
JOIN {course} AS c ON c.id = cm.course
JOIN {assign} AS a ON a.id = cm.instance
JOIN {context} AS ctx ON ctx.instanceid = cm.id
LEFT JOIN {files} AS f ON f.contextid = ctx.id AND
f.component = 'mod_assign' AND f.filearea = 'introattachment' AND filename != '.'
LEFT JOIN {user} AS u ON u.id = f.userid

WHERE m.name = 'assign'
GROUP BY a.id, c.id

J'ai également intégré le nom de la personne ayant déposé le fichier de consigne de devoir.

On notera aussi la subtilité de découpe du mot réservé "update" pour l'URL de modification du devoir clin d’œil

Si tout cela peut servir à d'autres.
Séverin
Moyenne des évaluations Utile (1)
En réponse à Séverin Terrier

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs
Bonjour,

Allez, dernière version de ma requête, qui intègre en plus :
  • le chemin complet vers la catégorie du cours
  • une clause DISTINCT dans les GROUP_CONCAT pour que les valeurs liées aux fichiers (et leur créateur) s'affichent bien, et en un seul exemplaire (en cas de fichiers multiples)
  • la possibilité de spécifier une catégorie (et ses sous-catégorie) à traiter

Voici donc cette dernière version :

-- On peut spécifier la catégorie (et sous-catégories) souhaitée, voir en bas !

SELECT DISTINCT
CONCAT_WS (' / ', cc6.name, cc5.name, cc4.name, cc3.name, cc2.name, cc1.name, cc.name) AS 'Chemin'
, c.id AS 'ID Cours'
, c.visible AS 'Ouvert'
, c.idnumber AS 'IdNumber'
, CONCAT('<a target="_new" href="%%WWWROOT%%/course/view.php?id=',c.id,'">',c.fullname,'</a>') AS 'Nom du cours'
, CONCAT('<a target="_new" href="%%WWWROOT%%/mod/assign/view.php?id=',cm.id,'">',a.name,'</a>') AS 'Nom du devoir'
, CONCAT('<a target="_new" href="%%WWWROOT%%/course/modedit.php?up','date=',cm.id,'">Modifier</a>') AS 'Modifier'
, cm.visible AS 'Visible'
, IF (a.allowsubmissionsfromdate= 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.allowsubmissionsfromdate), '%Y-%m-%d %H:%i' )) AS 'Date ouverture'
, IF (a.duedate = 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.duedate) , '%Y-%m-%d %H:%i' )) AS 'Date de rendu'
, IF (a.cutoffdate = 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.cutoffdate), '%Y-%m-%d %H:%i' )) AS 'Date limite'
, a.id AS 'ID Devoir'
, GROUP_CONCAT( f.filename ) AS 'Fichiers'
, GROUP_CONCAT( f.filesize ) AS 'Taille'
, FROM_UNIXTIME(GROUP_CONCAT(f.timecreated)) AS 'Créé'
, FROM_UNIXTIME(GROUP_CONCAT(f.timemodified)) AS 'Modifié'
, GROUP_CONCAT(DISTINCT f.itemid) AS 'ItemId'
, GROUP_CONCAT(DISTINCT f.filepath) AS 'Filepath'
, GROUP_CONCAT(DISTINCT u.firstname) AS 'Prénom'
, GROUP_CONCAT(DISTINCT u.lastname) AS 'Nom'

FROM {course_modules} AS cm
JOIN {modules} AS m ON m.id = cm.module
JOIN {course} AS c ON c.id = cm.course
JOIN {assign} AS a ON a.id = cm.instance
JOIN {context} AS ctx ON ctx.instanceid = cm.id
LEFT JOIN {files} AS f ON f.contextid = ctx.id AND
f.component = 'mod_assign' AND f.filearea = 'introattachment' AND filename != '.'
LEFT JOIN {user} AS u ON u.id = f.userid
JOIN {course_categories} AS cc ON cc.id = c.category
LEFT JOIN {course_categories} AS cc1 ON cc1.id = cc.parent
LEFT JOIN {course_categories} AS cc2 ON cc2.id = cc1.parent
LEFT JOIN {course_categories} AS cc3 ON cc3.id = cc2.parent
LEFT JOIN {course_categories} AS cc4 ON cc4.id = cc3.parent
LEFT JOIN {course_categories} AS cc5 ON cc5.id = cc4.parent
LEFT JOIN {course_categories} AS cc6 ON cc6.id = cc5.parent

WHERE m.name = 'assign'
-- AND -- Pour sélectionner une catégorie (et sous-catégories)
-- ( cc.id = 53 -- spécifier l'id de la catégorie souhaitée
-- OR cc.path LIKE '%/53/%' -- sur ces deux lignes !
-- ) -- et activer ces 4 lignes (en enlevant les "-- " en début de ligne)
-- Penser à ré-activer les commentaires ensuite (pour tout traiter)
GROUP BY a.id, c.id
J'aurais bien aimé pouvoir spécifier la catégorie dans une variable unique en haut de page avec un SET @VARIABLE, mais il me le refuse pour raison de mot-clé interdit...

Séverin
En réponse à Séverin Terrier

Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir

par Christian Bocquet,
Avatar Moodleurs particulièrement utiles

Bonsoir Séverin,

Pour ajouter un filtre sur les catégories, en essayant de comprendre la documentation sur les filtres du plugin Configurable reports, j'ai ajouté dans la requête SQL la ligne :

%%FILTER_CATEGORIES:c.category%%

et j'ai ajouté le filtre "Catégories" en cliquant sur l'onglet "Filtres".
Et cela a fonctionné.

Mais ce n'est peut-être pas cela que tu veux faire ...

Christian