]> git.llucax.com Git - z.facultad/75.52/sercom.git/blob - sercom/finalizer.py
Agregar finalizador de instancias de entrega.
[z.facultad/75.52/sercom.git] / sercom / finalizer.py
1 # vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
2
3 from sercom.model import InstanciaDeEntrega
4 import logging
5
6 log = logging.getLogger('sercom.finalizer')
7
8 error_interno = _(u'\n**Hubo un error interno al finalizar la instancia.**\n')
9
10 class Finalizer(object): #{{{
11
12     def __init__(self, name, queue): #{{{ y properties
13         self.name = name
14         self.queue = queue
15     #}}}
16
17     def run(self): #{{{
18         instancia_id = self.queue.get() # blocking
19         while instancia_id is not None:
20             instancia = InstanciaDeEntrega.get(instancia_id)
21             log.debug(_(u'Nueva instancia para procesar en finalizer %s: %s'),
22                 self.name, instancia)
23             self.finalize(instancia)
24             log.debug(_(u'Fin de proceso de instancia: %s'), instancia)
25             instancia_id = self.queue.get() # blocking
26     #}}}
27
28     def finalize(self, instancia): #{{{
29         log.debug(_(u'Finalizer.finalize(instancia=%s)'), instancia)
30         instancia.inicio_proceso = datetime.now()
31         try:
32             try:
33                 instancia.finalizar()
34             except Exception, e:
35                 if isinstance(e, SystemExit): raise
36                 instancia.observaciones += error_interno
37                 log.exception(_('Hubo una excepcion inesperada')) # FIXME encoding
38             except:
39                 entrega.observaciones += error_interno
40                 log.exception(_('Hubo una excepcion inesperada desconocida')) # FIXME encoding
41             else:
42                 log.info(_(u'Instancia de entrega finalizada bien: %s'), instancia)
43         finally:
44             instancia.fin_proceso = datetime.now()
45     #}}}
46
47 #}}}
48
49 def instancia_finalizar(self): #{{{
50     log.debug(_(u'InstanciaDeEntrega.finalizar()'))
51     curso = self.ejercicio.curso
52     docentes = [di.docente for di in curso.docentes if di.corrige]
53     curr_docente = 0
54     for ai in curso.alumnos:
55         mejor_entrega = None
56         for entrega in Entrega.selectBy(instancia=self, entregador=ai).orderBy(-Entrega.q.fecha):
57             if not mejor_entrega or not mejor_entrega.exito and entrega.exito:
58                 mejor_entrega = entrega
59         if mejor_entrega:
60             mejor_entrega.make_correccion(docentes[curr_docente])
61             curr_docente = (curr_docente + 1) % len(docentes)
62         else:
63             log.info(_(u'El alumno inscripto %s no entregó', ai))
64
65 InstanciaDeEntrega.finalizar = instancia_finalizar
66 #}}}
67