コード例 #1
0
def monitores(request):
    """
    Despliega la página para cargar los monitores de todos los cursos.
    Parámetros:
        request: la petición HTTP
    """
    forma = MonitoresForm(request.POST or None, request.FILES or None)
    tipo_forma = str(request.POST.get("tipo_forma", None))
    mensaje = ""

    if tipo_forma == 'None':
        template_name = "dashboard/secciones/monitores.html"
        forma = MonitoresForm()
        context = {"forma": forma, "mensaje": mensaje}
        return utils.render_page(request, template_name, context)

    elif forma.is_valid():
        data = forma.cleaned_data
        nombre_semestre = data.get("semestre")
        curso = data.get("curso")

        file_type = "csv"
        noise = uuid.uuid4().hex[:16]
        filename = "monitores_" + noise + "." + file_type
        utils.handle_uploaded_csv(request.FILES['archivo_csv'], filename)

        archivo = open('image/' + file_type + '/' + filename, "r")
        contenido = archivo.read()
        archivo.close()

        n_monitores, n_secciones, repetidos, promovidos, adicional = cargar_archivo_csv_monitores(
            contenido, curso, nombre_semestre)

        plantilla = "Se cargaron {} monitores para el semestre {} en {} secciones. {} ya habían sido monitores y {} eran estudiantes."
        mensaje = plantilla.format(n_monitores, nombre_semestre, n_secciones,
                                   len(repetidos), len(promovidos))
        if adicional is not None:
            mensaje += "\n" + adicional

        template_name = "dashboard/secciones/secciones_sistema.html"
        secciones = Seccion.secciones()

        context = {
            "secciones": secciones,
            "mensaje": mensaje,
            "repetidos": repetidos,
            "promovidos": promovidos
        }

        return utils.render_page(request, template_name, context)

    else:
        mensaje = "Hubo un problema validando el formulario"
        return secciones(request)
コード例 #2
0
def submissions2(request):
    """
     FUNCION DE PRUEBA - DESABILITADA
    """
    from pygments.styles import get_style_by_name
    from pygments import highlight
    from pygments.lexers import PythonLexer
    from pygments.formatters import HtmlFormatter

    code = '''
def submission(request, id):
    template_name = "dashboard/submissions.html"
    context = {}
    return render(request, template_name, context)'''
    html_code = highlight(
        code, PythonLexer(),
        HtmlFormatter(cssclass="source", linenos=True, style='friendly'))

    martor_form = MartorForm()

    template_name = "dashboard/submissions.html"
    context = {
        "html_code":
        html_code,
        "martor_form":
        martor_form,
        "content":
        "# Titulo \n![awesome](http://i.imgur.com/hvguiSn.jpg) \n![https://i.blogs.es/5efe2c/cap_001/450_1000.jpg](http://i.blogs.es/5efe2c/cap_001/450_1000.jpg)"
    }
    return utils.render_page(request, template_name, context)
コード例 #3
0
def analisis_envios(request, envios, titulo="Analizando envios"):
    problemas = dict()

    for envio in envios:
        problema = problemas.get(envio.problema.id, None)
        if problema is None:
            problema = envio.problema
            problema.envios_seleccionados = list()
            problemas[problema.id] = problema
        problema.envios_seleccionados.append(envio)

    for problema in problemas.values():
        resumen_problema = []
        for envio in problema.envios_seleccionados:
            pruebas = envio.problema.consultar_pruebas
            resultados_envio = []
            for prueba in pruebas:
                resultado_prueba = ResultadoPrueba.objects.filter(
                    envio=envio, prueba=prueba).first()
                if resultado_prueba is not None:
                    resultados_envio.append(resultado_prueba)
                else:
                    resultados_envio.append(None)
            resumen_problema.append((envio, resultados_envio))
        problema.matriz = resumen_problema

    template_name = "dashboard/envios/envios_analisis.html"
    context = {
        "problemas": problemas.values(),
        "titulo": titulo,
    }

    return utils.render_page(request, template_name, context)
コード例 #4
0
def new_submission_vacia(request, problema, estudiante):
    """
    Muestra una crear un nuevo envio.
    Si el estudiante ya hizo un envío para ese mismo problema, el código inicial
    mostrado es el código del envío anterior.
    """
    numero_envio = contar_envios_anteriores(problema.id, estudiante.id) + 1
    codigo_envio = problema.plantilla_funcion
    if numero_envio > 1:
        ultimo = ResultadoEstudiante.buscar_resultado_problema_estudiante(
            problema.id, estudiante.id)
        codigo_envio = ultimo.contenido

    forma = EnvioForm(
        initial={
            'codigo_envio': codigo_envio,
            'slug_problema': problema.slug,
            'tipo_forma': 'nuevo_envio',
            'numero_envio': numero_envio
        })

    template_name = "dashboard/envios/envio_new.html"
    context = {
        "problema":
        problema,
        "hace_parte_tarea_vencida":
        problema.hace_parte_tarea_vencida(estudiante.seccion.id),
        "forma":
        forma,
        "numero_envio":
        numero_envio,
        "mensaje":
        ""
    }
    return utils.render_page(request, template_name, context)
コード例 #5
0
def new_submission_revisar(request, problema, estudiante):
    forma = EnvioForm(request.POST or None, request.FILES or None)
    mensaje = ""
    codigo_envio = ""
    numero_envio = 1

    if forma.is_valid():
        cd = forma.cleaned_data
        numero_envio = cd.get('numero_envio')
        codigo_envio = cd.get('codigo_envio')
    else:
        print(forma.errors)

    forma = EnvioForm(
        initial={
            'codigo_envio': codigo_envio,
            'slug_problema': problema.slug,
            'tipo_forma': 'nuevo_envio',
            'numero_envio': numero_envio
        })

    template_name = "dashboard/envios/envio_new.html"
    context = {
        "problema": problema,
        "forma": forma,
        "numero_envio": numero_envio,
        "mensaje": mensaje
    }
    return utils.render_page(request, template_name, context)
コード例 #6
0
def analisis_estudiante(request, id_estudiante):
    estudiante = get_object_or_404(Estudiante, pk=id_estudiante)
    medallas = Logro.buscar_medallas_usuario(estudiante.id)

    resultados = ResultadoEstudiante.buscar_resultados_estudiante(estudiante.id)
    preguntas = Pregunta.buscar_preguntas_estudiante(estudiante.id)
    respuestas = ComentarioPregunta.buscar_respuestas_estudiante(estudiante.id)

    tags = Tag.buscar_tags_intentados(id_estudiante)

    parejas_tags = []
    for tag in tags:
        porcentaje, puntos = Tag.calcular_estadisticas_tag(tag.texto, estudiante.id)
        parejas_tags.append((tag, porcentaje, puntos))


    template_name = "dashboard/perfil/analisis_estudiante.html"
    context = {"estudiante": estudiante,
               "medallas": medallas,
               "lista_problemas": resultados,
               "preguntas_estudiante": preguntas,
               "respuestas_estudiante": respuestas,
               "tags": parejas_tags}
    
    return utils.render_page(request, template_name, context)
コード例 #7
0
def cambiar_password(request):
    template_name = "dashboard/perfil/perfil.html"
    usuario = utils.reconstruir_usuario(request)

    if usuario:
        mensaje_error = None
        mensaje_ok = None
        form = PasswordForm(request.POST or None, request.FILES or None)
        if form.is_valid():
            cd = form.cleaned_data
            actual = cd.get("actual")
            nuevo = cd.get("nuevo")
            confirmacion = cd.get("confirmacion")

            correcto = usuario.verificar_password(actual)
            if correcto:
                mensaje_error = validar_nuevo_password(nuevo, confirmacion)
                if mensaje_error is None:
                    usuario.cambiar_password(nuevo)
                    mensaje_ok = "El password se cambió exitosamente"
            else:
                mensaje_error = "El password actual no es correcto"

        context = {
            "usuario": usuario,
            "forma_avatar": AvatarForm(),
            "forma_password": PasswordForm(),
            "forma_alias": AliasForm(initial={'alias': usuario.alias}),
            "mensaje_error": mensaje_error,
            "mensaje_ok": mensaje_ok
        }
        return utils.render_page(request, template_name, context)
    else:
        return home(request)
コード例 #8
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)
コード例 #9
0
def cambiar_alias(request):
    template_name = "dashboard/perfil/perfil.html"
    usuario = utils.reconstruir_usuario(request)

    if usuario:
        mensaje_error = None
        mensaje_ok = None
        form = AliasForm(request.POST or None, request.FILES or None)
        if form.is_valid():
            cd = form.cleaned_data
            alias = cd.get("alias")
            usuario.alias = alias
            usuario.save()
            mensaje_ok = "El alias se cambió exitosamente por: " + alias
        else:
            mensaje_error = "No se pudo cambiar el alias del usuario"

        context = {
            "usuario": usuario,
            "forma_avatar": AvatarForm(),
            "forma_password": PasswordForm(),
            "forma_alias": AliasForm(initial={'alias': usuario.alias}),
            "mensaje_error": mensaje_error,
            "mensaje_ok": mensaje_ok
        }
        return utils.render_page(request, template_name, context)
    else:
        return home(request)
コード例 #10
0
def guardar_solucion_referencia(request, problema):
    forma = SolucionReferenciaForm(request.POST or None, request.FILES or None)

    context = {
        "id_problema": problema.id,
        "problema": problema,
        "forma": forma,
        "codigo_limpio": "",
        "evaluacion": None,
        "mensaje": ""
    }

    if forma.is_valid():
        cd = forma.cleaned_data
        codigo = cd.get('codigo_solucion')
        resultado = revisar_sintaxis_codigo(codigo)
        if resultado[0] == 0:
            evaluacion = None
            problema.solucion_referencia = codigo
            problema.save()
        else:
            evaluacion = list()
            if len(resultado[1]) > 0:
                evaluacion.extend(resultado[1].strip().split("\n"))
            if len(resultado[2]) > 0:
                evaluacion.extend(resultado[2].strip().split("\n"))

        context["evaluacion"] = evaluacion
    else:
        mensaje = "Hubo un problema validando el formulario"
        context["mensaje"] = mensaje

    template_name = "dashboard/problemas/problema_ad.html"
    return utils.render_page(request, template_name, context)
コード例 #11
0
def notificaciones(request):
    usuario = utils.reconstruir_usuario(request)
    template_name = "dashboard/notificaciones.html"
    context = {
        "notificaciones_completas":
        Notificacion.buscar_notificaciones_usuario(usuario)
    }
    return utils.render_page(request, template_name, context)
コード例 #12
0
def submission_estudiante(request, slug):
    envio = get_object_or_404(Envio, slug=slug)

    resultados = ResultadoPrueba.buscar_resultados_pruebas(envio.id)

    template_name = "dashboard/envios/envio.html"
    context = {"envio": envio, "resultados": resultados, "es_profesor": True}

    return utils.render_page(request, template_name, context)
コード例 #13
0
def problemas_autor(request, id_autor):
    lista_parejas = []
    lista_problemas = Problema.objects.filter(autor_id=id_autor)

    for pr in lista_problemas:
        lista_parejas.append((pr, None))

    template_name = "dashboard/problemas_estudiante.html"
    context = {"lista_problemas": lista_parejas}
    return utils.render_page(request, template_name, context)
コード例 #14
0
def submission(request, slug):
    envio = get_object_or_404(Envio, slug=slug)
    estudiante = utils.reconstruir_estudiante(request)
    if estudiante.id != envio.estudiante.id:
        return redirect("envios")

    resultados = ResultadoPrueba.buscar_resultados_pruebas(envio.id)

    template_name = "dashboard/envios/envio.html"
    context = {"envio": envio, "resultados": resultados}
    return utils.render_page(request, template_name, context)
コード例 #15
0
ファイル: tareas.py プロジェクト: nbellol/calificador_prueba
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)
コード例 #16
0
def preguntas_estudiante(request, id_estudiante):
    """
       Mostrar la lista de preguntas de un estudiante ...
    """
    estudiante = get_object_or_404(Estudiante, pk=id_estudiante)
    preguntas = Pregunta.buscar_preguntas_estudiante(estudiante.id)

    template_name = "dashboard/secciones/preguntas_estudiante.html"

    context = {"est": estudiante, "preguntas_estudiante": preguntas}
    return utils.render_page(request, template_name, context)
コード例 #17
0
ファイル: tareas.py プロジェクト: nbellol/calificador_prueba
def tarea_nueva(request):
    """
       Mostrar la forma para crear una nueva tarea, usando la plantilla
       'tarea_nueva.html'
    """
    profesor = utils.reconstruir_profesor(request)
    forma = NuevaTareaForma(profesor.buscar_secciones_profesor())
    # ESTO NO FUNCIONA forma.fields['problemas'].initial=list(Problema.objects.all())

    template_name = "dashboard/tareas/tarea_nueva.html"
    context = {"id_tarea": None, "forma": forma}
    return utils.render_page(request, template_name, context)
コード例 #18
0
ファイル: tareas.py プロジェクト: nbellol/calificador_prueba
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)
コード例 #19
0
ファイル: tareas.py プロジェクト: nbellol/calificador_prueba
def tareas_propias(request):
    """
       Muestra todas las tareas de todas las secciones del profesor.
       Para cada sección se calcula el avance de los estudiantes.
    """
    profesor = utils.reconstruir_profesor(request)
    # lista_parejas = profesor.buscar_tareas_profesor()
    lista_parejas = profesor.buscar_tareas_profesor_con_estadisticas()

    template_name = "dashboard/tareas/tareas_profesor.html"
    context = {
        "lista_tareas": lista_parejas,
        "titulo": "Tareas de mis secciones"
    }
    return utils.render_page(request, template_name, context)
コード例 #20
0
def lista_secciones(request, semestre="None"):
    """
    Despliega la página donde se ve la lista de secciones del sistema con sus principales datos
    Parámetros:
        request: la petición HTTP
        semestre: el semestre para el cual se quieren consultar las secciones
    """
    mensaje = ""
    template_name = "dashboard/secciones/secciones_sistema.html"
    if semestre == "None":
        secciones = Seccion.secciones()
    else:
        secciones = Seccion.secciones_semestre(semestre)

    context = {"secciones": secciones, "mensaje": mensaje}
    return utils.render_page(request, template_name, context)
コード例 #21
0
def ajax_estudiantes_seccion(request, id_seccion):
    if True:  # request.is_ajax():
        seccion = get_object_or_404(Seccion, pk=id_seccion)
        estudiantes = seccion.estudiante_set.all().order_by(
            "solo_apellido", "solo_nombre")
        template_name = "dashboard/bloques/estudiantes_seccion.html"
        context = {"estudiantes": estudiantes, "seccion": seccion}
        return utils.render_page(request, template_name, context)
        """
        todo_items = ['task 1', 'task 2']
        data = json.dumps(todo_items)
        return HttpResponse(data, content_type='application/json')
        """

    else:
        raise Http404
コード例 #22
0
def mostrar_solucion_referencia(request, problema):
    forma = SolucionReferenciaForm()
    forma = SolucionReferenciaForm(
        initial={
            'codigo_solucion': problema.codigo_solucion_referencia,
            'slug_problema': problema.slug,
            'tipo_forma': 'guardar'
        })

    context = {
        "problema": problema,
        "mensaje": "",
        "forma": forma,
        "evaluacion": None
    }
    template_name = "dashboard/problemas/problema_ad.html"
    return utils.render_page(request, template_name, context)
コード例 #23
0
def mostrar_envios(request, envios, context={}, titulo="Lista de envíos"):
    """
       Muestra los envios de un estudiante que lleguen en el parámetro 'envios'
       La plantilla utilizada es "envios.html"
    """
    if request.method == 'GET' and 'page' in request.GET:
        page = request.GET["page"]
    else:
        page = 1

    paginator = Paginator(envios, 8)
    lista_envios = paginator.get_page(page)

    template_name = "dashboard/envios/envios.html"
    context["envios"] = lista_envios
    context["titulo"] = titulo
    return utils.render_page(request, template_name, context)
コード例 #24
0
def home_profesor(request):
    profesor = utils.reconstruir_profesor(request)
    notificaciones = Notificacion.buscar_notificaciones_pendientes_usuario(
        profesor.id)[0:3]
    lista_parejas = profesor.buscar_tareas_profesor()[0:3]
    estudiantes = profesor.buscar_estudiantes_profesor("202010")
    preguntas = Pregunta.buscar_preguntas_problemas_autor(profesor.id)[0:3]

    template_name = "dashboard/homes/home_profesor.html"
    context = {
        "notificaciones_cortadas": notificaciones,
        "lista_tareas": lista_parejas,
        "secciones": profesor.buscar_secciones_profesor("202010"),
        "estudiantes": estudiantes,
        "profesor": profesor,
        "preguntas": preguntas
    }

    return utils.render_page(request, template_name, context)
コード例 #25
0
ファイル: retos.py プロジェクト: nbellol/calificador_prueba
def retos(request, nivel=1):

    lista_problemas = Problema.buscar_retos_nivel(nivel)
    usuario = utils.reconstruir_usuario(request)

    num_avance = 0
    num_total = len(lista_problemas)

    lista_parejas_b = []
    lista_parejas_m = []
    lista_parejas_a = []
    for pr in lista_problemas:
        resultado = pr.buscar_resultado_problema_estudiante(usuario.id)
        if resultado is not None and resultado.resuelto:
            num_avance += 1

        if pr.nivel_reto == BASICO:
            lista_parejas_b.append((pr, resultado))
        elif pr.nivel_reto == MEDIO:
            lista_parejas_m.append((pr, resultado))
        elif pr.nivel_reto == AVANZADO:
            lista_parejas_a.append((pr, resultado))

    if usuario.tipo != ESTUDIANTE:
        avance = None
    elif num_total > 0:
        avance = str(int(round(num_avance / num_total *  100, 0))) + "%"
    else:
        avance = "0%"

    template_name = "dashboard/retos/retos.html"
    context = {"lista_problemas_b": lista_parejas_b,
               "lista_problemas_m": lista_parejas_m,
               "lista_problemas_a": lista_parejas_a,
               "nivel": nivel,
               "tipo_busqueda": "",
               "num_avance": num_avance,
               "num_total": num_total,
               "avance": avance}

    return utils.render_page(request, template_name, context)
コード例 #26
0
ファイル: tareas.py プロジェクト: nbellol/calificador_prueba
def tarea_nueva_crear(request):
    """
       Crear una nueva tarea y muestra el resultado usando analisis_tarea
    """
    profesor = utils.reconstruir_profesor(request)
    print(request.POST)
    forma_simple = NuevaTareaForma(profesor.buscar_secciones_profesor(),
                                   request.POST or None)
    if forma_simple.is_valid():
        print("forma valida")
        terminos_busqueda = forma_simple.cleaned_data.get('terminos')
        forma = NuevaTareaForma(profesor.buscar_secciones_profesor())
        mensaje = None
    else:
        print("INVALIDA!!!", forma_simple.errors)
        forma = forma_simple
        mensaje = forma_simple.errors

    template_name = "dashboard/tareas/tarea_nueva.html"
    context = {"id_tarea": None, "forma": forma, "mensaje": mensaje}
    return utils.render_page(request, template_name, context)
コード例 #27
0
def new_submission_validar(request, problema, estudiante):
    forma = EnvioForm(request.POST or None, request.FILES or None)
    mensaje = ""

    if forma.is_valid():
        cd = forma.cleaned_data
        numero_envio = cd.get('numero_envio')
        codigo = cd.get('codigo_envio').replace('\t', '    ')
        html = utils.pygmentify(codigo, True)
        resultado = revisar_sintaxis_codigo(codigo)
        if resultado[0] == 0:
            evaluacion = None
        else:
            evaluacion = list()
            if len(resultado[1]) > 0:
                evaluacion.extend(resultado[1].strip().split("\n"))
            if len(resultado[2]) > 0:
                evaluacion.extend(resultado[2].strip().split("\n"))

        forma = EnvioForm(
            initial={
                'codigo_envio': html,
                'slug_problema': problema.slug,
                'numero_envio': numero_envio,
                'tipo_forma': 'validada'
            })
        template_name = "dashboard/envios/envio_review.html"
        context = {
            "id_problema": problema.id,
            "problema": problema,
            "numero_envio": numero_envio,
            "forma": forma,
            "codigo_limpio": codigo,
            'evaluacion': evaluacion
        }
        return utils.render_page(request, template_name, context)
    else:
        mensaje = "Hubo un problema validando el formulario"
        return new_submission_revisar(request, problema.id, "", mensaje)
コード例 #28
0
def mostrar_problemas(request,
                      lista_problemas,
                      forma_simple,
                      forma_avanzada,
                      busqueda=None):
    usuario = utils.reconstruir_usuario(request)

    if usuario.tipo == ESTUDIANTE:
        lista_problemas = list(
            filter(lambda prob: prob.publico, lista_problemas))

    lista_parejas = []
    for pr in lista_problemas:
        resultado = pr.buscar_resultado_problema_estudiante(usuario.id)
        lista_parejas.append((pr, resultado))

    tags = Tag.objects.all().order_by('texto')

    paginator = Paginator(lista_parejas, 10)
    if request.method == 'POST':
        page = request.POST.get('page')
    else:
        page = request.GET.get('page')

    lista_parejas = paginator.get_page(page)

    template_name = "dashboard/problemas_estudiante.html"
    context = {
        "lista_problemas": lista_parejas,
        "form": forma_simple,
        "forma_avanzada": forma_avanzada,
        "tags": tags,
        "tipo_busqueda": busqueda,
        "es_admin": usuario.tipo == ADMINISTRADOR,
        "es_profesor": usuario.tipo == PROFESOR
    }

    return utils.render_page(request, template_name, context)
コード例 #29
0
def correr_solucion_referencia(request, problema):
    forma = SolucionReferenciaForm()
    forma = SolucionReferenciaForm(
        initial={
            'codigo_solucion': problema.codigo_solucion_referencia,
            'slug_problema': problema.slug,
            'tipo_forma': 'guardar'
        })

    context = {
        "id_problema": problema.id,
        "problema": problema,
        "forma": forma,
        "codigo_limpio": problema.solucion_referencia,
        "evaluacion": None,
        "mensaje": ""
    }

    resultados = problema.correr_solucion_referencia()
    context["resultados"] = resultados

    template_name = "dashboard/problemas/problema_ad.html"
    return utils.render_page(request, template_name, context)
コード例 #30
0
def perfil(request):
    template_name = "dashboard/perfil/perfil.html"
    usuario = utils.reconstruir_usuario(request)
    if usuario:
        mensaje_error = None
        mensaje_ok = None

        form = AvatarForm(request.POST or None, request.FILES or None)
        if form.is_valid():
            extension = str(request.FILES['avatar']).lower()[-4:]
            size = request.FILES['avatar'].size
            print("Size:", size)
            if extension not in constantes.EXTENSIONES:
                mensaje_error = "Las imágenes de perfil sólo pueden estar en los siguientes formatos: jpg, png o gif"
            elif size > 1024 * 200:
                mensaje_error = "Las imágenes de perfil no pueden tener más de 200 kb."
            else:
                noise = uuid.uuid4().hex[:16]
                filename = usuario.login + noise + ".png"
                utils.handle_uploaded_avatar(request.FILES['avatar'],
                                             usuario.login, filename)
                usuario.avatar = "avatars/" + filename
                usuario.save()
                mensaje_ok = "Se cambió exitosamente la imagen de perfil"

        context = {
            "usuario": usuario,
            "forma_avatar": AvatarForm(),
            "forma_password": PasswordForm(),
            "forma_alias": AliasForm(initial={'alias': usuario.alias}),
            "mensaje_error": mensaje_error,
            "mensaje_ok": mensaje_ok
        }

        return utils.render_page(request, template_name, context)
    else:
        return home(request)