ORM - Tests Take
Presentación de exámenes para la ORM
Seguridad ¶
Procesos para ingresar en la presentación de la prueba
Obtener datos iniciales del examen ¶
Devuelve los datos iniciales del evento.
setupGET/security/setup{?eventid}
Example URI
- eventid
required number(required)identificador del evento
200Headers
Content-Type: application/jsonBody
{
"logo": "http://....logo.png",
"eventname": "ORM",
"eventyear": "2024"
}400Headers
Content-Type: application/jsonBody
{
"msg": "Error en la llamada del servicio"
}404Headers
Content-Type: application/jsonBody
{
"msg": "Evento no encontrado"
}500Headers
Content-Type: application/jsonBody
{
"msg": "Error inteno"
}Validación Código ¶
Se busca y valida que el código del alumno tenga alguna prueba asignada en el evento El código del alumno se validará de la siguiente forma: El código debe tener 8 dígitos El código serán los 8 caracteres de la derecha, luego de concatenar el CRC del ID considerando 10 digitos del alumno. Por ejemplo: Código enviado: 12345699 ID: 0000123456 CRC=1233768764374699 tomar unir ID y 2 caracteres de la derecha del CRC 000012345699 comparar solo con los 8 de más a la derecha 12345699 Debe validarse que esté activo, asociado en la tabla inscripted a un colegio que tenga el tests y que corresponda con el grado del alumno en la inscripción Debe devolver una lista de 4 colegios aleatorios que pertenezcan al MISMO PAíS. Siendo solo uno el verdadero
checkcodePOST/security/checkcode{?eventid,pupilcode}
Example URI
- eventid
required number(required)identificador del evento
- pupilcode
required string(required)código del alumno
200Headers
Content-Type: application/jsonBody
{
"schools": [
{
"id": 1,
"name": "Colegio UNO",
"dsc": "Estado - Municipio (Si Tiene)"
},
...
]
}400Headers
Content-Type: application/jsonBody
{
"msg": "Error en la llamada del servicio"
}404Headers
Content-Type: application/jsonBody
{
"msg": "No tenemos ningún alumno registrado con ese código",
"instructions": "Si necesitas ayuda comunícate con 0800-ORMVE" // Texto fijo
}500Headers
Content-Type: application/jsonBody
{
"msg": "error retornado al programador desde mysql_error()"
}Validación Colegio ¶
Se valida que el alumno pertenezca al colegio y esté inscrito en la prueba y corresponda el grado. Si todo está OK, se debe generar un sessionid para proseguir el examen
checkschoolPOST/security/checkschool{?pupilcode,schoolid}
Example URI
- pupilcode
required string(required)código del alumno
- schoolid
required number(required)identificador del colegio
200Headers
Content-Type: application/jsonBody
{
"sessionid": "876879876876876876976987",
"fullname": "José Manuel Pérez Gutierrez",
"schoolname": "Colegio Santiago de León de Caracas",
"schooladdress": "Miranda - Chacao",
"tests": [
{
"id": 1
"name": "Examen UNO"
"blockable": false,
"blocktimes": {
"short": 10,
"long": 20
}
},
...
]
}400Headers
Content-Type: application/jsonBody
{
"msg": "Error en la llamada del servicio"
}401Headers
Content-Type: application/jsonBody
{
"msg": "Examen Bloqueado"
}403Headers
Content-Type: application/jsonBody
{
"msg": "Tiempo del examen excedido"
}404Headers
Content-Type: application/jsonBody
{
"msg": "Combinación test-pupil-school inválida"
}500Headers
Content-Type: application/jsonBody
{
"msg": "error retornado al programador desde mysql_error()"
}Actualizar Inscrito ¶
Se actualiza la información del alumno.
updatepupilPOST/security/updatepupil{?sessionid,email,FOTO}
Example URI
- sessionid
required string(required)identificador de la sessión
optional string(required)correo electrónico
- FOTO
optional file(required)fotografía
200Headers
Content-Type: application/jsonBody
{
"id": 1, // identificador de actualización
}400Headers
Content-Type: application/jsonBody
{
"msg": "Error en la llamada del servicio"
}401Headers
Content-Type: application/jsonBody
{
"msg": "Sesión expirada o inválida"
}500Headers
Content-Type: application/jsonBody
{
"msg": "error retornado al programador desde mysql_error()"
}Examen ¶
Procesos para realizar el examen
Preparación del la respuesta del examen ¶
Devuelve los datos iniciales del examen. Se registra la información que relaciona el inscripted con el test en la tabla testtakers
setupGET/tests/setup{?sessionid,testid}
Example URI
- sessionid
required string(required)identificador de la sesión
- testid
required number(required)identificador del examen
200Headers
Content-Type: application/jsonBody
{
"instructions": [
{
"id": 1,
"content": "<html>...</html>",
"usepicture": true,
"backallowed": true,
"image": {
"url": "http:/..../archivo.png",
"type": "image/png"
}
},
...
]
}400Headers
Content-Type: application/jsonBody
{
"msg": "Error en la llamada del servicio"
}401Headers
Content-Type: application/jsonBody
{
"msg": "Sesión expirada o inválida"
}404Headers
Content-Type: application/jsonBody
{
"msg": "Prueba no encontrada"
}500Headers
Content-Type: application/jsonBody
{
"msg": "Error inteno"
}Próxima Pregunta ¶
Va a la siguiente pregunta de la prueba considerando lo siguiente:
-
Si está vacío el campo startedat de la tabla testtakers se le coloca el NOW
-
Según el campo randomshow de la tabla tests intercambiar aleatoriamente las preguntas
-
Si no hay más preguntas disponibles llenar el campo finishedat de la tabla testtakers
-
Si no hay más preguntas disonibles cambiar el retorno colo car finished = true
NOTA: La aleatoriedad de las preguntas debe respetar la dificultad de las misma
El Hash debe ser un MD5 del id de testtakers
nextPOST/tests/next{?back,testid,questionidlast,sessionid}
Example URI
- back
optional number(required)por defecto vale 0. (1=ir hacia atrás, 0=ir hacia adelante)
- testid
required number(required)Identificador del examen
- questionidlast
optional number(required)ultima pregunta respondida. solo necesaria en examenetes aleatorios
- sessionid
required string(required)identificador de la sesión
200Headers
Content-Type: application/jsonBody
{
"finished": false,
"uploadfiles": "", // Hash si hay que subir imágenes, "" si no
"lefttime": [ // tiempo transcurrido desde el inicio de la prueba
"days": 0,
"hours": 4,
"minutes": 23,
"seconds": 12
],
"actualquestion": 1,
"totalquestions": 23,
"question": {
"id": 1, // identificador de la pregunta
"content": "", // richtext
"displaytype": {
"id": 1, // 1=richtext, 2=SCORM
"name": "Richtext"
},
"scorm": {
"mode": 1, // 0=Ventana Nueva, 1=Embebido, 2=Flotante
"utl": : "http://...", // ESTO NO ESTOY MUY SEGURO
},
"type": 1, // 1=seleccion simple, 2=seleccion multiple, 3=texto corto, 4=desarrollo
"options": [ // cuando type es 1 o 2
{
"id": 1, // deben venir ordenadas por ord
"value": "Valor UNO", // string si texto, url si imagen
"contettype": "text/plain", //"text/plain", "image/png", "image/jpg"
},
...
],
"type4": { // cuando es type 4 (desarrollo)
"admittext": true,
"attachcount": 3
}
},
"answer": "{ 'questiontype1id': 1 }" // revisar formato del tests/answer
}200Headers
Content-Type: application/jsonBody
{
"finished": true,
"finishtime": [ // tiempo total de la prueba transcurrido
"days": 0,
"hours": 4,
"minutes": 23,
"seconds": 12
]
}400Headers
Content-Type: application/jsonBody
{
"msg": "Error en la llamada del servicio"
}401Headers
Content-Type: application/jsonBody
{
"msg": "Examen Bloqueado"
}403Headers
Content-Type: application/jsonBody
{
"msg": "Sesión expirada o inválida"
}404Headers
Content-Type: application/jsonBody
{
"msg": "Prueba no encontrada"
}500Headers
Content-Type: application/jsonBody
{
"msg": "Error inteno"
}Actualizar Respuesta ¶
Incluye/actualiza la respuesta a una pregunta
Formato del Response:
-
Sel Simple { “questiontype1id”: 1 }
-
Sel Multiple { “questiontype2id”: [1,2,3,4] }
-
Completación Simple { “response”: “Azul” }
-
Desarrollo { “text”: “…”, “attachments”: [ { “filename”: “attachuno.pdf”, “mimetype”: “application/pdf” }, … ] }
answerPOST/tests/answer{?sessionid,questionid,response}
Example URI
- sessionid
required string(required)identificador de la sesión
- questionid
required number(required)identificador de la pregunta
- response
required json(required)Ver explicación arriba
200Headers
Content-Type: application/jsonBody
{
"id": 1 // identificador actualizado
}400Headers
Content-Type: application/jsonBody
{
"msg": "Error en la llamada del servicio"
}401Headers
Content-Type: application/jsonBody
{
"msg": "Examen Bloqueado"
}403Headers
Content-Type: application/jsonBody
{
"msg": "Sesión expirada o inválida"
}404Headers
Content-Type: application/jsonBody
{
"msg": "Prueba no encontrada"
}500Headers
Content-Type: application/jsonBody
{
"msg": "Error inteno"
}Bloquear Prueba ¶
Bloquea/desbloquea una prueba, si se bloquea coloca el timestamp en el campo blocked de la tabla testtakers, si desbloquea lo pone en null. Cada acción debe generar un log en el campo log de testtakers, indicando la fecha y hora y la acción según el motive
blockPOST/tests/block{?sessionid,testid,motive}
Example URI
- sessionid
required string(required)identificador de la sesión
- testid
required number(required)Identificador del examen
- motive
required number(required)0=desbloquea, 1=salida de full screen, 2=perdida de foco
200Headers
Content-Type: application/jsonBody
{
"id": 1 // 1=bloqueada, 0+debloqueada
}400Headers
Content-Type: application/jsonBody
{
"msg": "Error en la llamada del servicio"
}403Headers
Content-Type: application/jsonBody
{
"msg": "Sesión expirada o inválida"
}404Headers
Content-Type: application/jsonBody
{
"msg": "Prueba no encontrada"
}500Headers
Content-Type: application/jsonBody
{
"msg": "Error inteno"
}Listar Respuestas ¶
Muestra un listado de las respuestas ubicadas en la tabla answers para un testtaker específico.
listPOST/tests/answers/list{?hash}
Example URI
- hash
required string(required)hash contentivo del takerid con MD5
200Headers
Content-Type: application/jsonBody
{
"testtaker": {
"id": 1,
"fullname": "José Manuel Pérez Gutierrez",
"schoolname": "Colegio Santiago de León de Caracas",
"schooladdress": "Miranda - Chacao",
"tests": {
"id": 1
"name": "Examen UNO"
}
}
"answers": [
{
"id": 1, // id de la tabla answers
"previousupload": 0, // Número de archivos existentes
"question": {
"id": 1,
"number": 1, // realquestionnumber
"content": "Contenido de la pregunta..."
},
"hash": "A7657657BFE88767..." // MD5 usando testtakerid+answerid
},
...
]
}400Headers
Content-Type: application/jsonBody
{
"msg": "Error en la llamada del servicio"
}403Headers
Content-Type: application/jsonBody
{
"msg": "Sesión expirada o inválida"
}404Headers
Content-Type: application/jsonBody
{
"msg": "Prueba no encontrada"
}500Headers
Content-Type: application/jsonBody
{
"msg": "Error inteno"
}Subir Archivo de Respuesta ¶
Valida y asigna archivos a una respuesta específica
uploadfilePOST/tests/answers/uploadfile{?hash,FILES}
Example URI
- hash
required string(required)Hash retornado por el servicio /tests/answers/list en la pregunta
- FILES
file required(required)Archivos a asignar a la rspuesta
200Headers
Content-Type: application/jsonBody
{
"cnt": 4 // número de archivos asignados
}400Headers
Content-Type: application/jsonBody
{
"msg": "Error en la llamada del servicio"
}403Headers
Content-Type: application/jsonBody
{
"msg": "Hash o espuesta inválidos"
}500Headers
Content-Type: application/jsonBody
{
"msg": "Error inteno"
}