''' Script d'envoi automatique de mails de rappel aux maitres d'oeuvre, lorsqu'un chantier de contrôle est en état A1 (attente d'intervention) depuis plus de X jours (X est défini par la variable SEUIL_DUREE) Les données sont issues de la base Contrôles. @author: olivier.massot, oct. 2017 ''' import html import logging from path import Path # @UnusedImport import requests from requests_ntlm.requests_ntlm import HttpNtlmAuth from core import logconf from core.pde import ControlesDb logger = logging.getLogger("mails_rappel_ctrl") logconf.start("mails_rappel_ctrl", logging.DEBUG) DEBUG = False # # CONFIG # Url de l'API Rest Facteur FACTEUR_URL = "http://facteur.bas-rhin.fr/Poste/Contenu" TEMPLATE_URL = "http://facteur.bas-rhin.fr/Template/CD67" AUTH = HttpNtlmAuth(r'CG67\service.scriptapp', '8KEBKX9bO8r4N5JZXT74') # Nombre de jours à partir duquel les mails sont envoyés SEUIL_DUREE = 21 # Demarrer la requete de sélection à partir du chantier: CHANTIER_DEPART = 175000 # Contact CONTACT = "jacky.klein@bas-rhin.fr" # Contenu des mails automatiques # NB: variables optionelles utilisables dans CONTENT: {chantier_id}, {date_status}, {contact} CONTENT = """

Bonjour,

Le chantier numéro {chantier_id}, situé à '{chantier_loc}', est en attente d'une intervention depuis le {date_status:%d-%m-%Y}.

Pour plus d'information, ou si vous ne souhaitez plus recevoir de rappel pour ce chantier: {contact}

Merci,
Le Parc Départemental d'Erstein

""" # # POUR TESTER, décommenter les lignes suivantes ##----------------------------------------------- # ControlesDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\cg67Parc_data.mdb") # DEBUG = True # FACTEUR_URL = "http://t-referentiel.bas-rhin.fr/Facteur/Poste/Contenu" # logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)] # logger.warning("Mode TEST") ##----------------------------------------------- def main(): # # INITIALISATION db = ControlesDb() # Sous requête: liste les chantiers compactage/étanchéite/video. # si le chantier est en état A1, a1_status est Vrai subsql = """SELECT tblCompactageBases.lngChantierId, (tblCompactageBases.bytStatus=45 Or tblCompactageBases.bytStatus=46 Or tblCompactageBases.bytStatus=47) AS a1_status, tblCompactageBases.dtmStatus AS since FROM tblCompactageBases UNION SELECT tblEtancheiteBases.lngChantierId, (tblEtancheiteBases.bytStatus=45 Or tblEtancheiteBases.bytStatus=46 Or tblEtancheiteBases.bytStatus=47) AS a1_status, tblEtancheiteBases.dtmStatus AS since FROM tblEtancheiteBases UNION SELECT tblVideoBases.lngChantierId, (tblVideoBases.bytStatus=45 Or tblVideoBases.bytStatus=46 Or tblVideoBases.bytStatus=47) AS a1_status, tblVideoBases.dtmStatus AS since FROM tblVideoBases """ # Selectionne les chantiers pour lesquels un mail doit être envoyé sql = """SELECT tblChantiers.lngChantierId, tblChantiers.strLocChantier, tblChantiers.mailContact, tblChantiers.strInterlEntreprise, tblChantiers.stopMails, statuts.a1_status, statuts.since FROM tblChantiers INNER JOIN ({subsql}) as statuts ON tblChantiers.lngChantierId = statuts.lngChantierId WHERE statuts.a1_status=True AND tblChantiers.lngChantierId>={depart} AND statuts.since<=(Date()-{seuil}) """.format(subsql=subsql, seuil=SEUIL_DUREE, depart=CHANTIER_DEPART) # # PROCESS logger.info("Parcours des données") qry = db.execute(sql) for row in qry: chantier_id, chantier_loc, mail_to, nom_dest, stop_mails, _, since = row if DEBUG: mail_to = "olivier.massot@bas-rhin.fr" if stop_mails: logger.info("X Chantier %s: l'envoi de mail est bloqué", chantier_id) continue if not mail_to: logger.warning("X Chantier %s: pas d'adresse de contact", chantier_id) continue logger.info("> Chantier %s: envoi d'un mail à %s", chantier_id, mail_to) data = { "Application": "scripts-pde", "Sujet": "Rappel Chantier {chantier_id}".format(chantier_id=chantier_id), "MessageURL": TEMPLATE_URL, "Message": html.escape(CONTENT.format(chantier_id=chantier_id, chantier_loc=chantier_loc, date_status=since, contact=CONTACT), quote=False), "Email": mail_to, "NomExpediteur": "Script - Parc Départemental d'Erstein", "NomDestinataire": nom_dest } r = requests.post(FACTEUR_URL, auth=AUTH, data=data) logger.info("Transmission du mail au serveur: %s %s", r.status_code, r.text) r.raise_for_status() if DEBUG: break if __name__ == "__main__": main() logger.info("-- Fin --")