]> git.llucax.com Git - software/sercom-old.git/blobdiff - src/sc_suwi
Se hace que un archivo vacío siga dando error pero un error más descriptivo.
[software/sercom-old.git] / src / sc_suwi
index be472154a07a86ac261eaa50ed0c18614a9d1adb..fe505a6e337cd6dadbd6b7d69796231a1ce1d944 100755 (executable)
@@ -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) \
         + '<input type="hidden" name="zip" value="1" />\n'
 
+def input_zip_rechazados(req, entrega_id):
+    return input_entrega(req, entrega_id) \
+        + '<input type="hidden" name="zip" value="1" />\n' \
+        + '<input type="hidden" name="rechazados" value="1" />\n'
+
 def input_inscripto(req, inscripto_id=None):
     if inscripto_id is not None:
         return '<input type="hidden" name="inscripto" value="%d" />\n' \
@@ -183,6 +184,11 @@ def pruebas(req, intento_id, inscripto_id=None):
         r = '</table>\n<p>\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 += '<a href="/intentos/%s.%s/%s.%s.%s/%s.%s/">ver fuentes</a></p>' \
+            % (i.inscripto.curso.anio, i.inscripto.curso.cuatrimestre,
+            i.inscripto.curso.curso, i.entrega.nroEjercicio, i.entrega.entrega,
+            i.inscripto.padron, i.numero)
         r += '</p>\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 '''<table>
     <caption>Entregas rechazadas</caption>
     <thead>
@@ -317,9 +336,9 @@ def correcciones(req, entrega_id):
     <tbody>
 '''
         pass
-    def problematico_footer():
+    def rechazado_footer():
         return '    </tbody>\n</table>\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 += '</p>\n'
         return r
 
@@ -342,17 +363,20 @@ def correcciones(req, entrega_id):
     r = '<h1>Entrega %d.%d del curso %d-%d-%d</h1>\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')))