# -*- encoding: iso-8859-1 -*-
# vim: set et sw=4 sts=4 :
+# Módulos estándar
+import time
# Módulos locales
import sercom
import sercom.sqlo
mail['To'] = inscripto.mail
mail['Reply-To'] = conf.get('mail', 'admin')
mail['Return-Path'] = conf.get('mail', 'admin')
- mail['X-Mailer'] = 'sercom 0.3'
+ mail['X-Mailer'] = 'sercom ' + sercom.VERSION
mail['X-Priority'] = '5'
- smtp = smtplib.SMTP(conf.get('mail', 'smtp'))
- smtp.sendmail(mail['From'], mail['To'], mail.as_string())
- smtp.close()
+ sent = False
+ while not sent:
+ try:
+ smtp = smtplib.SMTP(conf.get('mail', 'smtp'))
+ smtp.sendmail(mail['From'], mail['To'], mail.as_string())
+ smtp.close()
+ sent = True
+ except smtplib.SMTPException, e:
+ log.warning('No se pudo enviar el mail a %s (%s)',
+ inscripto.padron, inscripto.mail)
+ time.sleep(1)
# Inicializo
conf, conn, log = sercom.init('deliver')
# Utilizo el directorio de datos como base para todos los SQLObjects
sercom.sqlo.dir_base = conf.get('general', 'data_dir')
+# Atajo
+intervalo = float(conf.get('general', 'intervalo'))
+
# Busco entregas pendientes
for entrega in Entrega.getPendientes(conn):
+ log.debug('Hay una entrega pendiente: %d.%d.%d', entrega.curso.curso,
+ entrega.nroEjercicio, entrega.entrega)
+ while Intento.faltaCompilar(entrega, conn):
+ log.debug('Esperando que termine de compilar, faltan %d intentos',
+ Intento.faltaCompilar(entrega, conn))
+ time.sleep(intervalo)
log.info('Procesando entrega %d.%d.%d', entrega.curso.curso,
entrega.nroEjercicio, entrega.entrega)
for inscripto in Inscripto.selectBy(cursoID=entrega.cursoID, activo=True,
connection=conn):
log.debug('Procesando inscripto: %s', inscripto)
- for intento in Intento.select(sercom.sqlo.AND(
- Intento.q.inscriptoID == inscripto.id, Intento.q.entregaID == entrega.id),
- orderBy=-Intento.q.numero, connection=conn):
+ intentos = list(Intento.select(
+ sercom.sqlo.AND(Intento.q.inscriptoID == inscripto.id,
+ Intento.q.entregaID == entrega.id),
+ orderBy=-Intento.q.numero, connection=conn))
+ no_entrega = True
+ for intento in intentos:
log.debug('Procesando intento: %s', intento)
# Si aprobó las pruebas públicas, está apto para corregir
if intento.pruebasPublicasPasadas:
correccion = Correccion(entrega=entrega, inscripto=inscripto,
intento=intento, docente=1, connection=conn) #XXX Docente dummy
notificar(correccion)
+ no_entrega = False
log.info('Intento %d del alumno %d aceptado como entrega final.',
intento.numero, inscripto.padron)
break
+ # Si no tiene ningún intento 'entregable', es algo malo.
+ if intentos and no_entrega:
+ log.warn('El alumno con padrón %d tiene intentos para la ' \
+ 'entrega %d.%d pero ninguno es aceptable', inscripto.padron,
+ entrega.nroEjercicio, entrega.entrega)
log.debug('Entrega finalizada')
entrega.finalizada = True
+log.info('Finalizado')