]> git.llucax.com Git - z.facultad/75.52/sercom.git/blob - sercom/finalizer.py
e3277f8c9c2f5056dfb59b227d0791548fb6b4be
[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, Entrega, SQLObjectNotFound
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         try:
57             e = Entrega.selectBy(instancia=self, entregador=ai) \
58                 .orderBy(-Entrega.q.fecha) \
59                 .limit(1) \
60                 .getOne()
61             e.make_correccion(docentes[curr_docente])
62             curr_docente = (curr_docente + 1) % len(docentes)
63         except SQLObjectNotFound:
64             log.info(_(u'El alumno inscripto %s no entregó'), ai)
65
66 InstanciaDeEntrega.finalizar = instancia_finalizar
67 #}}}
68