#!/usr/bin/env python2.4 # -*- 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 from sercom.sqlo import * def notificar(correccion): global conf from email.MIMEText import MIMEText import smtplib intento = correccion.intento entrega = correccion.entrega inscripto = correccion.inscripto body = ''' Se aceptó como entrega final de su ejercicio %d, entrega %d, a su intento %d, recibido el %s. ''' % (entrega.nroEjercicio, entrega.entrega, intento.numero, intento.llegada) mail = MIMEText(body, 'plain', 'iso-8859-1') mail['Subject'] = '[%s] Intento %d del ejericio %d.%d aceptado como ' \ 'entrega final.' % (conf.get('mail', 'prefijo'), intento.numero, entrega.nroEjercicio, entrega.entrega) mail['From'] = conf.get('mail', 'from') mail['To'] = inscripto.mail mail['Reply-To'] = conf.get('mail', 'admin') mail['Return-Path'] = conf.get('mail', 'admin') mail['X-Mailer'] = 'sercom ' + sercom.VERSION mail['X-Priority'] = '5' 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') 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) 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')