1 #!/usr/bin/env python2.4
2 # -*- encoding: iso-8859-1 -*-
3 # vim: set et sw=4 sts=4 :
13 from sercom.sqlo import *
16 conf, conn, log = sercom.init('cgi')
19 import cgitb; cgitb.enable()
22 PASSWD = conf.get('general', 'cgipw')
24 def http_header_html(req):
25 return 'Content-type: text/html\r\n\r\n'
27 def http_header_zip(req, filename):
28 return 'Content-type: application/zip\r\n' \
29 'Content-Disposition: attachment;filename=%s\r\n' \
33 return '''<!DOCTYPE html
34 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
35 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" >
38 <title>SUWI - Sercom Ugly Web Interface</title>
39 <style type="text/css">
43 font-family: sans-serif;
44 background-color: rgb(255, 255, 255);
48 border: medium black solid;
49 border-collapse: collapse;
53 border: thin black solid;
55 background-color: navy;
58 vertical-align: middle;
62 border: thin black solid;
65 vertical-align: middle;
85 def form(req, submit, str=None):
87 if submit is not None:
88 r = '<form method="post">\n'
90 r += '<input type="submit" value="%s">\n' % submit
95 return '<pre>%s</pre>' % cgi.escape(str(s))
98 return '<input type="hidden" name="pw" value="%s" />\n' % PASSWD
100 def input_curso(req, curso_id):
101 return input_login(req) \
102 + '<input type="hidden" name="curso" value="%d" />\n' % curso_id
104 def input_entrega(req, entrega_id):
105 e = Entrega.get(entrega_id, connection=conn)
106 return input_curso(req, e.curso.id) \
107 + '<input type="hidden" name="entrega" value="%d" />\n' % entrega_id
109 def input_zip(req, entrega_id):
110 return input_entrega(req, entrega_id) \
111 + '<input type="hidden" name="zip" value="1" />\n'
113 def input_inscripto(req, inscripto_id=None):
114 if inscripto_id is not None:
115 return '<input type="hidden" name="inscripto" value="%d" />\n' \
119 def input_pruebas(req, intento_id, inscripto_id=None):
120 i = Intento.get(intento_id, connection=conn)
121 r = input_entrega(req, i.entrega.id)
122 r += '<input type="hidden" name="intento" value="%d" />\n' % intento_id
123 r += input_inscripto(req, inscripto_id)
126 def input_intentos(req, entrega_id, inscripto_id):
127 return input_entrega(req, entrega_id) + input_inscripto(req, inscripto_id)
130 r = '<h1>Bienvenido a ' \
131 '<acronym title="Sercom Ugly Web Interface">SUWI</acronym></h1>\n'
132 r += '<p>Debe ingresar la contraseña para seguir...</p>\n'
133 return r + form(req, 'Entrar',
134 '<p>Contraseña: <input type="password" name="pw" /></p>')
137 cursos = [c for c in Curso.select(connection=conn) if len(c.entregas)]
138 r = '<h1>Elegir curso</h1>\n'
140 r += '<p>Curso: <select name="curso">\n'
142 r += '\t<option value="%d">%d-%d-%d</option>\n' \
143 % (c.id, c.anio, c.cuatrimestre, c.curso)
144 r += '</select></p>\n'
146 r += '<p>No hay cursos con entregas</p>\n'
147 return form(req, 'Ver', r + input_login(req))
149 def entrega(req, curso_id):
150 c = Curso.get(curso_id, connection=conn)
151 r = '<h1>Elegir entrega del curso %d-%d-%d</h1>\n' \
152 % (c.anio, c.cuatrimestre, c.curso)
153 r += '<p>Entrega: <select name="entrega">\n'
155 r += '\t<option value="%d">%d-%d</option>\n' \
156 % (e.id, e.nroEjercicio, e.entrega)
157 r += '</select></p>\n'
158 return form(req, 'Ver', r + input_curso(req, curso_id))
160 def pruebas(req, intento_id, inscripto_id=None):
170 <th>Observaciones</th>
175 r = '</table>\n<p>\n'
176 r += form(req, 'Volver', input_entrega(req, i.entrega.id)
177 + input_inscripto(req, inscripto_id))
191 ''' % (p.casoDePrueba.nombre, p.pasada, p.casoDePrueba.privado,
192 p.casoDePrueba.activo, p.inicio, p.fin,
193 pre(p.observaciones))
195 i = Intento.get(intento_id, connection=conn)
196 r = '<h1>Pruebas del intento %d del alumno %d</h1>\n' \
197 % (i.numero, i.inscripto.padron)
204 def intentos(req, entrega_id, inscripto_id):
212 <th>Observaciones</th>
217 r = '</table>\n<p>\n'
218 r += form(req, 'Volver', input_entrega(req, entrega_id))
222 if i.pruebasPasadas: pruebas = 'BIEN'
223 elif not i.compila: pruebas = None
224 else: pruebas = 'MAL'
233 ''' % (i.numero, i.llegada, i.compila,
234 form(req, pruebas, input_pruebas(req, i.id, inscripto_id)),
235 pre(i.observaciones))
237 r = '<h1>Intentos del alumno %d</h1>\n' \
238 % Inscripto.get(inscripto_id, connection=conn).padron
240 for i in Intento.selectBy(entregaID=entrega_id, inscriptoID=inscripto_id,
246 def zip(req, entrega_id):
247 def zip_path(path, base, zipfd):
248 paths = os.listdir(path)
251 zip_path(os.path.join(path, p), os.path.join(base, p), zipfd)
253 zipfd.write(os.path.join(path, p), os.path.join(base, p))
255 from zipfile import ZipFile, ZIP_DEFLATED
256 e = Entrega.get(entrega_id, connection=conn)
258 req.write(http_header_zip(req, 'entrega-%d.%d.%d-%d.%d.zip'
259 % (c.anio, c.cuatrimestre, c.curso, e.nroEjercicio, e.entrega)))
260 tmpfname = os.tmpnam()
261 zipfd = ZipFile(tmpfname, 'w', ZIP_DEFLATED)
262 for c in e.correcciones:
263 zip_path(os.path.join(conf.get('general', 'data_dir'), c.intento.path),
264 str(c.intento.inscripto.padron), zipfd)
266 req.write(file(tmpfname, 'r').read())
269 def correcciones(req, entrega_id):
280 r = '</table>\n<p>\n'
281 r += form(req, 'Elegir curso', input_login(req))
282 r += form(req, 'Elegir entrega', input_curso(req, e.curso.id))
283 r += form(req, 'Bajar entrega en .zip', input_zip(req, entrega_id))
287 if c.intento.pruebasPasadas: pruebas = 'BIEN'
288 elif not c.intento.compila: prubas = None
289 else: pruebas = 'MAL'
290 intentos = int(Intento.selectBy(inscriptoID=c.inscriptoID,
291 entregaID=c.entregaID, connection=conn).count())
298 ''' % (c.inscripto.padron,
299 form(req, pruebas, input_pruebas(req, c.intento.id)),
300 form(req, intentos, input_intentos(req, c.entrega.id, c.inscripto.id)))
302 e = Entrega.get(entrega_id, connection=conn)
304 r = '<h1>Entrega %d.%d del curso %d-%d-%d</h1>\n' \
305 % (e.nroEjercicio, e.entrega, c.anio, c.cuatrimestre, c.curso)
307 for c in e.correcciones:
317 f = cgi.FieldStorage()
318 raw = f.has_key('zip')
322 print http_header_html(req)
325 path = os.getenv('PATH_INFO')
327 if not f.has_key('pw'):
329 elif f.has_key('pw') and f.getfirst('pw') <> PASSWD:
331 print '<p class="warn">Password Incorrecto!</p>\n'
332 elif not f.has_key('curso'):
334 elif not f.has_key('entrega'):
335 print entrega(req, int(f.getfirst('curso')))
336 elif f.has_key('intento'):
338 if f.has_key('inscripto'):
339 inscripto_id = int(f.getfirst('inscripto'))
340 print pruebas(req, int(f.getfirst('intento')), inscripto_id)
341 elif f.has_key('inscripto'):
342 print intentos(req, int(f.getfirst('entrega')), int(f.getfirst('inscripto')))
343 elif f.has_key('zip'):
344 zip(req, int(f.getfirst('entrega')))
346 print correcciones(req, int(f.getfirst('entrega')))