| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- '''
- 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 = """<p>Bonjour,</p>
- <p>
- Le chantier numéro {chantier_id}, situé à '{chantier_loc}', est en attente d'une intervention depuis le {date_status:%d-%m-%Y}.
- </p>
- <p>Pour plus d'information, ou si vous ne souhaitez plus recevoir de rappel pour ce chantier: <a href="mailto:{contact}">{contact}</a></p>
- <p>
- Merci,<br/>
- Le Parc Départemental d'Erstein
- </p>
- """
- # # 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 --")
|