Limpieza intentos examenes (quiz)

Limpieza intentos examenes (quiz)

de Pablo Lo -
Número de respuestas: 1

Buenas! Me he fijado y las tablas, mdl_question_attempts, mdl_question_attempts_steps, mdl_question_attempts_steps_data 

son de las tablas mas grandes y que mas ocupan en la base de datos. quiero mantener un poco controlado sus tamaños y había pensado en hacer limpieza de los intentos de los exámenes (un alumno puede intentar varias veces el examen).

La idea es hacer limpieza de los intentos del alumno y dejar solo la que mas nota tiene. No he encontrado nada en moodle que me permita hacerlo automáticamente, ¿Alguien ha tenido este problema? ¿Tenéis alguna solución?

Había pensado en hacer un script para automatizar este proceso, y ejecutarlo una vez al año cuando termina el curso. Lo malo es que de programación ando algo perdido, hace años que aprendí algo y lo tengo un poco olvidado. Pongo aqui un poco las ideas que tengo de como hacerlo y a ver si alguien puede echarme una mano.

Hacer una consulta en la tabla mdl_quiz_attempts, algo asi:

SELECT * FROM `mdl_quiz_attempts` WHERE `state` = "finished" ORDER BY `userid` ASC, `quiz` ASC, `sumgrades` DESC

guardando la consulta en una variable ($table), luego recorrer la variable y hacer una comprobacion del estilo:

for ($x=0;$x<count($table); $x++){

    if ( $table[i][userid] = $table[i+1][userid] & $table[i][quiz] = $table[i+1][quiz] ){

     //aqui se compara si la siguiente fila es el mismo alumno y el mismo examen

     quiz_delete_attempt($table[i+1][$attempt], $table[i+1][$quiz]);
     //esta funcion esta en /mod/quiz/locallib.php . Elimina el intento. La consulta esta hecha para que ordene la nota mas alta en primer lugar    por lo que los siguientes en orden serian con menor nota.

    }

}

¿que os parece?¿podria funcionar?

Pd: Moodle 3.8.9

Promedio de valoraciones: -
En respuesta a Pablo Lo

Re: Limpieza intentos examenes (quiz)

de Carlos Massoglia -
Hola Pablo,

yo creo que lo qu eintentas hacer es sumamente riesgoso. Me parece que una lógica más cautelosa sería:

1.- Obtener todos los cursos de tu plataforma distintos a la portada
2.- Por cada curso obtener todas las instancias de actividad quiz
3.- Por cada instancia de la actividad quiz obtener todos los intentos
4.- Con los resultados de los intentos agruparlos por userid y dejar fuera el más alto
5.- Con el arreglo que generarás en el paso 4 iterarlo e ir eliminando dichos intentos

El riesgo que veo de lo que propones en tu código es que no estás considerando en tu consulta el curso, por lo tanto cuando comiences a iterar puede que en ciertas condiciones se te mezclen los resultados de los intentos de un estudiante y termines eliminando todos los intentos, excepto el de mejor nota, pero entre todos los cursos y quices que haya para dicho usuario en la Base de Datos. Si haces el análisis por curso y cuestionario y además generando un arreglo solo con lo que quieres eliminar en principio te permitirá validar que la info que vas a eliminar es la correcta (para esto tiras un print de la variable que contiene los elementos a eliminar, pero sin hacer ninguna eliminación) y cuando estés seguro que has construido bien dicho arreglo y que no estás eliminando nada incorrecto haces la llamada a la función quiz_delete_attempt.

Saludos.