--- /dev/null
+# 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
+#}}}
+
#!/usr/bin/python
+# vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
import locale
locale.setlocale(locale.LC_ALL, '')
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())
+