Ejemplo con usuarios, roles y contextos.

Ejemplo con usuarios, roles y contextos.

de Juan Pueyo -
Número de respuestas: 34
Hola a todos,

Soy nuevo en el foro y como primer post voy a dejar un ejemplo de cómo trabajar con usuarios, roles y contextos, atacando la base de datos de Moodle mediante querys con las tablas mdl_user, mdl_course, mdl_role, mdl_role_assignments, mdl_context.

Creo que puede ser de gran utilidad a más de uno.

Un cordial saludo.

ACCESO A DATOS DE UN CURSO A TRAVÉS DEL ROL Y DEL CONTEXTO


1. Cuando se agrega un nuevo curso, se agrega información en dos tablas:

§ course: almacena toda la información del curso. El campo id lo distingue del resto.

§ context: guarda información relativa a dónde se encuentra cualquier elemento en Moodle. Los cursos tienen el valor de contextlevel=50, y el campo instandeid se relaciona con el campo id de la tabla course, por tanto si un curso tiene el campo id=8 en la tabla course, los registros de la tabla context que guarden información de ese curso, tendrán el campo instanceid=8.

Con la siguiente query podemos obtener los cursos y su id pero haciendo una join:


SELECT DISTINCT mdl_course.fullname, mdl_context.instanceid FROM mdl_course

INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id


2. La tabla role_assignments.

Esta tabla guarda información sobré qué contexto tiene asignado cada usuario. El campo contextid se relaciona con el campo id de la tabla context.

Con la siguiente query obtenemos toda la información referente a un curso y su contexto. Esta es la query base que se tendría que utilizar para obtener cualquier información de usuarios, cursos, etc.


SELECT * FROM mdl_course

INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id

INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid


3. Si por ejemplo ahora queremos obtener qué usuarios están matriculados en un curso, haríamos lo siguiente:

SELECT mdl_course.fullname, mdl_role_assignments.userid FROM mdl_course

INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id

INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid


4. Si solo nos interesa obtener los estudiantes hay que hacer otra join con la tabla role:

SELECT mdl_course.fullname, mdl_role_assignments.userid FROM mdl_course

INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id

INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid

INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid


Para que sólo muestre los estudiantes le añadirmos la claúsula WHERE:


SELECT mdl_course.fullname, mdl_role_assignments.userid FROM mdl_course

INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id

INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid

INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid

WHERE mdl_role.shortname = 'student'


O su equivalente utilizando el campo id de la tabla role, en vez de utilizar el campo shortname:


SELECT mdl_course.fullname, mdl_role_assignments.userid FROM mdl_course

INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id

INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid

INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid

WHERE mdl_role.id = 5


5. Si quisieramos obtener el nombre de los alumnos, hay que hacer otra join con la tabla user:

SELECT mdl_course.fullname, mdl_user.username FROM mdl_course

INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id

INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid

INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid

INNER JOIN mdl_user ON mdl_user.id = mdl_role_assignments.userid

WHERE mdl_role.id = 5


6. Si deseamos obtener cuántos alumnos tenemos matriculados en cada curso haríamos la siguiente query.

SELECT mdl_course.fullname, count(*) numusuarios FROM mdl_course

INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id

INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid

INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid

INNER JOIN mdl_user ON mdl_user.id = mdl_role_assignments.userid

WHERE mdl_role.id = 5

GROUP BY mdl_course.fullname


7. Si quisiéramos obtener la lista de usuarios de un curso en concreto y trabajando con el campo id de un curso, haríamos la siguiente query:

SELECT mdl_user.username, mdl_user.firstname, mdl_user.lastname FROM mdl_course

INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id

INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid

INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid

INNER JOIN mdl_user ON mdl_user.id = mdl_role_assignments.userid

WHERE mdl_role.id = 5 AND mdl_course.id = 8

GROUP BY mdl_course.fullname


8. Si quisiéramos trabajar con el nombre del curso, en vez de trabajar con el campo id, trabajaríamos con el campo fullname de la tabla course.

SELECT mdl_user.username, mdl_user.firstname, mdl_user.lastname FROM mdl_course

INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id

INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid

INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid

INNER JOIN mdl_user ON mdl_user.id = mdl_role_assignments.userid

WHERE mdl_role.id = 5 AND mdl_course.fullname = 'Curso1'

GROUP BY mdl_course.fullname




Promedio de valoraciones:Útil (3)
En respuesta a Juan Pueyo

Re: Ejemplo con usuarios, roles y contextos.

de Blade Trinity -

Muchas gracias Juan por este documento, ha sido de mucha ayuda. Yo estaba usando la version 1.4 de moodle y migre a la nueva version 1.9, y mi proceso de creacion de estudiantes y cursos, asi como la asignacion de estudiantes a cursos se me caia ya que algunas tablas ya no existen en la nueva version, como por ejemplo la de mdl_user_students.

Saludos

Blade.

En respuesta a Juan Pueyo

Re: Ejemplo con usuarios, roles y contextos.

de Hernan Silva -
Excelente, muchas gracias justo lo que necesitaba.

Alugunas etiquetas:

usuarios, cursos, alumnos por curso, alumno por curso, gestión.

Saludos

En respuesta a Juan Pueyo

Re: Ejemplo con usuarios, roles y contextos.

de Allan Porras -
Amigo, necesito hacer un reporte algo personalizado, y consiste en una consulta que me muestre la calificacion, para cada usuario y para cada curso, de algun total de categoria especifica de los cursos.

Te explico mejor... Yo estoy ingresando diferentes categorias para los cursos, entonces quiero hacer un reporte que me muestre la nota para alguna de esas categorias en especifico:

usuario | categoria(item) | curso | calificacion

Ya he averiguado algo en la DB, y al parecer todo se centra en las bases mdl_user, mdl_grade_grades, mdl_grade_categories, mdl_course.

Agradezco cualquier ayuda...


En respuesta a Allan Porras

Re: Ejemplo con usuarios, roles y contextos.

de jose contreras -

HOLA LO QUE PASA ES QUE QUERIA SABER SI TU SABIAS LA CONSULTA PARA INSERTAR CALIFICACIONES  ESA TABLA, LO QUE PASA ES Q ESTOY HACIENDO UNA APLICACION/PLATAFORMA WEB EN JAVA DE UN CURSO Y TIENE UNOS EJERCICIOS PERO QUIERO QUE EL RESULTADO SE GUARDE EN LA BASE DE DATOS DE MMOODLE

En respuesta a jose contreras

Re: Ejemplo con usuarios, roles y contextos.

de Sandra Piedrabuena -

Hola Jose

Te comento en Moodle 1.9. Las calificaciones se guardan en tablas llamadas mdl_grade_*.

La grade_grade ademas del userid, tiene un campo denominado itemid, por este campo se relaciona con la tabla mdl_grade_items, que es donde están el id de cursos y categorias. 

No sabria decirte que tablas tocar para lograr un insert exitoso.

Saludos

 

 

En respuesta a Juan Pueyo

Re: Ejemplo con usuarios, roles y contextos.

de Allan Porras -
Yo genere esta consulta:

SELECT user.username, course.fullname, gc.fullname, gg.finalgrade
FROM mdl_user user, mdl_course course, mdl_grade_categories gc, mdl_grade_grades gg
WHERE gg.userid = user.id
AND gc.courseid = course.id
AND gg.itemid = gc.id
AND gc.fullname = 'Quarter 2' //nombre de categoria
ORDER BY course.fullname;

..pero no me esta funcionando, ya que me muestra una cursos en los que el usuario NO esta matriculado.. algo tengo hecho mal..

Gracias
En respuesta a Juan Pueyo

Re: Ejemplo con usuarios, roles y contextos.

de Gerardo Jiménez Haro -

Excelente información, ahora yo necesito tener un listado de los alumnos que no se encuentran matriculados en ningun curso para posteriormente proceder a eliminarlos.

¿alguien podría ayudarme?

Saludos desde Jal,Mx.

En respuesta a Gerardo Jiménez Haro

Re: Ejemplo con usuarios, roles y contextos.

de Jose David Noriega Villadiego -

Hola Gerardo,

Esta consulta te puede servir:

SELECT id, concat(firstname,' ', lastname ) AS name, lastaccess, lastlogin, currentlogin
FROM mdl_user
WHERE currentlogin = 0 AND lastlogin = 0 AND lastaccess = 0 AND deleted = 0 

En respuesta a Juan Pueyo

Re: Ejemplo con usuarios, roles y contextos.

de Luis Márquez -
Buenas tardes Juan,

Está excelente tu material, gracias por compartilo con la comunidad.

Tal vez me puedas ayudar; estoy haciendo un programa externo en java, para reallizar inscripciones masivas, el programa corre bien, pero, una vez que ingresos a los alumnos a través del programa no puedo utilizar la interfaz gráfica para insertar más usuairos, ya que genera el siguiente error.

ERROR: duplicate key value violates unique constraint "mdl_user_id_pk"

INSERT INTO mdl_user ( ID, AUTH, CONFIRMED, MNETHOSTID, USERNAME, PASSWORD, IDNUMBER, FIRSTNAME, LASTNAME, EMAIL, EMAILSTOP, ICQ, SKYPE, YAHOO, AIM, MSN, PHONE1, PHONE2, INSTITUTION, DEPARTMENT, ADDRESS, CITY, COUNTRY, LANG, TIMEZONE, URL, DESCRIPTION, MAILFORMAT, MAILDIGEST, MAILDISPLAY, HTMLEDITOR, AJAX, AUTOSUBSCRIBE, TRACKFORUMS, TIMEMODIFIED, IMAGEALT, SCREENREADER ) VALUES ( 3, 'manual', 1, 1, 'marquez.luis', '6dc13bd0947bd92f3790bec0126fe133', '', 'Luis', 'Marquez', 'marquezl@gmail.com', 0, '', '', '', '', '', '', '', '', '', '', 'Barquisimeto', 'VE', 'es_utf8', '99', '', '', 1, 0, 2, 1, 0, 1, 0, 1273259705, '', 0 )

Sé que el erro es la duplicación del id del usuario. La pregunta es: Donde guarda moodle el valor del id del proximo usuario?

gracias de antemano.

Saludos cordiales,

Luis Márquez
e-mail:marquezl@gmail.com
En respuesta a Luis Márquez

Re: Ejemplo con usuarios, roles y contextos.

de Antonio Herrera Vega -
Buenas, en las tablas de la bbdd de moodle los id son autoincrent. Por tanto sólo con quitar el id del insert ya te vale. La bbdd se encarga de asignadonar ese id automáticamente

Espero haberte ayudado.
En respuesta a Antonio Herrera Vega

Re: Ejemplo con usuarios, roles y contextos.

de Luis Márquez -
Hola Antonio,

Muchas gracias por la respuesta, por supuesto que me ayudo, reorganice el programa y ahora todo funciona muy bien.

una vez más muchas gracias.

saludos.
En respuesta a Luis Márquez

Re: Ejemplo con usuarios, roles y contextos.

de Mariano Gonzalez -

Hola Luis,

Abría posibilidades de que compartas esta aplicación con todos? Yo estoy necesitando un sistema externo para matricular masivamente…


Saludos,


Mariano
En respuesta a Mariano Gonzalez

Re: Ejemplo con usuarios, roles y contextos.

de Luis Márquez -
Hola Mario,

No hay ningun problema, claro que lo puedo compartir, dame un par de días y público el enlece de donde pueden descargar el programa.

Saludos,

LuisM
En respuesta a Luis Márquez

Re: Ejemplo con usuarios, roles y contextos.

de Fabian Villalobos Viramontes -

Disculpa se que este tema quiza para ti ya sea algo pasado, pero sucede que yo estoy empezando un proyecto escolar y quisiera saber que posibilidad habría de que a mi también me compartieras tu aplicacion externa para matricular alumnos...

De antemano muchas gracias,

Saludos

En respuesta a Juan Pueyo

Re: Ejemplo con usuarios, roles y contextos.

de luchito alva -

Juan le agradezco me colabore.

En el curso que administro, se trata de que un profesor que he llamado padrino(ayuda a otro profesor llamado estudiante) a realizar el curso. El primero debe registrar y matricular al segundo con la opción crear usuario desde adentro de la cuenta de el.

¿Cómo hago para saber qué profesor padrino matriculó a qué profesor estudiante?

Gracias

En respuesta a luchito alva

Re: Ejemplo con usuarios, roles y contextos.

de Ignacio Troncoso -
hola amigos, me gustaria que me ayudaran con un tema.

Sucede que notros trabajamos con moodle y con modulos de SCORM, y me gustaria hacer un query que rescatara las notas de los alumnos


En respuesta a Ignacio Troncoso

Re: Ejemplo con usuarios, roles y contextos.

de Antonio Herrera Vega -
Buenos días,
Esas notas que están en los Scorm, tareas, foros, etc?? Depende de donde estén, si tienes activibado el libro de calificaciones tb se pueden obtener de ai.
Si me das mas detalles veremos lo que podemos hacer.
Un saludo.
En respuesta a Juan Pueyo

Re: Ejemplo con usuarios, roles y contextos.

de guillermo cuadra -
Excelente, muchas gracias. Me es muy util la información, no sabia como recuperar los roles de los usuarios para el curso. Muy buena informacion para comprender mejor la base de datos de moodle, nuevamente muchas gracias
En respuesta a Juan Pueyo

Usuarios, roles y contextos.

de Liliana Dercye -

Hola amigos,

Soy nueva en el foro y también en Moodle; espero me puedan orientar. Lo que necesito es configurar permisos de usuario. Mi búsqueda consiste en restringir a Student el ingreso a las clases. Cada alumno estaría habilitado a ingresar un máximo de 3 veces por clase. ¿Se puede configurar este permiso? En caso afirmativo, por favor, indicarme cómo lo hago.

Muchas gracias!

Liliana

En respuesta a Liliana Dercye

Re: Usuarios, roles y contextos.

de Antonio Herrera Vega -
Buenos días,

Para realizar dicha modificación habría que modificar el código ya que dicha acción no se puede realizar en Moodle, no se si en las nuevas versiones se podrá implementar mediante los condicionales.

Además esto sería complicado, ya que si se le da solo la oportunidad de acceder 3 veces por curso y el usuario accede al curso y refresca la pantalla tres veces ya habría agotado sus accesos, yo lo realizaría por días, es decir dejarle acceder tres días todas las veces que quisiese.

Un cordial saludo.

En respuesta a Antonio Herrera Vega

Re: Usuarios, roles y contextos.

de Iñaki Arenaza -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodlers de gran ayuda

Las condicionales de la nueva versión 2.0 que está a punto de aparece no contempla dicha posibilidad en absoluto.

Las condicionales imponen "restricciones" en el acceso a cada recurso o actividad dentro del curso, pero no al curso en sí.

Lo que se pide en este caso recaería en la funcionalidad de los plugins de matriculación. Pero que yo sepa ni existe ni hay intención de desarrollar ningún plugin de matriculación con esa funcionalidad (entre otras cosas, por el tipo de problemas que bien plantea Antonio Herrera sonrisa)

Saludos. Iñaki.

En respuesta a Antonio Herrera Vega

Re: Usuarios, roles y contextos.

de Liliana Dercye -

Hola Antonio,

Muchísimas gracias por aclararme este punto. Como dices, habilitar 3 días sería una muy buena solución, ¿podrías indicarme cómo configurar esto?

Gracias de nuevo!

En respuesta a Liliana Dercye

Re: Usuarios, roles y contextos.

de Antonio Herrera Vega -
Buenos días,

Pues eso no se puede realizar en moodle, se podría modificar de la siguiente forma (es lo que se me ha ocurrido que no quiere decir que sea la mejor forma).

A la hora de acceder al curso (en el archivo course/view.php) habría que comprobar en la tabla mdl_log el número de días que ha accedido mediante una consulta y si ha accedido mas de X días (los que usted decida) que no le permita acceder. También habría que comprobar el rol del usuario que esta accediendo ya que entiendo que esto solo sería para un rol tipo demo o algo así (para hacerlo bien yo añadiría una nueva capacidad en los roles), porque si no podría entrar ningún usuario mas (como los administradores). También habría que filtrar que curso es el que se va a comportar de esta forma (para ello yo añadiría un nuevo campo en el curso para poder identificarlos por ejemplo en la tabla mdl_course).

Como ves no es algo trivial y mas si se quiere hacer bien (siguiendo estandares y demás), si no tienes idea de programacion en php y sql yo empezaría por hay y luego ya me metería en modificaciones mayores.

Un cordial saludo.
En respuesta a Juan Pueyo

Re: Ejemplo con usuarios, roles y contextos.

de Ricardo Navarro -

Justo lo que buscaba, lo ocupe para obtener la lista de usuarios de un curso:

SELECT mdl_course.fullname, mdl_role_assignments.userid FROM mdl_course
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid
WHERE mdl_course.id = [id-del-curso]

Sigue aportando Juan.

En respuesta a Ricardo Navarro

Re: Ejemplo con usuarios, roles y contextos.

de Marlon Orozco -
Hola, y como hacer para qu eaparezcan los Nombres y no el Id.?? Gracias Marlon
En respuesta a Marlon Orozco

Re: Ejemplo con usuarios, roles y contextos.

de Sandra Piedrabuena -

Hola Marlon:

Con la siguiente consulta obtengo los estudiantes de un curso. Es el punto 7 del post original. Espero te resulte útil. Saludos

SELECT DISTINCT r.id, u.username, u.idnumber, u.lastname, u.firstname, c.fullname FROM mdl_user AS u JOIN mdl_role_assignments AS ra ON u.id = ra.userid JOIN mdl_context AS contxt ON ra.contextid = contxt.id JOIN mdl_course AS c ON contxt.instanceid = c.id WHERE c.id = [id-del-curso] AND ra.roleid = 5 ORDER BY u.lastname

En respuesta a Juan Pueyo

Re: Ejemplo con usuarios, roles y contextos.

de Marisela Noriega -

Hola buenas tardes a Todos

Necesito saber en cual tabla se almacena los nombres del contenido de un curso o modulo donde ingresan los alumnos, es decir visualizar los alumnos que ingresaron a cada modulo dentro de un curso y la fecha de su acceso. 

En el print de pantalla se puede observar un curso con varios modulo, por ejemplo el modulo 1, se llama: Cine Foro1 y adentro se encuentran el contenido de varios archivos para consulta de los alumnos, como por ejemplo: recomendaciones de Continuidad del Negocio ect. Bueno quiero saber los alumnos que han leido cada uno de ese material por modulo.

Espero me puedan entender la explicacion y ayudarme...

Gracias de antemano a todos los que puedan darme sus recomendaciones..

Feliz dia!!

 

 

 

 

 

 

 

En respuesta a Juan Pueyo

Re: Ejemplo con usuarios, roles y contextos.

de jose nieves -

man la verdad se lo agradesco, yo tenia que averiguar las asignaciones que tenian los estudiantes , y debia hacerlo en tiempo real, pero cuando pruebo, me doy cuenta que solo podia ver ese resultado una ves el estudiante hubiera entrado al curso y dado click a la actividad para que se guardara en mdl_assign_submission , pero con esto que ha colgado, me ha salvado el semestre , muy agradecido, la verdad

En respuesta a Juan Pueyo

Re: Ejemplo con usuarios, roles y contextos.

de Alberto Gar -

Hola, buenos días. Como podría dar de alta mediante una consulta mysql  a un alumno en un curso determinado.

Gracias

En respuesta a Alberto Gar

Re: Ejemplo con usuarios, roles y contextos.

de Claudio Visa -

Estimados

                Como tendria que ser uan consulta en la cual me de:

nombre del curso

nombre del docente

el tiempo que esta contecado al curso


Saludos