mails_rappel_ctrl.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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 logging
  9. from path import Path # @UnusedImport
  10. from core import logconf
  11. from core.mail import Mail
  12. from core.pde import ControlesDb, RSCDIR
  13. from core.pde import mk_workdir # @UnusedImport
  14. logger = logging.getLogger("mails_rappel_ctrl")
  15. logconf.start("mails_rappel_ctrl", logging.DEBUG)
  16. DEBUG = False
  17. wrkdir = ""
  18. # # POUR TESTER, décommenter les lignes suivantes
  19. ##-----------------------------------------------
  20. # ControlesDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\cg67Parc_data.mdb")
  21. # DEBUG = True
  22. # wrkdir = mk_workdir("mails_rappel_ctrl_test")
  23. # logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)]
  24. # logger.warning("Mode TEST")
  25. ##-----------------------------------------------
  26. # # CONFIG
  27. # Nombre de jours à partir duquel les mails sont envoyés
  28. SEUIL_DUREE = 21
  29. # Demarrer la requete de sélection à partir du chantier:
  30. CHANTIER_DEPART = 175000
  31. # Adresse mail depuis laquelle les mails sont envoyés
  32. SENDER = "ne-pas-repondre@bas-rhin.fr"
  33. # Objet des mails automatiques
  34. SUBJECT = "Mail automatique - Rappel"
  35. # Contact
  36. CONTACT = "jacky.klein@bas-rhin.fr"
  37. # Contenu des mails automatiques
  38. # NB: variables optionelles utilisables dans CONTENT: {chantier_id}, {date_status}, {contact}
  39. with open(RSCDIR / "mail.html", encoding="utf-8") as f:
  40. content = f.read()
  41. # # INITIALISATION
  42. db = ControlesDb()
  43. # Sous requête: liste les chantiers compactage/étanchéite/video.
  44. # si le chantier est en état A1, a1_status est Vrai
  45. subsql = """SELECT tblCompactageBases.lngChantierId,
  46. (tblCompactageBases.bytStatus=45 Or tblCompactageBases.bytStatus=46 Or tblCompactageBases.bytStatus=47) AS a1_status,
  47. tblCompactageBases.dtmStatus AS since
  48. FROM tblCompactageBases
  49. UNION
  50. SELECT tblEtancheiteBases.lngChantierId,
  51. (tblEtancheiteBases.bytStatus=45 Or tblEtancheiteBases.bytStatus=46 Or tblEtancheiteBases.bytStatus=47) AS a1_status,
  52. tblEtancheiteBases.dtmStatus AS since
  53. FROM tblEtancheiteBases
  54. UNION
  55. SELECT tblVideoBases.lngChantierId,
  56. (tblVideoBases.bytStatus=45 Or tblVideoBases.bytStatus=46 Or tblVideoBases.bytStatus=47) AS a1_status,
  57. tblVideoBases.dtmStatus AS since
  58. FROM tblVideoBases
  59. """
  60. # Selectionne les chantiers pour lesquels un mail doit être envoyé
  61. sql = """SELECT tblChantiers.lngChantierId, tblChantiers.mailContact,
  62. tblChantiers.stopMails, statuts.a1_status, statuts.since
  63. FROM tblChantiers INNER JOIN ({subsql}) as statuts ON tblChantiers.lngChantierId = statuts.lngChantierId
  64. WHERE statuts.a1_status=True
  65. AND tblChantiers.lngChantierId>={depart}
  66. AND statuts.since<=(Date()-{seuil})
  67. ;
  68. """.format(subsql=subsql,
  69. seuil=SEUIL_DUREE,
  70. depart=CHANTIER_DEPART)
  71. # # PROCESS
  72. logger.debug(sql)
  73. qry = db.execute(sql)
  74. for row in qry:
  75. chantier_id, mail_to, stop_mails, a1, since = row
  76. if DEBUG:
  77. mail_to = "olivier.massot@bas-rhin.fr"
  78. if stop_mails:
  79. logger.info("X Chantier %s: l'envoi de mail est bloqué", chantier_id)
  80. continue
  81. if not mail_to:
  82. logger.warning("X Chantier %s: pas d'adresse de contact", chantier_id)
  83. continue
  84. logger.info("> Chantier %s: envoi d'un mail à %s", chantier_id, mail_to)
  85. mail = Mail(SENDER,
  86. [mail_to],
  87. SUBJECT,
  88. content.format(
  89. chantier_id=chantier_id,
  90. date_status=since,
  91. contact=CONTACT)
  92. )
  93. mail.send()
  94. if DEBUG:
  95. break