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