1 # vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker :
3 from sercom.model import InstanciaDeEntrega, Entrega, SQLObjectNotFound
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 e = Entrega.selectBy(instancia=self, entregador=ai) \
58 .orderBy(-Entrega.q.fecha) \
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)
66 InstanciaDeEntrega.finalizar = instancia_finalizar