qgis_sync_etancheite.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. """
  2. Met à jour les résultats des contrôles d'étanchéité des regards et tronçons de la base POSTGIS
  3. Les résultats à jour sont issus de la base Contrôles
  4. Pour des raisons de performances, seuls sont contrôlés les essais datant de moins de X mois,
  5. où X vaut 24 par défaut
  6. Pour être analysés, les noms des tronçons de la base Contrôles doivent être de la forme
  7. 'R1-R2' ou 'R2-R1' (les espaces sont acceptés avant et aprés le tiret séparateur)
  8. @author: olivier.massot, mai 2018
  9. """
  10. from datetime import datetime
  11. import logging
  12. import re
  13. from dateutil.relativedelta import relativedelta
  14. from path import Path
  15. from core import logconf
  16. from core.model import Sql
  17. from core.pde import ControlesDb, WincanDb, CSigDb
  18. logger = logging.getLogger("qgis_sync_etancheite")
  19. logconf.start("qgis_sync_etancheite", logging.DEBUG)
  20. IMPORT_DEPUIS = 24 # Ne cherche des données à importer que sur les X derniers mois (mettre à 0 pour ignorer)
  21. # # POUR TESTER, décommenter les lignes suivantes
  22. ##-----------------------------------------------
  23. # ControlesDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\cg67Parc_data.mdb")
  24. # CSigDb.server = "TR-POSTGIS-02"
  25. # CSigDb.pwd = "Am5VOMkdFHU7WwrfVOs9"
  26. # logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)]
  27. # logger.warning("<<<<<<<<<<<<<< Mode TEST >>>>>>>>>>>>>>>>>")
  28. ##-----------------------------------------------
  29. def main():
  30. # Connexion à ControlesSig (postgres)
  31. csig_db = CSigDb(autocommit=False)
  32. # Connexion à Controles
  33. controles_db = ControlesDb(autocommit=False)
  34. # Connexion à Wincan
  35. wincan_db = WincanDb(autocommit=False)
  36. # filter results on the last X months, depending on corresponding parameter
  37. date_min = datetime.today() - relativedelta(months=IMPORT_DEPUIS) if IMPORT_DEPUIS >= 0 else datetime(1899, 12, 30, 0, 0, 0)
  38. logger.info("Loading data")
  39. # NB: utiliser une erquête access pré-enregistrée permet d'améliorer les perfs (la requete est pré-compilée)
  40. qessais = controles_db.read(Sql.format("""SELECT tblEtancheiteResultats.lngChantierId, tblEtancheitePartChantiers.strTrcRegard, tblTypeEssais.strObjetEssai, tblEtancheiteResultats.strResSigne, tblEtancheiteResultats.dtmEssai
  41. FROM ((tblTypeEssais INNER JOIN tblEtancheitePartChantiers ON tblTypeEssais.bytTypeEssaiId = tblEtancheitePartChantiers.bytTypeEssai) INNER JOIN
  42. tblEtancheiteResultats ON (tblEtancheitePartChantiers.bytPartChantierId = tblEtancheiteResultats.bytPartChantierId) AND
  43. (tblEtancheitePartChantiers.lngChantierId = tblEtancheiteResultats.lngChantierId)) INNER JOIN (SELECT tblEtancheiteResultats.lngChantierId, Max(tblEtancheiteResultats.bytIntervId) AS MaxDebytIntervId, tblEtancheiteResultats.bytPartChantierId
  44. FROM tblEtancheiteResultats
  45. GROUP BY tblEtancheiteResultats.lngChantierId, tblEtancheiteResultats.bytPartChantierId) as filter_intervs ON
  46. (tblEtancheiteResultats.bytPartChantierId = filter_intervs.bytPartChantierId) AND
  47. (tblEtancheiteResultats.bytIntervId = filter_intervs.MaxDebytIntervId) AND
  48. (tblEtancheiteResultats.lngChantierId = filter_intervs.lngChantierId)
  49. WHERE tblEtancheiteResultats.dtmEssai>{:date};
  50. """, date_min))
  51. nb_r, nb_t = 0, 0
  52. for essai in qessais:
  53. # L'essai concerne un regard
  54. if essai.strObjetEssai == "R":
  55. # # Cherche le regard correspondant dans qregards
  56. regard = csig_db.first(Sql.format("""SELECT t_regards.id, t_regards.res_ce
  57. FROM t_regards INNER JOIN t_chantiers ON t_regards.id_chantier = t_chantiers.id
  58. WHERE t_regards.nom={:text} AND t_chantiers.numero={} AND t_regards.archive=False
  59. """, essai.strTrcRegard, essai.lngChantierId))
  60. if not regard:
  61. continue
  62. if regard.res_ce != essai.strResSigne:
  63. q = csig_db.execute(Sql.format("""UPDATE t_regards
  64. SET res_ce = {res_ce:text}
  65. WHERE id = {pgid}
  66. """, res_ce=essai.strResSigne, pgid=regard.id))
  67. nb_r += 1
  68. logger.info("Résultat mis à jour: %s, %s > %s", essai.lngChantierId, essai.strTrcRegard, essai.strResSigne)
  69. # L'essai concerne un tronçon
  70. elif essai.strObjetEssai == "T":
  71. # Parse le nom de tronçon
  72. regex = re.search(r"^(\S*)\s?-\s?(\S*)$", essai.strTrcRegard)
  73. if not regex:
  74. logger.error(u"Nom de tronçon invalide: '{}' (chantier: {})".format(essai.strTrcRegard, essai.lngChantierId))
  75. continue
  76. r1, r2 = regex.group(1), regex.group(2)
  77. troncon = csig_db.first(Sql.format("""SELECT t_troncons.id, t_chantiers.numero, t_regards_1.nom AS r1,
  78. t_regards.nom AS r2, t_troncons.res_ce, t_troncons.nom as nom
  79. FROM ((t_troncons INNER JOIN t_chantiers ON t_troncons.id_chantier = t_chantiers.id)
  80. INNER JOIN t_regards AS t_regards_1 ON t_troncons.id_regard_depart = t_regards_1.id)
  81. INNER JOIN t_regards ON t_troncons.id_regard_fin = t_regards.id
  82. WHERE ((t_regards_1.nom={r1:text} AND t_regards.nom={r2:text})
  83. OR (t_regards_1.nom={r2:text} AND t_regards.nom={r1:text}))
  84. AND t_chantiers.numero={num_chantier} AND t_troncons.archive=False
  85. """, r1=r1, r2=r2, num_chantier=essai.lngChantierId))
  86. if not troncon:
  87. continue
  88. if troncon.res_ce != essai.strResSigne:
  89. csig_db.execute(Sql.format("""UPDATE t_troncons
  90. SET res_ce = {res_ce:text}
  91. WHERE id = {pgid};""", res_ce=essai.strResSigne, pgid=troncon.id))
  92. nb_t += 1
  93. logger.info("Résultat mis à jour: %s, %s > %s", essai.lngChantierId, essai.strTrcRegard, essai.strResSigne)
  94. csig_db.commit()
  95. logger.info("%s regards et %s tronçons mis à jour", nb_r, nb_t)
  96. if __name__ == "__main__":
  97. main()
  98. logger.info("-- Fin --")