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)
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)
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)
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)
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)
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)
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)
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 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)
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)
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)
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)
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)
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)
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 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)
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)
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 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)
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)
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
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)
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)
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)
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)
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)
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)
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)
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)
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)