'''
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 --")