X-Git-Url: https://git.llucax.com/software/sercom-old.git/blobdiff_plain/44941ea0c8336d1b0241fc3e09051ef5fe25b1c8..7f32a60f31bd104bc04c102bf6c66dd2af7220e7:/src/sc_deliver?ds=sidebyside diff --git a/src/sc_deliver b/src/sc_deliver index 67ec78d..cd4bc00 100755 --- a/src/sc_deliver +++ b/src/sc_deliver @@ -2,6 +2,8 @@ # -*- 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 @@ -26,11 +28,19 @@ a su intento %d, recibido el %s. 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') @@ -39,25 +49,44 @@ log.info('Iniciado') # 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')