]> git.llucax.com Git - software/sercom.git/commitdiff
Permito adjuntar un archivo a los enunciados
authorRicardo Markiewicz <rmarkie@fi.uba.ar>
Sun, 25 Feb 2007 18:36:32 +0000 (18:36 +0000)
committerRicardo Markiewicz <rmarkie@fi.uba.ar>
Sun, 25 Feb 2007 18:36:32 +0000 (18:36 +0000)
Deben actualiza la db.

TODO.txt
sercom/model.py
sercom/subcontrollers/enunciado/__init__.py
sercom/subcontrollers/enunciado/templates/list.kid

index 075c90b27b20deb409f3d3b4e6df937573554554..efe00fb3505ce2c6b2b339de997644894a7413b8 100644 (file)
--- a/TODO.txt
+++ b/TODO.txt
@@ -1,6 +1,5 @@
 - Empezar con el backend (luca)
 - Pensar/resolver password en ABM de Docente/Alumno
 - Empezar con el backend (luca)
 - Pensar/resolver password en ABM de Docente/Alumno
-- Agregar archivo de enunciado al Enunciado (ricky)
 - Terminar ABM simples:
   * Curso (nico)
     * DocenteInscripto (Docente) (nico)
 - Terminar ABM simples:
   * Curso (nico)
     * DocenteInscripto (Docente) (nico)
index d06a570a9a08c3a7a3d0500ff0a4e83ab3f1c6f8..01b908e1531450a49bde6cadaaff88e0ba81cddd 100644 (file)
@@ -338,6 +338,9 @@ class Enunciado(SQLObject, ByObject): #{{{
     autor           = ForeignKey('Docente')
     descripcion     = UnicodeCol(length=255, default=None)
     creado          = DateTimeCol(notNone=True, default=DateTimeCol.now)
     autor           = ForeignKey('Docente')
     descripcion     = UnicodeCol(length=255, default=None)
     creado          = DateTimeCol(notNone=True, default=DateTimeCol.now)
+    archivo         = BLOBCol(default=None)
+    archivo_name    = StringCol(default=None)
+    archivo_type    = StringCol(default=None)
     # Joins
     ejercicios      = MultipleJoin('Ejercicio')
     casos_de_prueba = MultipleJoin('CasoDePrueba')
     # Joins
     ejercicios      = MultipleJoin('Ejercicio')
     casos_de_prueba = MultipleJoin('CasoDePrueba')
index 2f6b29db28fa19ecc4e676436bd8266085ddbe6e..6ed6df1b1d81b95c14d164cd9b3a858655e9c1fb 100644 (file)
@@ -10,6 +10,7 @@ from turbogears import paginate
 from docutils.core import publish_parts
 from sercom.subcontrollers import validate as val
 from sercom.model import Enunciado, Docente
 from docutils.core import publish_parts
 from sercom.subcontrollers import validate as val
 from sercom.model import Enunciado, Docente
+from cherrypy import request, response
 #}}}
 
 #{{{ Configuración
 #}}}
 
 #{{{ Configuración
@@ -62,6 +63,7 @@ class EnunciadoForm(W.TableForm):
             options=get_options, validator=V.Int(not_empty=False))
         descripcion = W.TextField(label=_(u'Descripción'),
             validator=V.UnicodeString(not_empty=False, max=255, strip=True))
             options=get_options, validator=V.Int(not_empty=False))
         descripcion = W.TextField(label=_(u'Descripción'),
             validator=V.UnicodeString(not_empty=False, max=255, strip=True))
+        archivo = W.FileField(label=_(u'Archivo'))
     fields = Fields()
     javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');")]
 
     fields = Fields()
     javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');")]
 
@@ -101,8 +103,11 @@ class EnunciadoController(controllers.Controller, identity.SecureResource):
     @validate(form=form)
     @error_handler(new)
     @expose()
     @validate(form=form)
     @error_handler(new)
     @expose()
-    def create(self, **kw):
+    def create(self, archivo, **kw):
         """Save or create record to model"""
         """Save or create record to model"""
+        kw['archivo'] = archivo.file.read()
+        kw['archivo_name'] = archivo.filename
+        kw['archivo_type'] = archivo.type
         validate_new(kw)
         flash(_(u'Se creó un nuevo %s.') % name)
         raise redirect('list')
         validate_new(kw)
         flash(_(u'Se creó un nuevo %s.') % name)
         raise redirect('list')
@@ -139,5 +144,13 @@ class EnunciadoController(controllers.Controller, identity.SecureResource):
         r.destroySelf()
         flash(_(u'El %s fue eliminado permanentemente.') % name)
         raise redirect('../list')
         r.destroySelf()
         flash(_(u'El %s fue eliminado permanentemente.') % name)
         raise redirect('../list')
+
+    @expose()
+    def files(self, id):
+        r = validate_get(id)
+        response.headers["Content-Type"] = r.archivo_type
+        response.headers["Content-disposition"] = "attachment;filename=%s" % (r.archivo_name)
+        flash(_(u'El %s fue eliminado permanentemente.') % name)
+        return r.archivo
 #}}}
 
 #}}}
 
index 9e01961e57bbb1605e6271a369be0d0e36ae5a7e..b5dcdeb952a8218770e7ac908b95e8cedaad27ae 100644 (file)
         <td><a py:if="len(record.casos_de_prueba)"
                 href="${tg.url('/caso_de_prueba/list', enunciado=record.id)}"><span
                     py:replace="len(record.casos_de_prueba)">cant</span></a></td>
         <td><a py:if="len(record.casos_de_prueba)"
                 href="${tg.url('/caso_de_prueba/list', enunciado=record.id)}"><span
                     py:replace="len(record.casos_de_prueba)">cant</span></a></td>
-        <td><a href="${tg.url('/enunciado/edit/%d' % record.id)}">Editar</a>
-            <a href="${tg.url('/enunciado/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>
+        <td>
+            <a href="${tg.url('/enunciado/edit/%d' % record.id)}">Editar</a>
+            <a href="${tg.url('/enunciado/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>
+            <a py:if="record.archivo" href="${tg.url('/enunciado/files/%d' % record.id)}">Bajar Enunciado</a>
+        </td>
     </tr>
 </table>
 
     </tr>
 </table>