From 8eda4b28e05509720fb14f6d61cad61a9a745fa7 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Fri, 11 Mar 2005 21:30:43 +0000 Subject: [PATCH] Se agrega un script cgi _muy_ precario para consultar los resultados de las entregas. --- src/sc_suwi | 350 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 350 insertions(+) create mode 100755 src/sc_suwi diff --git a/src/sc_suwi b/src/sc_suwi new file mode 100755 index 0000000..3931b96 --- /dev/null +++ b/src/sc_suwi @@ -0,0 +1,350 @@ +#!/usr/bin/env python2.4 +# -*- encoding: iso-8859-1 -*- +# vim: set et sw=4 sts=4 : + +# Módulos estándar +import os +import sys +import cgi +# Módulos externos +import sqlobject +# Módulos locales +import sercom +from sercom.sqlo import * + +# Inicializo +conf, conn, log = sercom.init('cgi') + +# Para debug web +import cgitb; cgitb.enable() + +#XXX HORRIBLE +PASSWD = conf.get('general', 'claves') + +def http_header_html(req): + return 'Content-type: text/html\r\n\r\n' + +def http_header_zip(req, filename): + return 'Content-type: application/zip\r\n' \ + 'Content-Disposition: attachment;filename=%s\r\n' \ + '\r\n' % filename + +def header(req): + return ''' + + + SUWI - Sercom Ugly Web Interface + + + +''' + pass + +def footer(req): + return ''' + + +''' + pass + +def form(req, submit, str=None): + r = submit + if submit is not None: + r = '
\n' + if str: r += str + r += '\n' % submit + r += '
\n' + return r + +def pre(s): + return '
%s
' % cgi.escape(str(s)) + +def input_login(req): + return '\n' % PASSWD + +def input_curso(req, curso_id): + return input_login(req) \ + + '\n' % curso_id + +def input_entrega(req, entrega_id): + e = Entrega.get(entrega_id, connection=conn) + return input_curso(req, e.curso.id) \ + + '\n' % entrega_id + +def input_zip(req, entrega_id): + return input_entrega(req, entrega_id) \ + + '\n' + +def input_inscripto(req, inscripto_id=None): + if inscripto_id is not None: + return '\n' \ + % inscripto_id + return '' + +def input_pruebas(req, intento_id, inscripto_id=None): + i = Intento.get(intento_id, connection=conn) + r = input_entrega(req, i.entrega.id) + r += '\n' % intento_id + r += input_inscripto(req, inscripto_id) + return r + +def input_intentos(req, entrega_id, inscripto_id): + return input_entrega(req, entrega_id) + input_inscripto(req, inscripto_id) + +def login(req): + r = '

Bienvenido a ' \ + 'SUWI

\n' + r += '

Debe ingresar la contraseña para seguir...

\n' + return r + form(req, 'Entrar', + '

Contraseña:

') + +def curso(req): + cursos = [c for c in Curso.select(connection=conn) if len(c.entregas)] + r = '

Elegir curso

\n' + if cursos: + r += '

Curso:

\n' + else: + r += '

No hay cursos con entregas

\n' + return form(req, 'Ver', r + input_login(req)) + +def entrega(req, curso_id): + c = Curso.get(curso_id, connection=conn) + r = '

Elegir entrega del curso %d-%d-%d

\n' \ + % (c.anio, c.cuatrimestre, c.curso) + r += '

Entrega:

\n' + return form(req, 'Ver', r + input_curso(req, curso_id)) + +def pruebas(req, intento_id, inscripto_id=None): + def header(): + return ''' + + + + + + + + + +''' + pass + def footer(): + r = '
NombrePasadaPrivadaActivaInicioFinObservaciones
\n

\n' + r += form(req, 'Volver', input_entrega(req, i.entrega.id) + + input_inscripto(req, inscripto_id)) + r += '

\n' + return r + def row(p): + return ''' + + %s + %s + %s + %s + %s + %s + %s + +''' % (p.casoDePrueba.nombre, p.pasada, p.casoDePrueba.privado, + p.casoDePrueba.activo, p.inicio, p.fin, + pre(p.observaciones)) + + i = Intento.get(intento_id, connection=conn) + r = '

Pruebas del intento %d del alumno %d

\n' \ + % (i.numero, i.inscripto.padron) + r += header() + for p in i.pruebas: + r += row(p) + r += footer() + return r + +def intentos(req, entrega_id, inscripto_id): + def header(): + return ''' + + + + + + + +''' + pass + def footer(): + r = '
NroLlegadaCompilaPruebasObservaciones
\n

\n' + r += form(req, 'Volver', input_entrega(req, entrega_id)) + r += '

\n' + return r + def row(i): + if i.pruebasPasadas: pruebas = 'BIEN' + elif not i.compila: pruebas = None + else: pruebas = 'MAL' + return ''' + + %d + %s + %s + %s + %s + +''' % (i.numero, i.llegada, i.compila, + form(req, pruebas, input_pruebas(req, i.id, inscripto_id)), + pre(i.observaciones)) + + r = '

Intentos del alumno %d

\n' \ + % Inscripto.get(inscripto_id, connection=conn).padron + r += header() + for i in Intento.selectBy(entregaID=entrega_id, inscriptoID=inscripto_id, + connection=conn): + r += row(i) + r += footer() + return r + +def zip(req, entrega_id): + def zip_path(path, base, zipfd): + paths = os.listdir(path) + for p in paths: + if os.path.isdir(p): + zip_path(os.path.join(path, p), os.path.join(base, p), zipfd) + else: + zipfd.write(os.path.join(path, p), os.path.join(base, p)) + + from zipfile import ZipFile, ZIP_DEFLATED + e = Entrega.get(entrega_id, connection=conn) + c = e.curso + req.write(http_header_zip(req, 'entrega-%d.%d.%d-%d.%d.zip' + % (c.anio, c.cuatrimestre, c.curso, e.nroEjercicio, e.entrega))) + tmpfname = os.tmpnam() + zipfd = ZipFile(tmpfname, 'w', ZIP_DEFLATED) + for c in e.correcciones: + zip_path(os.path.join(conf.get('general', 'data_dir'), c.intento.path), + str(c.intento.inscripto.padron), zipfd) + zipfd.close() + req.write(file(tmpfname, 'r').read()) + os.unlink(tmpfname) + +def correcciones(req, entrega_id): + def header(): + return ''' + + + + + +''' + pass + def footer(): + r = '
PadrónPruebasIntentos
\n

\n' + r += form(req, 'Elegir curso', input_login(req)) + r += form(req, 'Elegir entrega', input_curso(req, e.curso.id)) + r += form(req, 'Bajar entrega en .zip', input_zip(req, entrega_id)) + r += '

\n' + return r + def row(c): + if c.intento.pruebasPasadas: pruebas = 'BIEN' + elif not c.intento.compila: prubas = None + else: pruebas = 'MAL' + intentos = int(Intento.selectBy(inscriptoID=c.inscriptoID, + entregaID=c.entregaID, connection=conn).count()) + return ''' + + %d + %s + %s + +''' % (c.inscripto.padron, + form(req, pruebas, input_pruebas(req, c.intento.id)), + form(req, intentos, input_intentos(req, c.entrega.id, c.inscripto.id))) + + e = Entrega.get(entrega_id, connection=conn) + c = e.curso + r = '

Entrega %d.%d del curso %d-%d-%d

\n' \ + % (e.nroEjercicio, e.entrega, c.anio, c.cuatrimestre, c.curso) + r += header() + for c in e.correcciones: + r += row(c) + r += footer() + return r + +# +# MAIN +# + +req = sys.stdout +f = cgi.FieldStorage() +raw = f.has_key('zip') + + +if not raw: + print http_header_html(req) + print header(req) + +path = os.getenv('PATH_INFO') + +if not f.has_key('pw'): + print login(req) +elif f.has_key('pw') and f.getfirst('pw') <> PASSWD: + print login(req) + print '

Password Incorrecto!

\n' +elif not f.has_key('curso'): + print curso(req) +elif not f.has_key('entrega'): + print entrega(req, int(f.getfirst('curso'))) +elif f.has_key('intento'): + inscripto_id = None + if f.has_key('inscripto'): + inscripto_id = int(f.getfirst('inscripto')) + print pruebas(req, int(f.getfirst('intento')), inscripto_id) +elif f.has_key('inscripto'): + print intentos(req, int(f.getfirst('entrega')), int(f.getfirst('inscripto'))) +elif f.has_key('zip'): + zip(req, int(f.getfirst('entrega'))) +else: + print correcciones(req, int(f.getfirst('entrega'))) + +if not raw: + print footer(req) + -- 2.43.0