Cosas de Administradores

Informes de mensajes privados

 
Imagen de jose luis garcia
Informes de mensajes privados
 

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

 
Promedio de calificaciones: -
Randy Thornton
Re: Informes de mensajes privados
DocumentadoresMoodlers de gran ayuda

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

 
Promedio de calificaciones: -
Imagen de jose luis garcia
Re: Informes de mensajes privados
 

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.

 
Promedio de calificaciones: -
FOTOCARNET
Re: Informes de mensajes privados
Moodlers de gran ayuda

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


 
Promedio de calificaciones: -
Imagen de jose luis garcia
Re: Informes de mensajes privados
 
Muchas gracias Carlos, lo iba a probar pero me da un error:
Unknown column 'eventtype' in 'field list'
 
Promedio de calificaciones: -
FOTOCARNET
Re: Informes de mensajes privados
Moodlers de gran ayuda

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



 
Promedio de calificaciones: -
Imagen de jose luis garcia
Re: Informes de mensajes privados
 

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.

 
Promedio de calificaciones: -
FOTOCARNET
Re: Informes de mensajes privados
Moodlers de gran ayuda

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

 
Promedio de calificaciones: -
Imagen de jose luis garcia
Re: Informes de mensajes privados
 

OK, lo intentaré. Gracias

 
Promedio de calificaciones: -
Imagen de jose luis garcia
Re: Informes de mensajes privados
 

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

 
Promedio de calificaciones: -
Imagen de borja López Casanova
Re: Informes de mensajes privados
 

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


 
Promedio de calificaciones: -
Randy Thornton
Re: Informes de mensajes privados
DocumentadoresMoodlers de gran ayuda


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



 
Promedio de calificaciones: -
Imagen de jose luis garcia
Re: Informes de mensajes privados
 

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

 
Promedio de calificaciones: -
Randy Thornton
Re: Informes de mensajes privados
DocumentadoresMoodlers de gran ayuda

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

 
Promedio de calificaciones:Útil (1)
Imagen de Jesús Ernesto Guzmán Elías
Re: Informes de mensajes privados
 

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



 
Promedio de calificaciones: -
FOTOCARNET
Re: Informes de mensajes privados
Moodlers de gran ayuda

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

 
Promedio de calificaciones: -
Randy Thornton
Re: Informes de mensajes privados
DocumentadoresMoodlers de gran ayuda


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
 
Promedio de calificaciones: -
Imagen de Federación Baloncesto Castilla la Mancha
Re: Informes de mensajes privados
 

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

 
Promedio de calificaciones: -
Randy Thornton
Re: Informes de mensajes privados
DocumentadoresMoodlers de gran ayuda


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



 
Promedio de calificaciones: -
Randy Thornton
Re: Informes de mensajes privados
DocumentadoresMoodlers de gran ayuda


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).

 
Promedio de calificaciones: -
Imagen de Federación Baloncesto Castilla la Mancha
Re: Informes de mensajes privados
 

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

 
Promedio de calificaciones:Útil (1)
Imagen de jose luis garcia
Re: Informes de mensajes privados
 

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

 
Promedio de calificaciones: -