Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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")