]> git.llucax.com Git - software/sercom-old.git/blob - src/sc_deliver
Se agrega un timeout a sqlite para que espere si esta lockeada la DB.
[software/sercom-old.git] / src / sc_deliver
1 #!/usr/bin/env python2.4
2 # -*- encoding: iso-8859-1 -*-
3 # vim: set et sw=4 sts=4 :
4
5 # Módulos estándar
6 import time
7 # Módulos locales
8 import sercom
9 import sercom.sqlo
10 from sercom.sqlo import *
11
12 def notificar(correccion):
13     global conf
14     from email.MIMEText import MIMEText
15     import smtplib
16     intento = correccion.intento
17     entrega = correccion.entrega
18     inscripto = correccion.inscripto
19     body = '''
20 Se aceptó como entrega final de su ejercicio %d, entrega %d,
21 a su intento %d, recibido el %s.
22 ''' % (entrega.nroEjercicio, entrega.entrega, intento.numero, intento.llegada)
23     mail = MIMEText(body, 'plain', 'iso-8859-1')
24     mail['Subject'] = '[%s] Intento %d del ejericio %d.%d aceptado como ' \
25         'entrega final.' % (conf.get('mail', 'prefijo'), intento.numero,
26         entrega.nroEjercicio, entrega.entrega)
27     mail['From'] = conf.get('mail', 'from')
28     mail['To'] = inscripto.mail
29     mail['Reply-To'] = conf.get('mail', 'admin')
30     mail['Return-Path'] = conf.get('mail', 'admin')
31     mail['X-Mailer'] = 'sercom ' + sercom.VERSION
32     mail['X-Priority'] = '5'
33     sent = False
34     while not sent:
35         try:
36             smtp = smtplib.SMTP(conf.get('mail', 'smtp'))
37             smtp.sendmail(mail['From'], mail['To'], mail.as_string())
38             smtp.close()
39             sent = True
40         except smtplib.SMTPException, e:
41             log.warning('No se pudo enviar el mail a %s (%s)',
42                 inscripto.padron, inscripto.mail)
43             time.sleep(1)
44
45 # Inicializo
46 conf, conn, log = sercom.init('deliver')
47 log.info('Iniciado')
48
49 # Utilizo el directorio de datos como base para todos los SQLObjects
50 sercom.sqlo.dir_base = conf.get('general', 'data_dir')
51
52 # Atajo
53 intervalo = float(conf.get('general', 'intervalo'))
54
55 # Busco entregas pendientes
56 for entrega in Entrega.getPendientes(conn):
57     log.debug('Hay una entrega pendiente: %d.%d.%d', entrega.curso.curso,
58         entrega.nroEjercicio, entrega.entrega)
59     while Intento.faltaCompilar(entrega, conn):
60         log.debug('Esperando que termine de compilar, faltan %d intentos',
61             Intento.faltaCompilar(entrega, conn))
62         time.sleep(intervalo)
63     log.info('Procesando entrega %d.%d.%d', entrega.curso.curso,
64         entrega.nroEjercicio, entrega.entrega)
65     for inscripto in Inscripto.selectBy(cursoID=entrega.cursoID, activo=True,
66             connection=conn):
67         log.debug('Procesando inscripto: %s', inscripto)
68         intentos = list(Intento.select(
69             sercom.sqlo.AND(Intento.q.inscriptoID == inscripto.id,
70                 Intento.q.entregaID == entrega.id),
71             orderBy=-Intento.q.numero, connection=conn))
72         no_entrega = True
73         for intento in intentos:
74             log.debug('Procesando intento: %s', intento)
75             # Si aprobó las pruebas públicas, está apto para corregir
76             if intento.pruebasPublicasPasadas:
77                 correccion = Correccion(entrega=entrega, inscripto=inscripto,
78                     intento=intento, docente=1, connection=conn) #XXX Docente dummy
79                 notificar(correccion)
80                 no_entrega = False
81                 log.info('Intento %d del alumno %d aceptado como entrega final.',
82                     intento.numero, inscripto.padron)
83                 break
84         # Si no tiene ningún intento 'entregable', es algo malo.
85         if intentos and no_entrega:
86             log.warn('El alumno con padrón %d tiene intentos para la ' \
87                 'entrega %d.%d pero ninguno es aceptable', inscripto.padron,
88                 entrega.nroEjercicio, entrega.entrega)
89     log.debug('Entrega finalizada')
90     entrega.finalizada = True
91
92 log.info('Finalizado')