Informes de mensajes privados

Informes de mensajes privados

by jose luis garcia -
Number of replies: 23

Hola a tod@s, Fundae (antigua FTFE) está solicitando en los cursos bonificados que las plataformas tengan informes de los mensajes privados entre profesor y alumnos, así como de los mensajes del foro en el que interactúan profesor y alumno.

Estoy mirando el bloque configurable report, para ver si puedo acceder a estos informes, pero creo que sólo se podrán realizar estos informes a través de SQL, alguien puede ayudar??

Gracias por anticipado

Average of ratings: -
In reply to jose luis garcia

Re: Informes de mensajes privados

by Randy Thornton -

Hola Jose Luis,

Si, eso es correcto, necesita un informe de tipo SQL, pero la consulta sería sencilla como casi todos los datos de los mensajes personales están en solo una tabla, mdl_message. 

Por ejemplo:

SELECT 
 u.username AS 'From', 
 u2.username AS 'To',
 DATE_FORMAT(FROM_UNIXTIME(me.timecreated), '%Y-%m-%d %H:%i') AS 'When',
 me.subject, 
 me.smallmessage
FROM prefix_message me
JOIN prefix_user u ON u.id = me.useridfrom
JOIN prefix_user u2 ON u2.id = me.useridto
ORDER BY u.username, u2.username


Esta consulta funciona bien para mí en Moodle 3.1, y probablemente en 3.2 y 3.3 también.  Tenga cuidado, porque muestra todos los mensajes personales entre todos los usuarios.

Saludos,

Randy

In reply to Randy Thornton

Re: Informes de mensajes privados

by jose luis garcia -

Gracias Randy, pero me temo que es más complicado..

El informe que se necesita es que la inspección del curso vea:

.- Los mensajes que el profesor a enviado a cada alumno del curso.

.- Los mensajes que cada alumno ha enviado al profesor del curso.

Es decir: que la inspección del curso vea la interacción que han tenido alumnos y profesor en el curso.

In reply to jose luis garcia

Re: Informes de mensajes privados

by Carlos Diaz Perez (ESRP) -

Mira las tablas que intervienen son mdl_message (mensajes directos), mdl_user (usuarios),  con el select que te adjunto puedes sacar un informe de mensajes enviados desde origen (quien lo envía) a destinatario y el tipo de mensaje que es.

Si lo que necesitas es saber también los mensajes publicados en los foros es un poco más complejo, pero las tablas que necesitas son mdl_forum_posts con el campo userid que te indica quien lo escribe, mdl_forum que con el campo course puedes relacionar con la tabla mdl_course y sabras que curso es.


select concat(mdl_user.firstname," ", mdl_user.lastname) as origen, concat(user1.firstname, " ",user1.lastname) as destino, fullmessage, eventtype from mdl_message
inner join mdl_user
on mdl_user.id = mdl_message.useridfrom
inner join mdl_user as user1
on user1.id = mdl_message.useridto


In reply to Carlos Diaz Perez (ESRP)

Re: Informes de mensajes privados

by jose luis garcia -
Muchas gracias Carlos, lo iba a probar pero me da un error:
Unknown column 'eventtype' in 'field list'
In reply to jose luis garcia

Re: Informes de mensajes privados

by Carlos Diaz Perez (ESRP) -

Yo estoy usando Moodle 3.3 mira la tabla mdl_message de tu versión por si ese campo no existe y en ese caso quítalo del sql o sustitúyelo por el nombre que sea.

De todos modos, te aconsejo que mires en este enlace que tienes muchos ejemplos de SQL sobre la base de datos de Moodle y de distintos tipos


https://docs.moodle.org/26/en/ad-hoc_contributed_reports#LIST_of_all_site_USERS_by_COURSE_enrollment_.28Moodle_2.x.29



In reply to Carlos Diaz Perez (ESRP)

Re: Informes de mensajes privados

by jose luis garcia -

Gracias, ya solucioné el error y ví todos los ejemplos, pero sigo sin encontrar lo que busco.

En el informe deben salir los mensajes privados del curso, no de toda la plataforma y sólo los mensajes dirigidos al profesor y del profesor a los alumnos.

Gracias de todos modos, saludos.

In reply to jose luis garcia

Re: Informes de mensajes privados

by Carlos Diaz Perez (ESRP) -

Pues lo tienes facil pon un where con el id del curso 

In reply to Carlos Diaz Perez (ESRP)

Re: Informes de mensajes privados

by jose luis garcia -

OK, lo intentaré. Gracias

In reply to jose luis garcia

Re: Informes de mensajes privados

by jose luis garcia -

En el ad-hoc contributed reports, he conseguido algo parecido a lo que quería, pero creo que está puesto sólo para el día a día, como hacer para que aparezcan los datos de todo el curso??

# Messages BETWEEN students AND instructors - TO DATE
,  (SELECT COUNT(DISTINCT mfs.id) FROM prefix_message AS mfs WHERE mfs.useridfrom = allstu.id AND mfs.useridto = instr.id ) AS 'Mensajes del alumno al profesor'
, (SELECT COUNT(DISTINCT mts.id) FROM prefix_message AS mts WHERE mts.useridfrom = instr.id AND mts.useridto = allstu.id) AS 'Mensajes del profesor al alumno'

 

El código completo es el siguiente:

SELECT
 
# Identify student
CONCAT(allstu.firstname , ' ' , allstu.lastname , '</a>' ) AS 'Alumno'

, IF((COUNT(DISTINCT IF(fps.created > (UNIX_TIMESTAMP() - (7*24*60*60)),fps.id,NULL) )>0) OR (COUNT(DISTINCT IF(asb.timemodified > (UNIX_TIMESTAMP()  - (7*24*60*60)),asb.id,NULL))>0) OR  (SELECT COUNT(DISTINCT mfs.id) FROM prefix_message AS mfs WHERE mfs.useridfrom = allstu.id AND mfs.useridto = instr.id AND mfs.timecreated > (UNIX_TIMESTAMP()  - (7*24*60*60))),'SI','NO') AS 'Participación del alumno en los últimos 7 días'
 
## ALL posts IN course so far
# COUNT posts BY student
, COUNT(DISTINCT fps.id) AS 'Mensajes del alumno en el foro'
 
# COUNT replies TO student posts BY instructors
, COUNT(DISTINCT fpi.id) AS 'Respuestas del profesor'
 
# USING link back TO student posts ON replies, GET UNIQUE student IDs responded
, COUNT(DISTINCT fpsr.id) - COUNT(DISTINCT fpi.id) AS 'Respuestas del alumno'
 
# Messages BETWEEN students AND instructors - TO DATE
,  (SELECT COUNT(DISTINCT mfs.id) FROM prefix_message AS mfs WHERE mfs.useridfrom = allstu.id AND mfs.useridto = instr.id ) AS 'Mensajes del alumno al profesor'
, (SELECT COUNT(DISTINCT mts.id) FROM prefix_message AS mts WHERE mts.useridfrom = instr.id AND mts.useridto = allstu.id) AS 'Mensajes del profesor al alumno'
 
## JOINS
 
# START BY getting ALL the students IN the course
FROM prefix_user AS allstu
JOIN prefix_role_assignments AS ras ON allstu.id = ras.userid AND ras.roleid = 5
JOIN prefix_context AS ctx  ON ras.contextid = ctx.id
JOIN prefix_course AS c ON c.id = ctx.instanceid
JOIN prefix_course_categories AS cc ON c.category = cc.id
 
# Now we GET the forums AND forum discussions FROM this course ONLY
LEFT JOIN prefix_forum AS frm ON frm.course = c.id AND c.id = %%COURSEID%%
LEFT JOIN prefix_forum_discussions AS fd ON fd.course = %%COURSEID%% AND fd.forum = frm.id
 
# These are forum discussion posts just BY students WITHIN specified TIME
LEFT JOIN prefix_forum_posts AS fps ON fps.userid = allstu.id AND fps.discussion = fd.id
 
# Separately, we CONNECT the instructors OF the courses
# We can USE the context we have already gotten FOR the students
LEFT JOIN prefix_role_assignments AS rai ON rai.contextid = ctx.id
LEFT JOIN prefix_user AS instr ON instr.id = rai.userid AND rai.roleid =3
 
# Now we will CONNECT TO posts BY instructors that are replies TO student posts
# This IS a LEFT JOIN, because we don't want to eliminate any students from the list
LEFT JOIN prefix_forum_posts AS fpi ON fpi.discussion = fd.id AND fpi.userid = instr.id AND fpi.parent = fps.id
 
# To get identities of only those students who were replied to:
# Connect from instr replies back up to parent posts by students again
# This has to be a LEFT JOIN, we know these posts exist but don't eliminate non-responded students
LEFT JOIN prefix_forum_posts AS fpir ON fpir.id = fpi.parent
 
# We also want TO know IF students are replying TO one another
# These are posts that are replies TO student posts
# Again, a LEFT JOIN
LEFT JOIN prefix_forum_posts AS fpsr ON fpsr.discussion = fd.id AND fpsr.parent = fps.id
 
# GET the activity modules
LEFT JOIN prefix_course_modules AS cm ON c.id = cm.course
 
# GET the assignments
LEFT JOIN prefix_assign AS a ON  cm.instance = a.id
 LEFT JOIN prefix_assign_submission AS asb ON a.id = asb.assignment AND asb.userid=allstu.id
LEFT JOIN prefix_assign_grades AS asg ON asg.assignment = a.id AND asg.userid = allstu.id AND asg.assignment = asb.assignment
 
# We care about messages that involve BOTH the instructor AND students OF this course
# messages FROM instructor TO students:
# LEFT JOIN prefix_message AS mts ON mts.useridfrom = instr.id AND mts.useridto = allstu.id
# LEFT JOIN prefix_message AS mfs ON mfs.useridfrom = instr.id AND mfs.useridto = allstu.id
 
WHERE 
c.id = %%COURSEID%%
 
# GROUP BY c.shortname , allstu.id
GROUP BY allstu.id
 
ORDER BY allstu.lastname

In reply to Carlos Diaz Perez (ESRP)

Re: Informes de mensajes privados

by borja López Casanova -

Buenas tardes, voy a realizar una consulta que entiendo que pueda parecer muy básica.

Intente introducir la id del curso pero me da error, podría ayudarme?


SELECT 

 u.username AS 'From', 

 u2.username AS 'To',

 DATE_FORMAT(FROM_UNIXTIME(me.timecreated), '%Y-%m-%d %H:%i') AS 'When',

 me.subject, 

 me.smallmessage

FROM prefix_message me

WHERE c.id=24

JOIN prefix_user u ON u.id = me.useridfrom

JOIN prefix_user u2 ON u2.id = me.useridto

ORDER BY u.username, u2.username


In reply to jose luis garcia

Re: Informes de mensajes privados

by Randy Thornton -


Estimados,

Acabo de hacer una consulta que muestra todos los mensajes de profesores y alumnos del mismo curso. Me gustaría que alguien me la comprobará. 

La frase WHERE tiene un filtro limitante. Por eso, esta consulta muestra sólo los mensajes entre los dos roles por defecto de Profesor (editingteacher, id = 3) y Estudiante (student, id = 5). Es decir que excluye mensajes entre profesores mismos, entre estudiantes mismos, y además todos los que pertenecen al role de Profesor sin permiso de edición (u otros roles). 

Pero si quieres todos los mensajes de un curso, es fácil, no más que eliminar la frase AND ((..)) al final de WHERE.

Debes cambiar ## de la frase WHERE c.id=## al id del curso lo que quieres, como de costumbre.


SELECT 
u.username AS 'Desde',
CONCAT(u.firstname ,' ',u.lastname) AS 'Desde Nombre',
u2.username AS'Para',
CONCAT(u2.firstname ,' ',u2.lastname) AS 'Para Nombre',
DATE_FORMAT(FROM_UNIXTIME(me.timecreated), '%Y-%m-%d %H:%i') AS 'Fecha',
me.subject AS 'Asunto', 
me.smallmessage AS 'Mensaje'
FROM prefix_message me
JOIN prefix_role_assignments AS ra ON ra.userid = me.useridfrom AND ra.roleid IN (3,4,5)  
JOIN prefix_role_assignments AS ra2 ON ra2.userid = me.useridto AND ra2.roleid IN (3,4,5)  
JOIN prefix_context AS ctx ON ra.contextid = ctx.id AND ra2.contextid = ctx.id
JOIN prefix_course AS c ON c.id = ctx.instanceid
JOIN prefix_user u ON u.id = me.useridfrom
JOIN prefix_user u2 ON u2.id = me.useridto
WHERE c.id=## 
AND ((ra.roleid = 3 AND ra2.roleid = 5) OR (ra.roleid = 5 AND ra2.roleid = 3)) 
ORDER BY me.useridfrom, me.useridto, me.timecreated


Espero que sea útil.

Saludos,

Randy


Attachment screenshot_2576.jpg
In reply to Randy Thornton

Re: Informes de mensajes privados

by jose luis garcia -

Muchas gracias Randy, parece que funciona correctamente, la he comprobado en varios cursos y el resultados son los mensajes exactos que se han emitido entre profesor y alumno.

En algunos cursos he quitado la frase AND ((..)) y muestra todos los mensajes entre alumnos y alumnos y profesor.

Perfecto!! Muchas gracias

In reply to jose luis garcia

Re: Informes de mensajes privados

by Randy Thornton -

Jose Luis,

De nada y gracias por comprobarlo.

Fue un reto hacerlo fácil de ajustar por muchos roles, pero parece que funciona bien.


Saludos,

Randy

Average of ratings: Útil (1)
In reply to Randy Thornton

Re: Informes de mensajes privados

by Jesús Ernesto Guzmán Elías -

Hola Randy, buenas tardes, estaba probando tu código pero me marca el siguiente error.  ¿Por favor, podrías sugerirme qué detalle puede ser? Mi versión de mysql es 5.5.40 y estoy utilizando Moodle 3.1.9

Muchas gracias



In reply to Jesús Ernesto Guzmán Elías

Re: Informes de mensajes privados

by Carlos Diaz Perez (ESRP) -

El where del curso c.id=## tienes que sustituir el ## por el id del curso que quieras filtrar, el error lo tienes ahi

In reply to Jesús Ernesto Guzmán Elías

Re: Informes de mensajes privados

by Randy Thornton -


Jesús Ernesto,

Exacto lo que Carlos dijo.

En lugar del id del curso, también se use el 'shortname' del curso, como así, por ejemplo:

WHERE c.shortname = 'ejemplocurso1'

Pero no necesitas los dos. Use id o shortname, uno u otro, no ambos.

Saludos,
Randy
In reply to Randy Thornton

Re: Informes de mensajes privados

by Federación Baloncesto Castilla la Mancha -

Buenas tardes Randy, cuando el curso hay varios alumnos el informe no me lanza datos, cuando sin embargo si que veo que hay mensajes a ambos alumnos matriculados en el curso. 

Es decir, en cursos donde solo hay un alumno matriculado y poniendo el código del short name del curso, me sale si problemas, sin embargo si hay varios alumnos en el curso, el informe no me recoge datos.


porque puede ser?'


gracias

In reply to Federación Baloncesto Castilla la Mancha

Re: Informes de mensajes privados

by Randy Thornton -


Hm. Qué extraño. Funciona cuando solo uno alumno matriculado pero no dos.

¿En cuál versión de Moodle estas trabando? ¿Son los roles del curso normal, es decir los de Profesor y Estudiante por defecto?

Podrías comprobar esto - después de borrar esta frase de la WHERE

AND ((ra.roleid = 3 AND ra2.roleid = 5) OR (ra.roleid = 5 AND ra2.roleid = 3))

y la WHERE tiene solo el id del curso, luego ¿Qué pasa? Resulta algo más quizás....


Randy



In reply to Randy Thornton

Re: Informes de mensajes privados

by Randy Thornton -


Y a tod@s una cosa más. Lo sé que esta consulta no funcionará correctamente en versión 3.5 de Moodle ya que han cambiado mucho las tablas de datos de mensajes (según Trackers 61254 y 36941).

In reply to Randy Thornton

Re: Informes de mensajes privados

by Federación Baloncesto Castilla la Mancha -

Buenos dias Andy, lo he resuelto con el siguiente código:


SELECT

 

CONCAT(u.firstname ,' ',u.lastname) AS 'Desde Nombre',

CONCAT(u2.firstname ,' ',u2.lastname) AS 'Para Nombre',

DATE_FORMAT(FROM_UNIXTIME(me.timecreated), '%Y-%m-%d %H:%i') AS 'Fecha',

me.subject AS 'Asunto',

me.smallmessage AS 'Mensaje'

 

 

FROM prefix_message me

JOIN prefix_role_assignments AS ra ON ra.userid = me.useridfrom AND ra.roleid IN (3,4,5)

JOIN prefix_role_assignments AS ra2 ON ra2.userid = me.useridto AND ra2.roleid IN (3,4,5)

JOIN prefix_context AS ctx ON ra.contextid = ctx.id AND ra2.contextid = ctx.id

JOIN prefix_course AS c ON c.id = ctx.instanceid

JOIN prefix_user u ON u.id = me.useridfrom

JOIN prefix_user u2 ON u2.id = me.useridto

 

WHERE c.id = %%COURSEID%%  AND

((ra.roleid = 3 AND ra2.roleid = 5) OR (ra.roleid = 5 AND ra2.roleid = 3))


 

UNION ALL

 

SELECT

 

CONCAT(ur.firstname ,' ',ur.lastname) AS 'Desde Nombre',

CONCAT(u2r.firstname ,' ',u2r.lastname) AS 'Para Nombre',

DATE_FORMAT(FROM_UNIXTIME(mer.timecreated), '%Y-%m-%d %H:%i') AS 'Fecha',

mer.subject AS 'Asunto',

mer.smallmessage AS 'Mensaje'

 

 

FROM prefix_message_read mer

JOIN prefix_role_assignments AS rar ON rar.userid = mer.useridfrom AND rar.roleid IN (3,4,5)

JOIN prefix_role_assignments AS ra2r ON ra2r.userid = mer.useridto AND ra2r.roleid IN (3,4,5)

JOIN prefix_context AS ctxr ON rar.contextid = ctxr.id AND ra2r.contextid = ctxr.id

JOIN prefix_course AS cr ON cr.id = ctxr.instanceid

JOIN prefix_user ur ON ur.id = mer.useridfrom

JOIN prefix_user u2r ON u2r.id = mer.useridto

 

WHERE cr.id = %%COURSEID%%  AND

((rar.roleid = 3 AND ra2r.roleid = 5) OR (rar.roleid = 5 AND ra2r.roleid = 3))

 

 con las segunda parte lo que consigo es que se vean los mensajes pendientes de leer, ya que con la primera, solo aparecian los leidos y puede que así no salgan todos al inspector que quiera cotejar esto. 


Un saludo

Average of ratings: Útil (1)
In reply to Federación Baloncesto Castilla la Mancha

Re: Informes de mensajes privados

by jose luis garcia -

Gracias por el aporte, nos será de gran utilidad.

In reply to Federación Baloncesto Castilla la Mancha

Re: Informes de mensajes privados

by luis miguel hernandez -

Hola con versión de Moodle está funcionando?

Tengo la versión 3.6 y evidentemente como dciaia no funciona.

Alguien ha dado con la clave?

Un saludo

In reply to luis miguel hernandez

Re: Informes de mensajes privados

by Jose David Noriega Villadiego -

Funciona para Postgres???


SELECT


CONCAT(u.firstname ,' ',u.lastname) AS Desde,

CONCAT(u2.firstname ,' ',u2.lastname) AS Para,

DATE_FORMAT(FROM_UNIXTIME(me.timecreated), '%Y-%m-%d %H:%i') AS Fecha,

me.subject AS Asunto,

me.smallmessage AS Mensaje

FROM mdl_message me

JOIN mdl_role_assignments AS ra ON ra.userid = me.useridfrom AND ra.roleid IN (3,4,5)

JOIN mdl_role_assignments AS ra2 ON ra2.userid = me.useridto AND ra2.roleid IN (3,4,5)

JOIN mdl_context AS ctx ON ra.contextid = ctx.id AND ra2.contextid = ctx.id

JOIN mdl_course AS c ON c.id = ctx.instanceid

JOIN mdl_user u ON u.id = me.useridfrom

JOIN mdl_user u2 ON u2.id = me.useridto


WHERE c.id = %%COURSEID%%  AND

((ra.roleid = 3 AND ra2.roleid = 5) OR (ra.roleid = 5 AND ra2.roleid = 3))



UNION ALL


SELECT



CONCAT(ur.firstname ,' ',ur.lastname) AS Desde,

CONCAT(u2r.firstname ,' ',u2r.lastname) AS Para,

DATE_FORMAT(FROM_UNIXTIME(mer.timecreated), '%Y-%m-%d %H:%i') AS Fecha,

mer.subject AS Asunto,

mer.smallmessage AS Mensaje


FROM mdl_message_read mer

JOIN mdl_role_assignments AS rar ON rar.userid = mer.useridfrom AND rar.roleid IN (3,4,5)

JOIN mdl_role_assignments AS ra2r ON ra2r.userid = mer.useridto AND ra2r.roleid IN (3,4,5)

JOIN mdl_context AS ctxr ON rar.contextid = ctxr.id AND ra2r.contextid = ctxr.id

JOIN mdl_course AS cr ON cr.id = ctxr.instanceid

JOIN mdl_user ur ON ur.id = mer.useridfrom

JOIN mdl_user u2r ON u2r.id = mer.useridto


WHERE cr.id = %%COURSEID%%  AND

((rar.roleid = 3 AND ra2r.roleid = 5) OR (rar.roleid = 5 AND ra2r.roleid = 3))