from turbogears import paginate
from docutils.core import publish_parts
from sercom.subcontrollers import validate as val
-from sercom.model import Entrega, Correccion, Curso, Ejercicio, InstanciaDeEntrega, Grupo, Miembro, AlumnoInscripto
+from sercom.model import ComandoEjecutado, ComandoPruebaEjecutado, Entrega, Correccion, Curso, Ejercicio, InstanciaDeEntrega, Grupo, Miembro, AlumnoInscripto
from sqlobject import *
from zipfile import ZipFile, BadZipfile
from cStringIO import StringIO
javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_ejercicio');"), W.JSSource(ajax)]
form = EntregaForm()
+
#}}}
#{{{ Controlador
def index(self):
raise redirect('list')
- @expose(template='kid:%s.templates.new' % __name__)
- def new(self, **kw):
- """Create new records in model"""
- return dict(name=name, namepl=namepl, form=form, values=kw)
-
@expose(template='kid:%s.templates.list' % __name__)
@paginate('records')
def list(self):
r = cls.select(IN(cls.q.entregadorID, m))
return dict(records=r, name=name, namepl=namepl)
+ @expose(template='kid:%s.templates.new' % __name__)
+ def new(self, **kw):
+ """Create new records in model"""
+ return dict(name=name, namepl=namepl, form=form, values=kw)
+
@validate(form=form)
@error_handler(new)
@expose()
def create(self, archivo, ejercicio, **kw):
"""Save or create record to model"""
+ archivo = archivo.file.read()
try:
- zfile = ZipFile(archivo.file)
+ zfile = ZipFile(StringIO(archivo), 'r')
except BadZipfile:
- flash(_(u'El archivo ZIP no es valido'))
+ flash(_(u'El archivo ZIP no es válido'))
+ raise redirect('list')
+ if zfile.testzip() is not None:
+ flash(_(u'El archivo ZIP tiene errores de CRC'))
raise redirect('list')
# por defecto el entregador es el user loggeado
raise redirect('list')
entregador = m.grupo
- kw['archivos'] = archivo.file.read()
+ kw['archivos'] = archivo
kw['entregador'] = entregador
validate_new(kw)
flash(_(u'Se creó una nueva %s.') % name)
r = validate_get(entregaid)
response.headers["Content-Type"] = "application/zip"
response.headers["Content-disposition"] = "attachment;filename=Ej_%s-Entrega_%s-%s.zip" % (r.instancia.ejercicio.numero, r.instancia.numero, r.entregador.nombre)
- flash(_(u'El %s fue eliminado permanentemente.') % name)
return r.archivos
- @expose("json")
+ @expose()
+ def file(self, id):
+ from cherrypy import request, response
+ r = ComandoEjecutado.get(id)
+ response.headers["Content-Type"] = "application/zip"
+ response.headers["Content-disposition"] = "attachment;filename=comando_ejecutado_%d.zip" % (r.id)
+ return r.archivos
+
+ @expose()
+ def diff(self, id):
+ from cherrypy import request, response
+ r = ComandoEjecutado.get(id)
+ response.headers["Content-Type"] = "application/zip"
+ response.headers["Content-disposition"] = "attachment;filename=diferencias_%d.zip" % (r.id)
+ return r.diferencias
+
+ @expose(template='kid:%s.templates.diff' % __name__)
+ def verdiff(self, id):
+ r = ComandoEjecutado.get(id)
+ zip = ZipFile(StringIO(r.diferencias), 'r')
+ return dict(zip=zip)
+
+ @expose('json')
def instancias(self, ejercicio_id):
- c = Ejercicio.get(ejercicio_id)
- return dict(instancias=c.instancias)
+ instancias = InstanciaDeEntrega.select(AND(
+ InstanciaDeEntrega.q.ejercicioID == ejercicio_id,
+ InstanciaDeEntrega.q.activo == True,
+ InstanciaDeEntrega.q.inicio <= DateTimeCol.now(),
+ InstanciaDeEntrega.q.fin >= DateTimeCol.now()))
+ return dict(instancias=instancias)
#}}}