]> git.llucax.com Git - z.facultad/75.52/sercom.git/commitdiff
Agregar finalizador de instancias de entrega.
authorLeandro Lucarella <llucax@gmail.com>
Wed, 14 Mar 2007 00:27:49 +0000 (00:27 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Wed, 14 Mar 2007 00:27:49 +0000 (00:27 +0000)
Falta testing, pero al menos corre sin errores.

TODO.txt
sercom/finalizer.py [new file with mode: 0644]
start-sercom.py
testtester.py

index 6087ecbb87c83ecce561a9fa71c6986ec9594c24..1413f0e030fe77b7822a95d37329b9cbe01bddb5 100644 (file)
--- a/TODO.txt
+++ b/TODO.txt
@@ -1,6 +1,4 @@
 - Backend (luca)
-  * Hacer el finalizador de entregas (selección de entregas a corregir y round
-    robbin para repartir tps).
   * Hacer un control del límite de tiempo que un subproceso puede tomar más
     bullet-proof (un sleep(99999999) hace pinchar el sistema). Ver sercom viejo.
   * Poner advertencias (error?) si se sobreescriben archivos de la entrega del
diff --git a/sercom/finalizer.py b/sercom/finalizer.py
new file mode 100644 (file)
index 0000000..1075cf6
--- /dev/null
@@ -0,0 +1,67 @@
+# vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
+
+from sercom.model import InstanciaDeEntrega
+import logging
+
+log = logging.getLogger('sercom.finalizer')
+
+error_interno = _(u'\n**Hubo un error interno al finalizar la instancia.**\n')
+
+class Finalizer(object): #{{{
+
+    def __init__(self, name, queue): #{{{ y properties
+        self.name = name
+        self.queue = queue
+    #}}}
+
+    def run(self): #{{{
+        instancia_id = self.queue.get() # blocking
+        while instancia_id is not None:
+            instancia = InstanciaDeEntrega.get(instancia_id)
+            log.debug(_(u'Nueva instancia para procesar en finalizer %s: %s'),
+                self.name, instancia)
+            self.finalize(instancia)
+            log.debug(_(u'Fin de proceso de instancia: %s'), instancia)
+            instancia_id = self.queue.get() # blocking
+    #}}}
+
+    def finalize(self, instancia): #{{{
+        log.debug(_(u'Finalizer.finalize(instancia=%s)'), instancia)
+        instancia.inicio_proceso = datetime.now()
+        try:
+            try:
+                instancia.finalizar()
+            except Exception, e:
+                if isinstance(e, SystemExit): raise
+                instancia.observaciones += error_interno
+                log.exception(_('Hubo una excepcion inesperada')) # FIXME encoding
+            except:
+                entrega.observaciones += error_interno
+                log.exception(_('Hubo una excepcion inesperada desconocida')) # FIXME encoding
+            else:
+                log.info(_(u'Instancia de entrega finalizada bien: %s'), instancia)
+        finally:
+            instancia.fin_proceso = datetime.now()
+    #}}}
+
+#}}}
+
+def instancia_finalizar(self): #{{{
+    log.debug(_(u'InstanciaDeEntrega.finalizar()'))
+    curso = self.ejercicio.curso
+    docentes = [di.docente for di in curso.docentes if di.corrige]
+    curr_docente = 0
+    for ai in curso.alumnos:
+        mejor_entrega = None
+        for entrega in Entrega.selectBy(instancia=self, entregador=ai).orderBy(-Entrega.q.fecha):
+            if not mejor_entrega or not mejor_entrega.exito and entrega.exito:
+                mejor_entrega = entrega
+        if mejor_entrega:
+            mejor_entrega.make_correccion(docentes[curr_docente])
+            curr_docente = (curr_docente + 1) % len(docentes)
+        else:
+            log.info(_(u'El alumno inscripto %s no entregó', ai))
+
+InstanciaDeEntrega.finalizar = instancia_finalizar
+#}}}
+
index 45625c8de58762793f02ae4be4cd622407d4c849..57ff0580c8df4add6c428dbb07e57539964e10f9 100644 (file)
@@ -1,4 +1,5 @@
 #!/usr/bin/python
+# vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
 
 import locale
 locale.setlocale(locale.LC_ALL, '')
@@ -24,6 +25,46 @@ elif exists(join(dirname(__file__), "setup.py")):
 else:
     update_config(configfile="prod.cfg",modulename="sercom.config")
 
+from sercom.model import InstanciaDeEntrega, hub
+from sercom.finalizer import Finalizer
+from threading import Thread
+from datetime import datetime
+import time
+import logging
+
+log = logging.getLogger('sercom.tester')
+
+class Queue(object): #{{{
+    def __init__(self):
+        self.go_on = True
+    def get(self):
+        while self.go_on:
+            try:
+                hub.begin()
+                try:
+                    select = InstanciaDeEntrega.selectBy(inicio_proceso=None)
+                    instancia = select.orderBy(InstanciaDeEntrega.q.fin)[0]
+                    instancia.inicio_proceso = datetime.now()
+                finally:
+                    hub.commit()
+                return instancia.id
+            except IndexError:
+                log.debug(_(u'No hay instancias de entrega sin finalizar'))
+                time.sleep(30) # TODO config?
+            except Exception, e:
+                if isinstance(e, SystemExit):
+                    raise
+                log.exception('Queue: ')
+                time.sleep(30) # TODO config?
+        return None
+#}}}
+
+q = Queue()
+finalizer = Finalizer(name='juanca', queue=q)
+t = Thread(name='juanca', target=finalizer.run)
+t.start()
+
 from sercom.controllers import Root
 
 start_server(Root())
+
index e549d037e625d9437d4aee05f44c132a98514589..96356c806bc903fda7567cb8a7e0df82fc60bf53 100644 (file)
@@ -33,11 +33,12 @@ class Queue(object):
                 return e.id
             except IndexError:
                 log.debug(_(u'No hay entregas pendientes'))
-                time.sleep(5) # TODO config?
+                time.sleep(10) # TODO config?
             except Exception, e:
                 if isinstance(e, SystemExit):
                     raise
                 log.exception('Queue: ')
+                time.sleep(10) # TODO config?
         return None
 
 q = Queue()