1 # vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
3 from sercom.model import InstanciaDeEntrega
6 log = logging.getLogger('sercom.finalizer')
8 error_interno = _(u'\n**Hubo un error interno al finalizar la instancia.**\n')
10 class Finalizer(object): #{{{
12 def __init__(self, name, queue): #{{{ y properties
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'),
23 self.finalize(instancia)
24 log.debug(_(u'Fin de proceso de instancia: %s'), instancia)
25 instancia_id = self.queue.get() # blocking
28 def finalize(self, instancia): #{{{
29 log.debug(_(u'Finalizer.finalize(instancia=%s)'), instancia)
30 instancia.inicio_proceso = datetime.now()
35 if isinstance(e, SystemExit): raise
36 instancia.observaciones += error_interno
37 log.exception(_('Hubo una excepcion inesperada')) # FIXME encoding
39 entrega.observaciones += error_interno
40 log.exception(_('Hubo una excepcion inesperada desconocida')) # FIXME encoding
42 log.info(_(u'Instancia de entrega finalizada bien: %s'), instancia)
44 instancia.fin_proceso = datetime.now()
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]
54 for ai in curso.alumnos:
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
60 mejor_entrega.make_correccion(docentes[curr_docente])
61 curr_docente = (curr_docente + 1) % len(docentes)
63 log.info(_(u'El alumno inscripto %s no entregó', ai))
65 InstanciaDeEntrega.finalizar = instancia_finalizar