X-Git-Url: https://git.llucax.com/software/sercom-old.git/blobdiff_plain/8eda4b28e05509720fb14f6d61cad61a9a745fa7..4d996d9a8b118836ad4de537ead8144b78bf530f:/src/sc_suwi?ds=sidebyside diff --git a/src/sc_suwi b/src/sc_suwi index 3931b96..e4de31d 100755 --- a/src/sc_suwi +++ b/src/sc_suwi @@ -19,7 +19,7 @@ conf, conn, log = sercom.init('cgi') import cgitb; cgitb.enable() #XXX HORRIBLE -PASSWD = conf.get('general', 'claves') +PASSWD = conf.get('general', 'cgipw') def http_header_html(req): return 'Content-type: text/html\r\n\r\n' @@ -48,6 +48,11 @@ def header(req): border: medium black solid; border-collapse: collapse; } + caption + { + margin: 5pt; + font-weight: bold; + } th { border: thin black solid; @@ -61,7 +66,6 @@ def header(req): { border: thin black solid; padding: 3pt; - text-align: center; vertical-align: middle; } .warn @@ -110,6 +114,11 @@ def input_zip(req, entrega_id): return input_entrega(req, entrega_id) \ + '\n' +def input_zip_rechazados(req, entrega_id): + return input_entrega(req, entrega_id) \ + + '\n' \ + + '\n' + def input_inscripto(req, inscripto_id=None): if inscripto_id is not None: return '\n' \ @@ -175,6 +184,11 @@ def pruebas(req, intento_id, inscripto_id=None): r = '\n

\n' r += form(req, 'Volver', input_entrega(req, i.entrega.id) + input_inscripto(req, inscripto_id)) + #XXX Hack feo y muy hardcodeado para ver los fuentes (morirá con suwi) + r += 'ver fuentes

' \ + % (i.inscripto.curso.anio, i.inscripto.curso.cuatrimestre, + i.inscripto.curso.curso, i.entrega.nroEjercicio, i.entrega.entrega, + i.inscripto.padron, i.numero) r += '

\n' return r def row(p): @@ -243,11 +257,11 @@ def intentos(req, entrega_id, inscripto_id): r += footer() return r -def zip(req, entrega_id): +def zip(req, entrega_id, rechazados=False): def zip_path(path, base, zipfd): paths = os.listdir(path) for p in paths: - if os.path.isdir(p): + if os.path.isdir(os.path.join(path, 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)) @@ -255,57 +269,112 @@ def zip(req, entrega_id): 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))) + filename = 'entrega-%d.%d.%d-%d.%d' \ + % (c.anio, c.cuatrimestre, c.curso, e.nroEjercicio, e.entrega) + if rechazados: + filename += '-rechazados' + filename += '.zip' + req.write(http_header_zip(req, filename)) 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) + if rechazados: + inscriptos_ok = set([c.inscripto for c in e.correcciones]) + inscriptos = set([i.inscripto for i in e.intentos]) + for i in inscriptos - inscriptos_ok: + intento = list(Intento.selectBy(entregaID=e.id, inscriptoID=i.id, + connection=conn))[-1] + zip_path(os.path.join(conf.get('general', 'data_dir'), + intento.path), str(i.padron), zipfd) + else: + 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(): + def correccion_header(): return ''' - - - - - + + + + + + + + + ''' pass - def footer(): - r = '
PadrónPruebasIntentos
Entregas aceptadas
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): + def correccion_footer(): + return ' \n\n' + def correccion_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 - + + %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))) + def rechazado_header(): + return ''' + + + + + + + + +''' + pass + def rechazado_footer(): + return ' \n
Entregas rechazadas
PadrónIntentos
\n' + def rechazado_row(inscripto, entrega): + intentos = int(Intento.selectBy(inscriptoID=inscripto.id, + entregaID=entrega.id, connection=conn).count()) + return ''' + + %d + %s + +''' % (inscripto.padron, + form(req, intentos, input_intentos(req, entrega.id, inscripto.id))) + def footer(): + r = '

\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 += form(req, 'Bajar entrega rechazadas en .zip', + input_zip_rechazados(req, entrega_id)) + r += '

\n' + return r 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) + correcciones = list(e.correcciones) + # Ordena comparando padron + correcciones.sort(lambda x, y: cmp(x.inscripto.padron, y.inscripto.padron)) + r += correccion_header() + for c in correcciones: + r += correccion_row(c) + r += correccion_footer() + inscriptos_ok = set([c.inscripto for c in correcciones]) + inscriptos = set([i.inscripto for i in e.intentos]) + r += rechazado_header() + for i in inscriptos - inscriptos_ok: + r += rechazado_row(i, e) + r += rechazado_footer() r += footer() return r @@ -341,7 +410,7 @@ elif f.has_key('intento'): 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'))) + zip(req, int(f.getfirst('entrega')), f.getfirst('rechazados', False)) else: print correcciones(req, int(f.getfirst('entrega')))