qgis_sync_etancheite.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)]
  26. logger.warning("<<<<<<<<<<<<<< Mode TEST >>>>>>>>>>>>>>>>>")
  27. ##-----------------------------------------------
  28. # Connexion à ControlesSig (postgres)
  29. csig_db = CSigDb(autocommit=False)
  30. # Connexion à Controles
  31. controles_db = ControlesDb(autocommit=False)
  32. # Connexion à Wincan
  33. wincan_db = WincanDb(autocommit=False)
  34. # filter results on the last X months, depending on corresponding parameter
  35. date_min = datetime.today() - relativedelta(months=IMPORT_DEPUIS) if IMPORT_DEPUIS >= 0 else datetime(1899, 12, 30, 0, 0, 0)
  36. logger.info("Loading data")
  37. # NB: utiliser une erquête access pré-enregistrée permet d'améliorer les perfs (la requete est pré-compilée)
  38. qessais = controles_db.read(Sql.format("""SELECT lngChantierId, bytIntervId, strTrcRegard, strResSigne, strObjetEssai
  39. FROM csig_etancheite_results WHERE dtmEssai > {:date}""", date_min))
  40. nb_r, nb_t = 0, 0
  41. for essai in qessais:
  42. # L'essai concerne un regard
  43. if essai.strObjetEssai == "R":
  44. # # Cherche le regard correspondant dans qregards
  45. regard = csig_db.first(Sql.format("""SELECT t_regards.id, t_regards.res_ce
  46. FROM t_regards INNER JOIN t_chantiers ON t_regards.id_chantier = t_chantiers.id
  47. WHERE t_regards.nom={:text} AND t_chantiers.numero={} AND t_regards.archive=False
  48. """, essai.strTrcRegard, essai.lngChantierId))
  49. if not regard:
  50. logger.info("Le regard n'existe pas dans CSig: {}, {}".format(essai.lngChantierId, essai.strTrcRegard))
  51. continue
  52. if regard.res_ce != essai.strResSigne:
  53. q = csig_db.execute(Sql.format("""UPDATE t_regards
  54. SET res_ce = {res_ce:text}
  55. WHERE id = {pgid}
  56. """, res_ce=essai.strResSigne, pgid=regard.id))
  57. nb_r += 1
  58. logger.info("Résultat mis à jour: %s, %s > %s", essai.lngChantierId, essai.strTrcRegard, essai.strResSigne)
  59. # L'essai concerne un tronçon
  60. elif essai.strObjetEssai == "T":
  61. # Parse le nom de tronçon
  62. regex = re.search(r"^(\S*)\s?-\s?(\S*)$", essai.strTrcRegard)
  63. if not regex:
  64. logger.error(u"Nom de tronçon invalide: '{}' (chantier: {})".format(essai.strTrcRegard, essai.lngChantierId))
  65. continue
  66. r1, r2 = regex.group(1), regex.group(2)
  67. troncon = csig_db.first(Sql.format("""SELECT t_troncons.id, t_chantiers.numero, t_regards_1.nom AS r1,
  68. t_regards.nom AS r2, t_troncons.res_ce, t_troncons.nom as nom
  69. FROM ((t_troncons INNER JOIN t_chantiers ON t_troncons.id_chantier = t_chantiers.id)
  70. INNER JOIN t_regards AS t_regards_1 ON t_troncons.id_regard_depart = t_regards_1.id)
  71. INNER JOIN t_regards ON t_troncons.id_regard_fin = t_regards.id
  72. WHERE t_regards_1.nom={:text} AND t_regards.nom={:text} AND t_chantiers.numero={} AND t_troncons.archive=False
  73. """, r1, r2, essai.lngChantierId))
  74. if not troncon:
  75. logger.info("Le tronçon n'existe pas dans CSig: {}, {}".format(essai.lngChantierId, essai.strTrcRegard))
  76. continue
  77. if troncon.res_ce != essai.strResSigne:
  78. q = csig_db.execute(Sql.format("""UPDATE t_troncons
  79. SET res_ce = {res_ce:text}
  80. WHERE id = {pgid};""", res_ce=essai.strResSigne, pgid=troncon.id))
  81. nb_t += 1
  82. logger.info("Résultat mis à jour: %s, %s > %s", essai.lngChantierId, essai.strTrcRegard, essai.strResSigne)
  83. # csig_db.commit()
  84. logger.info("- Opération terminée -")
  85. logger.info("%s regards et %s tronçons mis à jour", nb_r, nb_t)