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