mails_rappel_ctrl.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. '''
  2. Script d'envoi automatique de mails de rappel aux maitres d'oeuvre,
  3. lorsqu'un chantier de contrôle est en état A1 (attente d'intervention)
  4. depuis plus de X jours (X est défini par la variable SEUIL_DUREE)
  5. Les données sont issues de la base Contrôles.
  6. @author: olivier.massot, oct. 2017
  7. '''
  8. import html
  9. import logging
  10. from path import Path # @UnusedImport
  11. import requests
  12. from requests_ntlm.requests_ntlm import HttpNtlmAuth
  13. from core import logconf
  14. from core.pde import ControlesDb
  15. from core.pde import mk_workdir # @UnusedImport
  16. logger = logging.getLogger("mails_rappel_ctrl")
  17. logconf.start("mails_rappel_ctrl", logging.DEBUG)
  18. DEBUG = False
  19. wrkdir = ""
  20. # # CONFIG
  21. # Url de l'API Rest Facteur
  22. FACTEUR_URL = "http://referentiel.bas-rhin.fr/Facteur/Poste/Contenu"
  23. TEMPLATE_URL = "http://referentiel.bas-rhin.fr/Facteur/Template/CD67"
  24. AUTH = HttpNtlmAuth(r'CG67\service.scriptapp', '8KEBKX9bO8r4N5JZXT74')
  25. # Nombre de jours à partir duquel les mails sont envoyés
  26. SEUIL_DUREE = 21
  27. # Demarrer la requete de sélection à partir du chantier:
  28. CHANTIER_DEPART = 175000
  29. # Contact
  30. CONTACT = "jacky.klein@bas-rhin.fr"
  31. # Contenu des mails automatiques
  32. # NB: variables optionelles utilisables dans CONTENT: {chantier_id}, {date_status}, {contact}
  33. CONTENT = """<p>Bonjour,</p>
  34. <p>
  35. Le chantier numéro {chantier_id} est en attente d'une intervention depuis le {date_status:%d-%m-%Y}.
  36. </p>
  37. <p>Pour plus d'information, ou si vous ne souhaitez plus recevoir de rappel pour ce chantier: <a href="mailto:{contact}">{contact}</a></p>
  38. <p>
  39. Merci,<br/>
  40. Le Parc Départemental d'Erstein
  41. </p>
  42. """
  43. # # POUR TESTER, décommenter les lignes suivantes
  44. ##-----------------------------------------------
  45. # ControlesDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\cg67Parc_data.mdb")
  46. # DEBUG = True
  47. # FACTEUR_URL = "http://t-referentiel.bas-rhin.fr/Facteur/Poste/Contenu"
  48. # wrkdir = mk_workdir("mails_rappel_ctrl_test")
  49. # logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)]
  50. # logger.warning("Mode TEST")
  51. ##-----------------------------------------------
  52. # # INITIALISATION
  53. db = ControlesDb()
  54. # Sous requête: liste les chantiers compactage/étanchéite/video.
  55. # si le chantier est en état A1, a1_status est Vrai
  56. subsql = """SELECT tblCompactageBases.lngChantierId,
  57. (tblCompactageBases.bytStatus=45 Or tblCompactageBases.bytStatus=46 Or tblCompactageBases.bytStatus=47) AS a1_status,
  58. tblCompactageBases.dtmStatus AS since
  59. FROM tblCompactageBases
  60. UNION
  61. SELECT tblEtancheiteBases.lngChantierId,
  62. (tblEtancheiteBases.bytStatus=45 Or tblEtancheiteBases.bytStatus=46 Or tblEtancheiteBases.bytStatus=47) AS a1_status,
  63. tblEtancheiteBases.dtmStatus AS since
  64. FROM tblEtancheiteBases
  65. UNION
  66. SELECT tblVideoBases.lngChantierId,
  67. (tblVideoBases.bytStatus=45 Or tblVideoBases.bytStatus=46 Or tblVideoBases.bytStatus=47) AS a1_status,
  68. tblVideoBases.dtmStatus AS since
  69. FROM tblVideoBases
  70. """
  71. # Selectionne les chantiers pour lesquels un mail doit être envoyé
  72. sql = """SELECT tblChantiers.lngChantierId, tblChantiers.mailContact, tblChantiers.strInterlEntreprise,
  73. tblChantiers.stopMails, statuts.a1_status, statuts.since
  74. FROM tblChantiers INNER JOIN ({subsql}) as statuts ON tblChantiers.lngChantierId = statuts.lngChantierId
  75. WHERE statuts.a1_status=True
  76. AND tblChantiers.lngChantierId>={depart}
  77. AND statuts.since<=(Date()-{seuil})
  78. ;
  79. """.format(subsql=subsql,
  80. seuil=SEUIL_DUREE,
  81. depart=CHANTIER_DEPART)
  82. # # PROCESS
  83. qry = db.execute(sql)
  84. for row in qry:
  85. chantier_id, mail_to, nom_dest, stop_mails, a1, since = row
  86. if DEBUG:
  87. mail_to = "olivier.massot@bas-rhin.fr"
  88. if stop_mails:
  89. logger.info("X Chantier %s: l'envoi de mail est bloqué", chantier_id)
  90. continue
  91. if not mail_to:
  92. logger.warning("X Chantier %s: pas d'adresse de contact", chantier_id)
  93. continue
  94. logger.info("> Chantier %s: envoi d'un mail à %s", chantier_id, mail_to)
  95. data = {
  96. "Application": "scripts-pde",
  97. "Sujet": "Rappel Chantier {chantier_id}".format(chantier_id=chantier_id),
  98. "MessageURL": TEMPLATE_URL,
  99. "Message": html.escape(CONTENT.format(chantier_id=chantier_id, date_status=since, contact=CONTACT), quote=False),
  100. "Email": mail_to,
  101. "NomExpediteur": "Script - Parc Départemental d'Erstein",
  102. "NomDestinataire": nom_dest
  103. }
  104. r = requests.post("http://t-referentiel.bas-rhin.fr/Facteur/Poste/Contenu", auth=AUTH, data=data)
  105. logger.info("Transmission du mail au serveur: %s %s", r.status_code, r.text)
  106. r.raise_for_status()
  107. if DEBUG:
  108. break