]> git.llucax.com Git - software/sercom.git/blob - sercom/subcontrollers/enunciado/caso_de_prueba/__init__.py
si no hay instancias de entregas activas aborto el agregar entrega al alumno.
[software/sercom.git] / sercom / subcontrollers / enunciado / caso_de_prueba / __init__.py
1 # vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
2
3 #{{{ Imports
4 from turbogears import controllers, expose, redirect
5 from turbogears import validate, flash, error_handler
6 from turbogears import validators as V
7 from turbogears import widgets as W
8 from turbogears import identity
9 from turbogears import paginate
10 from docutils.core import publish_parts
11 from sercom.subcontrollers import validate as val
12 from sercom.model import CasoDePrueba, Enunciado
13 #}}}
14
15 #{{{ Configuración
16 cls = CasoDePrueba
17 name = 'caso de prueba'
18 namepl = 'casos de prueba'
19
20 fkcls = Enunciado
21 fkname = 'enunciado'
22 fknamepl = fkname + 's'
23 #}}}
24
25 #{{{ Validación
26 def validate_fk(data):
27     fk = data.get(fkname + 'ID', None)
28     if fk == 0: fk = None
29     if fk is not None:
30         try:
31             fk = fkcls.get(fk)
32         except LookupError:
33             flash(_(u'No se pudo crear el nuevo %s porque el %s con '
34                 'identificador %d no existe.' % (name, fkname, fk)))
35             raise redirect('new', **data)
36     else:
37         flash(_(u'No se pudo crear el nuevo %s porque el %s con '
38             'identificador %d no existe.' % (name, fkname, fk)))
39         raise redirect('new', **data)
40     data.pop(fkname + 'ID', None)
41     data[fkname] = fk
42     return fk
43
44 def validate_get(id):
45     return val.validate_get(cls, name, id)
46
47 def validate_set(id, data):
48     validate_fk(data)
49     return val.validate_set(cls, name, id, data)
50
51 def validate_new(data):
52     validate_fk(data)
53     return val.validate_new(cls, name, data)
54
55 def validate_del(id):
56     return val.validate_del(cls, name, id)
57 #}}}
58
59 #{{{ Formulario
60 class CasoDePruebaForm(W.TableForm):
61     class Fields(W.WidgetsList):
62         enunciadoID = W.HiddenField()
63         nombre = W.TextField(label=_(u'Nombre'), validator=V.UnicodeString(min=3, max=255, strip=True))
64         comando = W.TextField(label=_(u'Comando'), validator=V.UnicodeString(min=3, max=255, strip=True))
65         descripcion = W.TextField(label=_(u'Descripcion'), validator=V.UnicodeString(max=255, strip=True))
66         retorno = W.TextField(label=_(u'Retorno'), help_text=u"Codigo de retorno esperado",validator=V.Int)
67         max_tiempo_cpu = W.TextField(label=_(u'CPU'), help_text=u"Maximo tiempo de CPU que puede utilizar [seg]",validator=V.Int)
68         max_memoria = W.TextField(label=_(u'Memoria'), help_text=u"Maximo cantidad de memoria que puede utilizar [MB]",validator=V.Int)
69         max_tam_archivo = W.TextField(label=_(u'Tam. Archivo'), help_text=u"Maximo tamanio de archivo a crear [MB]",validator=V.Int)
70         max_cant_archivos = W.TextField(label=_(u'Archivos'),validator=V.Int)
71         max_cant_procesos = W.TextField(label=_(u'Procesos'),validator=V.Int)
72         max_locks_memoria = W.TextField(label=_(u'Mem. Locks'),validator=V.Int)
73         terminar_si_falla = W.CheckBox(label=_(u'Terminar si falla'), default=0, validator=V.Bool(if_empty=0))
74         rechazar_si_falla = W.CheckBox(label=_(u'Rechazar si falla'), default=1, validator=V.Bool(if_empty=1))
75         publico = W.CheckBox(label=_(u'Es público?'), default=1, validator=V.Bool(if_empty=1))
76         los_archivos_entrada = W.FileField(label=_(u'Archivos Entrada'))
77         los_archivos_a_comparar = W.FileField(label=_(u'Archivos a Comparar'))
78         archivos_guardar = W.TextField(label=_(u'Archivos a Guardar'))
79         activo = W.CheckBox(label=_(u'Activo'), default=1, validator=V.Bool(if_empty=1))
80     fields = Fields()
81     javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');")]
82
83 form = CasoDePruebaForm()
84 #}}}
85
86 #{{{ Controlador
87
88 class CasoDePruebaController(controllers.Controller, identity.SecureResource):
89     """Basic model admin interface"""
90     require = identity.has_permission('admin')
91
92     @expose(template='kid:%s.templates.list' % __name__)
93     @validate(validators=dict(enunciado=V.Int))
94     @paginate('records')
95     def list(self, enunciado):
96         """List records in model"""
97         r = cls.selectBy(enunciadoID=enunciado)
98         return dict(records=r, name=name, namepl=namepl, enunciado=enunciado)
99
100     @expose(template='kid:%s.templates.new' % __name__)
101     def new(self, enunciadoID=0, **kw):
102         """Create new records in model"""
103         form.fields[0].attrs['value'] = enunciadoID or kw['enunciadoID']
104         return dict(name=name, namepl=namepl, form=form, values=kw, enunciado=int(enunciadoID))
105
106     @validate(form=form)
107     @error_handler(new)
108     @expose()
109     def create(self, **kw):
110         """Save or create record to model"""
111         t = Enunciado.get(kw['enunciadoID'])
112         del(kw['enunciadoID'])
113         if kw['los_archivos_entrada'].filename:
114             kw['archivos_entrada'] = kw['los_archivos_entrada'].file.read()
115         del kw['los_archivos_entrada']
116         if kw['los_archivos_a_comparar'].filename:
117             kw['archivos_a_comparar'] = kw['los_archivos_a_comparar'].file.read()
118         del kw['los_archivos_a_comparar']
119         # TODO : Hacer ventanita mas amigable para cargar esto.
120         try:
121             kw['archivos_a_guardar'] = tuple(kw['archivos_guardar'].split(','))
122         except AttributeError:
123             pass
124         del kw['archivos_guardar']
125         nombre = kw['nombre'];
126         del kw['nombre']
127         t.add_caso_de_prueba(nombre, **kw)
128         flash(_(u'Se creó un nuevo %s.') % name)
129         raise redirect('list/%d' % t.id)
130
131     @expose(template='kid:%s.templates.edit' % __name__)
132     def edit(self, id, **kw):
133         """Edit record in model"""
134         r = validate_get(id)
135         r.archivos_guardar = ",".join(r.archivos_a_guardar)
136         form.fields[0].attrs['value'] = r.enunciado.id
137         return dict(name=name, namepl=namepl, record=r, form=form)
138
139     @validate(form=form)
140     @error_handler(edit)
141     @expose()
142     def update(self, id, **kw):
143         """Save or create record to model"""
144         if kw['los_archivos_entrada'].filename:
145             kw['archivos_entrada'] = kw['los_archivos_entrada'].file.read()
146         del kw['los_archivos_entrada']
147         if kw['los_archivos_a_comparar'].filename:
148             kw['archivos_a_comparar'] = kw['los_archivos_a_comparar'].file.read()
149         del kw['los_archivos_a_comparar']
150         # TODO : Hacer ventanita mas amigable para cargar esto.
151         try:
152             kw['archivos_a_guardar'] = tuple(kw['archivos_guardar'].split(','))
153         except AttributeError:
154             pass
155         del kw['archivos_guardar']
156         r = validate_set(id, kw)
157         flash(_(u'El %s fue actualizado.') % name)
158         raise redirect('../list/%d' % r.enunciado.id)
159
160     @expose(template='kid:%s.templates.show' % __name__)
161     def show(self, id, **kw):
162         """Show record in model"""
163         r = validate_get(id)
164         return dict(name=name, namepl=namepl, record=r)
165
166     @expose()
167     def delete(self, enunciado, id):
168         """Destroy record in model"""
169         validate_del(id)
170         flash(_(u'El %s fue eliminado permanentemente.') % name)
171         raise redirect('../../list/%d' % int(enunciado))
172
173     @expose()
174     def file(self, name, id):
175         from cherrypy import request, response
176         r = validate_get(id)
177         response.headers["Content-Type"] = "application/zip"
178         response.headers["Content-disposition"] = "attachment;filename=%s_%d.zip" % (name, r.id)
179         if name == "archivos_entrada":
180             ret = r.archivos_entrada
181         elif name == "archivos_a_comparar":
182             ret = r.archivos_a_comparar
183         else:
184             raise NotFound
185         return ret
186 #}}}
187