X-Git-Url: https://git.llucax.com/software/sercom-old.git/blobdiff_plain/2c809106fee22f48064720dfdf7dbbc29e4b321d..9d5cef9df44a7d6687a9563bc762ae56fe70103b:/src/sc_suwi?ds=inline diff --git a/src/sc_suwi b/src/sc_suwi index be47215..fe505a6 100755 --- a/src/sc_suwi +++ b/src/sc_suwi @@ -21,10 +21,6 @@ import cgitb; cgitb.enable() #XXX HORRIBLE PASSWD = conf.get('general', 'cgipw') -def cmp_correccion_padron(e1, e2): - 'Compara 2 entregas, según el padrón del alumno.' - return cmp(e1.inscripto.padron, e2.inscripto.padron) - def http_header_html(req): return 'Content-type: text/html\r\n\r\n' @@ -118,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' \ @@ -183,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): @@ -251,7 +257,7 @@ 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: @@ -263,13 +269,26 @@ 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) @@ -305,7 +324,7 @@ def correcciones(req, entrega_id): ''' % (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 problematico_header(): + def rechazado_header(): return ''' @@ -317,9 +336,9 @@ def correcciones(req, entrega_id): ''' pass - def problematico_footer(): + def rechazado_footer(): return ' \n
Entregas rechazadas
\n' - def problematico_row(inscripto, entrega): + def rechazado_row(inscripto, entrega): intentos = int(Intento.selectBy(inscriptoID=inscripto.id, entregaID=entrega.id, connection=conn).count()) return ''' @@ -334,6 +353,8 @@ def correcciones(req, entrega_id): 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 @@ -342,17 +363,20 @@ def correcciones(req, entrega_id): r = '

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

\n' \ % (e.nroEjercicio, e.entrega, c.anio, c.cuatrimestre, c.curso) correcciones = list(e.correcciones) - correcciones.sort(cmp_correccion_padron) + # 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 += problematico_header() - for i in inscriptos - inscriptos_ok: - r += problematico_row(i, e) - r += problematico_footer() + rechazados = list(inscriptos - inscriptos_ok) + rechazados.sort(lambda x, y: cmp(x.padron, y.padron)) + r += rechazado_header() + for i in rechazados: + r += rechazado_row(i, e) + r += rechazado_footer() r += footer() return r @@ -388,7 +412,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')))