def home_estudiante(request): estudiante = utils.reconstruir_estudiante(request) envios = Envio.buscar_envios_estudiante(estudiante.id)[0:3] notificaciones = Notificacion.buscar_notificaciones_pendientes_usuario( estudiante.id)[0:3] lista_parejas = ResultadoTarea.parejas_tarea_resultado(estudiante, True)[0:3] estadisticas = dict() estadisticas["respuestas"] = ComentarioPregunta.objects.filter( autor_id=estudiante.id).count() estadisticas["intentos"] = Envio.objects.filter( estudiante_id=estudiante.id).count() estadisticas["resueltos"] = ResultadoEstudiante.objects.filter( estudiante_id=estudiante.id).filter(resuelto=True).count() if estadisticas["intentos"] > 0: estadisticas["tasa"] = str( int((estadisticas["resueltos"] / estadisticas["intentos"]) * 100)) + "%" else: estadisticas["tasa"] = "0%" template_name = "dashboard/homes/home_estudiante.html" context = { "envios_cortados": envios, "notificaciones_cortadas": notificaciones, "lista_tareas": lista_parejas, "estudiante": estudiante, "estadisticas": estadisticas } return utils.render_page(request, template_name, context)
def tareas(request, todas=True, titulo="Lista de tareas"): """ Muestra las tareas de un estudiante, usando el template 'tareas.html' Si el párametro todas es verdadero se muestran todas las tareas. De lo contrario se muestran sólo las tareas pendientes. """ estudiante = utils.reconstruir_estudiante(request) lista_parejas = ResultadoTarea.parejas_tarea_resultado(estudiante, todas) template_name = "dashboard/tareas/tareas.html" context = {"lista_tareas": lista_parejas, "titulo": titulo} return utils.render_page(request, template_name, context)
def tarea(request, id_tarea): """ Muestra los detalles de una tarea, usando el template tarea.html """ tarea = get_object_or_404(Tarea, pk=id_tarea) estudiante = utils.reconstruir_estudiante(request) resultado = ResultadoTarea.buscar_resultado_tarea_estudiante( estudiante.id, tarea.id) resultado.actualizar_resultado_tarea() template_name = "dashboard/tareas/tarea.html" context = {"tarea": tarea, "resultado_tarea": resultado} return utils.render_page(request, template_name, context)
def buscar_tareas_profesor_con_estadisticas(self): from dashboard.models.tareas import Tarea, ResultadoTarea lista_parejas = [] secciones = self.secciones.all().order_by('-nombre_semestre', 'numero') for seccion in secciones: tareas_seccion = Tarea.buscar_tareas_seccion( seccion.id).order_by("-fecha_limite") for tarea in tareas_seccion: # estadisticas_tarea = ResultadoTarea.buscar_estadisticas_tarea(tarea.id) estadisticas_tarea = ResultadoTarea.buscar_estadisticas_tarea_rapida( tarea) lista_parejas.append((tarea, estadisticas_tarea)) lista_parejas.sort(key=lambda pareja: pareja[0].fecha_limite, reverse=True) return lista_parejas
def buscar_tareas_profesor(self): from dashboard.models.tareas import Tarea, ResultadoTarea lista_parejas = [] secciones = self.secciones.all().order_by('-nombre_semestre', 'numero') for seccion in secciones: tareas_seccion = Tarea.buscar_tareas_seccion( seccion.id).order_by("-fecha_limite") for tarea in tareas_seccion: avance = 0 cantidad = 0 resultados_seccion = ResultadoTarea.buscar_resultados_tarea( tarea.id) for resultado in resultados_seccion: cantidad += 1 avance += resultado.avance if cantidad > 0: avance_tarea = round(avance / cantidad, 1) else: avance_tarea = 0 lista_parejas.append((tarea, avance_tarea)) lista_parejas.sort(key=lambda pareja: pareja[0].fecha_limite, reverse=True) return lista_parejas
def analizar_seccion(request, id_seccion): """ Despliega la página donde se ve el resumen de una sección Parámetros: request: la petición HTTP id_seccion: el identificador de la sección """ # TODO Verificar que quien consulta la sección sea profesor de la seccion print("ANALIZANDO SECCION") seccion = get_object_or_404(Seccion, pk=id_seccion) estudiantes = seccion.estudiante_set.all().order_by( "solo_apellido", "solo_nombre") tareas = seccion.tarea_set.all() # Cargar la información de los estudiantes de la sección resultados_estudiantes = [] for est in estudiantes: tareas_estudiante = [] for tarea in tareas: res_tarea = ResultadoTarea.buscar_resultado_tarea_estudiante( est.id, tarea.id) if res_tarea is None: res_tarea = ResultadoTarea.crear_resultado_tarea(est, tarea) res_tarea.slug = str(est.id) + str(tarea.id) tareas_estudiante.append(res_tarea) resultados_estudiantes.append((est, tareas_estudiante)) # Cargar la información de los tags intentados por los estudiantes de la sección tags = Tag.buscar_tags_intentados_seccion(id_seccion) tuplas_tags = [] for tag in tags: estadisticas = Tag.calcular_estadisticas_tag_seccion( tag.texto, id_seccion) # desempaquetar la tupla porcentaje, probs, resueltos, intentos = estadisticas tuplas_tags.append((tag, porcentaje, probs, resueltos, intentos)) # Cargar la información de los problemas intentados por los estudiantes de la sección probs = Problema.buscar_problemas_intentados_seccion(id_seccion) lista_problemas = [] for prob in probs: resultados = Problema.calcular_estadisticas_problema_seccion( prob.id, id_seccion) # desempaquetar la tupla efectividad, totales, exitosos, num_estudiantes, num_estudiantes_exitosos = resultados resultado = { "efectividad": efectividad, "exitosos": exitosos, "totales": totales, "num_estudiantes": num_estudiantes, "num_estudiantes_exitosos": num_estudiantes_exitosos } lista_problemas.append((prob, resultado)) # Organizar la información para el template y renderizarlo template_name = "dashboard/secciones/seccion.html" context = { "seccion": seccion, "estudiantes": estudiantes, "tareas": tareas, "resultados_estudiantes": resultados_estudiantes, "tags": tuplas_tags, "lista_problemas": lista_problemas } return utils.render_page(request, template_name, context)
def analisis_tarea(request, id_tarea): """ Mostrarle al profesor el comportamiento de su sección para una tarea específica. La plantilla utilizada es 'tareas_analisis.html' """ tarea = get_object_or_404(Tarea, pk=id_tarea) profesor = utils.reconstruir_profesor(request) terminaron = 0 empezaron = 0 siguen_en_0 = 0 sin_empezar = 0 problemas = tarea.problemas.all() for i, pr in enumerate(problemas): pr.numero = i + 1 resultados_estudiantes = [] seccion = tarea.seccion estudiantes = seccion.estudiante_set.all().order_by( "solo_apellido", "solo_nombre") for est in estudiantes: res_tarea = ResultadoTarea.buscar_resultado_tarea_estudiante( est.id, id_tarea) if res_tarea is None: res_tarea = ResultadoTarea.crear_resultado_tarea(est, tarea) res_problemas = res_tarea.problemas_tarea resultados_estudiantes.append((est, res_tarea, res_problemas)) if res_tarea.avance == 100: terminaron += 1 elif res_tarea.avance > 0: empezaron += 1 else: empezo = False for problema, res_problema in res_problemas: if res_problema.cantidad_envios_actual > 0: empezo = True if empezo: siguen_en_0 += 1 else: sin_empezar += 1 colores_base = ["#24ba45", "#C9DD28", "#D95C5C", "#989898"] colores = [] estadisticas = [] etiquetas = [] if terminaron > 0: etiquetas.append("Terminaron: " + str(terminaron)) colores.append(colores_base[0]) estadisticas.append(terminaron) if empezaron > 0: etiquetas.append("En progreso: " + str(empezaron)) colores.append(colores_base[1]) estadisticas.append(empezaron) if siguen_en_0 > 0: etiquetas.append("Empezaron pero están en 0: " + str(siguen_en_0)) colores.append(colores_base[2]) estadisticas.append(siguen_en_0) if sin_empezar > 0: etiquetas.append("No han empezado: " + str(sin_empezar)) colores.append(colores_base[3]) estadisticas.append(sin_empezar) template_name = "dashboard/tareas/tareas_analisis.html" context = { "tarea": tarea, "problemas_tarea": problemas, "resultados_estudiantes": resultados_estudiantes, "estadisticas": estadisticas, "etiquetas": etiquetas, "colores": colores } return utils.render_page(request, template_name, context)
def revisar_envio(request, slug_envio): """ Esta es la función que se debe invocar cuando se termina de revisar un envío de un usuario y depende del slug de un envío. Si se invoca dos veces para el mismo envío, y el envío no ha cambiado, no debería haber cambios en el resto del sistema. """ envio = None try: envio = Envio.objects.get(slug=slug_envio) print("Se va a revisar el envio {}".format(slug_envio)) except: pass if envio is not None: avance = 0 res_estudiante = envio.resultado_estudiante # Resultado del estudiante ya registrado para el problema del envío problema_resuelto = res_estudiante.resuelto # Lo que ya estaba registrado sobre el problema dificultad = envio.problema.dificultad num_pruebas = envio.problema.prueba_set.all().count() num_intentos = envio.numero # esta es la cantidad incluyendo al envío en revisión resultados_prueba = envio.consultar_resultados_pruebas # Lo que los workers dejaron registrado envio_exitoso = True for resultado in resultados_prueba: if not resultado.resultado_exitoso: print("Hay una prueba que no fue exitosa, el envio {} no es aceptable".format(slug_envio)) envio_exitoso = False else: avance += 100 * resultado.prueba.peso print("El envío {} fue exitoso=={}".format(slug_envio, envio_exitoso)) if envio_exitoso and not problema_resuelto: # Esta condición verifica tanto el envío actual como el resultado ya almacenado. # De esta forma evitamos volver a entregar puntos sobre problemas resueltos. print("El envío {} fue exitoso y el usuario no había resuelto el problema antes".format(slug_envio)) avance = 100 # Si el problema está resuelto, se fuerza 100 para evitar problemas de redondeo o inconsistencias en los pesos puntos_envio = calcular_puntos(dificultad, num_pruebas, num_intentos) res_estudiante.resuelto = True res_estudiante.puntos = puntos_envio res_estudiante.save() res_estudiante.estudiante.puntos += puntos_envio res_estudiante.estudiante.save() elif envio_exitoso and problema_resuelto: # El problema ya estaba resuelto, pero igual el envio debe quedar con información consistente print("El envío {} fue exitoso PERO el usuario YA había resuelto el problema antes".format(slug_envio)) avance = 100 puntos_envio = calcular_puntos(dificultad, num_pruebas, num_intentos) puntos_actuales = res_estudiante.puntos if puntos_actuales < puntos_envio: # Esto se incluye en caso de que haya una recalificación y permite subir los puntos delta = puntos_envio - puntos_actuales res_estudiante.puntos = puntos_envio res_estudiante.save() res_estudiante.estudiante.puntos += delta res_estudiante.estudiante.save() envio.avance = avance envio.estado = CORRECTO if envio_exitoso else INCORRECTO envio.save() ResultadoTarea.actualizar_resultado_tarea_envio(envio) else: print("No encontré el envío") return HttpResponse("OK")