]> git.llucax.com Git - software/sercom.git/commitdiff
entregas
authorRicardo Markiewicz <rmarkie@fi.uba.ar>
Sun, 25 Feb 2007 21:04:10 +0000 (21:04 +0000)
committerRicardo Markiewicz <rmarkie@fi.uba.ar>
Sun, 25 Feb 2007 21:04:10 +0000 (21:04 +0000)
Quise ponerlo como /ejercicio/entregas que tiene mas onda pero el puto kid se me queja y no
tengo ganas de saber por que :)

sercom/controllers.py
sercom/model.py
sercom/subcontrollers/__init__.py
sercom/subcontrollers/ejercicio/__init__.py
sercom/subcontrollers/ejercicio/templates/list.kid
sercom/subcontrollers/entrega/__init__.py [new file with mode: 0644]
sercom/subcontrollers/entrega/templates/list.kid [new file with mode: 0644]
sercom/subcontrollers/entrega/templates/new.kid [new file with mode: 0644]

index b1e8ed142c3bcdc07a3808631bc6929a0b71769a..6132eb26e0c4d7c43bf954f2f8a4d1e0e52d7ee7 100644 (file)
@@ -85,6 +85,8 @@ class Root(controllers.RootController):
 
     ejercicio = EjercicioController()
 
+    entrega = EntregaController()
+
     caso_de_prueba = CasoDePruebaController()
 
     curso = CursoController()
index 739bbd7183feb86a3dd7a7b90396366aa07e38f1..dec75addc8ad43f726e2dd18b9480383e7780ae5 100644 (file)
@@ -478,9 +478,10 @@ class InstanciaDeEntrega(SQLObject, ByObject): #{{{
 
     def __init__(self, ejercicio=None, numero=None, inicio=None, fin=None,
             observaciones=None, activo=True, tareas=(), **kargs):
-        SQLObject.__init__(self, ejercicioID=ejercicio.id, numero=numero,
-            fin=fin, inicio=inicio, observaciones=observaciones, activo=activo,
-            **kargs)
+        if ejercicio:
+            SQLObject.__init__(self, ejercicioID=ejercicio.id, numero=numero,
+                fin=fin, inicio=inicio, observaciones=observaciones, activo=activo,
+                **kargs)
         if tareas:
             self.tareas = tareas
 
index f650c14cefcf3463f60c223fbfdb6d0eba2f0b47..97976ee8c1be48e026f74e1f3160147a8c85a7b5 100644 (file)
@@ -4,3 +4,4 @@ from curso import CursoController
 from enunciado import EnunciadoController
 from caso_de_prueba import CasoDePruebaController
 from ejercicio import EjercicioController
+from entrega import EntregaController
index 3abb82c33fc94416b6d1fccc44fb6bcc7d4eb88e..c5335063edbd4fcaf1dfffe2d7c84ec28295c77e 100644 (file)
@@ -11,6 +11,7 @@ from docutils.core import publish_parts
 from sercom.subcontrollers import validate as val
 from sercom.model import Ejercicio, Curso, Enunciado
 from cherrypy import request, response
+
 #}}}
 
 #{{{ Configuración
index bd7919698859a1b2e7d15d5775aa311b01df0325..035542a06dd07b4c867eeeccb2ad7cb1af43cdab 100644 (file)
@@ -27,6 +27,7 @@
             <span py:replace="record.grupal">grupal</span>
         </td>
         <td>
+            <a href="${tg.url('/entrega/%d' % record.id)}">Entregas</a>
             <a href="${tg.url('/ejercicio/edit/%d' % record.id)}">Editar</a>
             <a href="${tg.url('/ejercicio/delete/%d' % record.id)}" onclick="if (confirm('${_(u'Estás seguro? Yo creo que no...')}')) { var f = document.createElement('form'); this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href; f.submit(); };return false;">Eliminar</a>
         </td>
diff --git a/sercom/subcontrollers/entrega/__init__.py b/sercom/subcontrollers/entrega/__init__.py
new file mode 100644 (file)
index 0000000..9159f73
--- /dev/null
@@ -0,0 +1,112 @@
+# vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
+
+#{{{ Imports
+from turbogears import controllers, expose, redirect
+from turbogears import validate, flash, error_handler
+from turbogears import validators as V
+from turbogears import widgets as W
+from turbogears import identity
+from turbogears import paginate
+from docutils.core import publish_parts
+from sercom.subcontrollers import validate as val
+from sercom.model import Ejercicio, Curso, Enunciado, InstanciaDeEntrega
+from cherrypy import request, response
+#}}}
+
+#{{{ Configuración
+cls = InstanciaDeEntrega
+name = 'instancia de entrega'
+namepl = 'instancias de entrega'
+
+fkcls = Ejercicio
+fkname = 'ejercicio'
+fknamepl = fkname + 's'
+
+#}}}
+
+#{{{ Validación
+def validate_fk(data):
+    fk = data.get(fkname + 'ID', None)
+    if fk == 0: fk = None
+    if fk is not None:
+        try:
+            fk = fkcls.get(fk)
+        except LookupError:
+            flash(_(u'No se pudo crear el nuevo %s porque el %s con '
+                'identificador %d no existe.' % (name, fkname, fk)))
+            raise redirect('new', **data)
+    data.pop(fkname + 'ID', None)
+    data[fkname] = fk
+    return fk
+
+def validate_get(id):
+    return val.validate_get(cls, name, id)
+
+def validate_set(id, data):
+    validate_fk(data)
+    return val.validate_set(cls, name, id, data)
+
+def validate_new(data):
+    validate_fk(data)
+    return val.validate_new(cls, name, data)
+#}}}
+
+#{{{ Formulario
+def get_options():
+    return [(0, _(u'--'))] + [(fk.id, fk.shortrepr()) for fk in fkcls.select()]
+
+class EntregaForm(W.TableForm):
+    class Fields(W.WidgetsList):
+        numero = W.TextField(name="numero",label=_(u'Nro'), help_text=_(u'Requerido.'),
+            validator=V.Int(not_empty=True))
+        inicio = W.CalendarDateTimePicker(label=_(u"Inicio"))
+        fin = W.CalendarDateTimePicker(label=_(u"Fin"))
+        procesada = W.CheckBox(label=_(u"Procesada?"))
+        activo = W.CheckBox(label=_(u"Activo?"))
+        observaciones = W.TextArea(rows="5", cols="40")
+        ejercicio_id= W.HiddenField()
+    fields = Fields()
+    javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');")]
+
+form = EntregaForm()
+#}}}
+
+#{{{ Controlador
+class EntregaController(controllers.Controller, identity.SecureResource):
+    """Basic model admin interface"""
+    require = identity.has_permission('admin')
+
+    @expose(template='kid:%s.templates.list' % __name__)
+    @validate(validators=dict(ejercicio_id=V.Int))
+    @paginate('records')
+    def default(self, ejercicio_id):
+        e = Ejercicio.get(ejercicio_id)
+        r = e.instancias
+        return dict(records=r, name=name, namepl=namepl, parcial=str(ejercicio_id))
+
+    @expose(template='kid:%s.templates.new' % __name__)
+    def new(self, ejercicio_id, **kw):
+        """Create new records in model"""
+        form.fields[6].attrs['value'] = ejercicio_id
+        return dict(name=name, namepl=namepl, form=form, values=kw, partial=str(ejercicio_id))
+
+    @validate(form=form)
+    @error_handler(new)
+    @expose()
+    def create(self, ejercicio_id, **kw):
+        """Save or create record to model"""
+        e = Ejercicio.get(ejercicio_id)
+        e.add_instancia(**kw)
+        flash(_(u'Se creó un nuevo %s.') % name)
+        raise redirect('/entrega/'+str(e.id))
+
+    @expose()
+    def delete(self, id):
+        """Destroy record in model"""
+        r = validate_get(id)
+        r.destroySelf()
+        flash(_(u'El %s fue eliminado permanentemente.') % name)
+        raise redirect('../list')
+
+#}}}
+
diff --git a/sercom/subcontrollers/entrega/templates/list.kid b/sercom/subcontrollers/entrega/templates/list.kid
new file mode 100644 (file)
index 0000000..6ab783b
--- /dev/null
@@ -0,0 +1,47 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
+    py:extends="'../../../templates/master.kid'">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
+<title>list</title>
+</head>
+<body>
+
+<h1>Administración de <span py:replace="namepl">Objetos</span></h1>
+
+<table>
+    <tr>
+        <th>Nro</th>
+        <th>Inicio</th>
+        <th>Fin</th>
+        <th>Procesada?</th>
+        <th>Activa?</th>
+        <th>Observaciones</th>
+        <th>Operaciones</th>
+    </tr>
+    <tr py:for="record in records">
+        <td><span py:replace="record.numero">numero</span></td>
+        <td><span py:replace="record.inicio">inicio</span></td>
+        <td><span py:replace="record.fin">fin</span></td>
+        <td><span py:replace="record.procesada">procesada</span></td>
+        <td><span py:replace="record.activo">activa</span></td>
+        <td><span py:replace="record.observaciones">obs</span></td>
+        <td>
+            <a href="${tg.url('/entrega/delete/%d' % record.id)}" onclick="if (confirm('${_(u'Estás seguro? Yo creo que no...')}')) { var f = document.createElement('form'); this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href; f.submit(); };return false;">Eliminar</a>
+        </td>
+    </tr>
+</table>
+
+<br/>
+<a href="${tg.url('/entrega/new/'+parcial)}">Agregar</a>
+
+<div py:for="page in tg.paginate.pages">
+    <a py:if="page != tg.paginate.current_page"
+        href="${tg.paginate.get_href(page)}">${page}</a>
+    <b py:if="page == tg.paginate.current_page">${page}</b>
+</div>
+
+</body>
+</html>
+
+<!-- vim: set et sw=4 sts=4 : -->
diff --git a/sercom/subcontrollers/entrega/templates/new.kid b/sercom/subcontrollers/entrega/templates/new.kid
new file mode 100644 (file)
index 0000000..500ed08
--- /dev/null
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
+    py:extends="'../../../templates/master.kid'">
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
+<title>new</title>
+</head>
+<body>
+
+<h1>Crear Nuevo <span py:replace="name">Objeto</span></h1>
+
+<p py:replace="form(action=tg.url('/entrega/create'), value=values, submit_text=_('Crear'))">Formulario</p>
+
+<br/>
+<a href="${tg.url('/entrega/list'+partial)}">Cancelar</a>
+
+</body>
+</html>