""" Met à jour les résultats des contrôles d'étanchéité des regards et tronçons de la base POSTGIS Les résultats à jour sont issus de la base Contrôles Pour des raisons de performances, seuls sont contrôlés les essais datant de moins de X mois, où X vaut 24 par défaut Pour être analysés, les noms des tronçons de la base Contrôles doivent être de la forme 'R1-R2' ou 'R2-R1' (les espaces sont acceptés avant et aprés le tiret séparateur) @author: olivier.massot, mai 2018 """ from datetime import datetime import logging import re from dateutil.relativedelta import relativedelta from path import Path from core import logconf from core.model import Sql from core.pde import ControlesDb, WincanDb, CSigDb logger = logging.getLogger("qgis_sync_etancheite") logconf.start("qgis_sync_etancheite", logging.DEBUG) IMPORT_DEPUIS = 24 # Ne cherche des données à importer que sur les X derniers mois (mettre à 0 pour ignorer) # # POUR TESTER, décommenter les lignes suivantes ##----------------------------------------------- # ControlesDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\cg67Parc_data.mdb") # CSigDb.server = "TR-POSTGIS-02" # CSigDb.pwd = "Am5VOMkdFHU7WwrfVOs9" # logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)] # logger.warning("<<<<<<<<<<<<<< Mode TEST >>>>>>>>>>>>>>>>>") ##----------------------------------------------- # Connexion à ControlesSig (postgres) csig_db = CSigDb(autocommit=False) # Connexion à Controles controles_db = ControlesDb(autocommit=False) # Connexion à Wincan wincan_db = WincanDb(autocommit=False) # filter results on the last X months, depending on corresponding parameter date_min = datetime.today() - relativedelta(months=IMPORT_DEPUIS) if IMPORT_DEPUIS >= 0 else datetime(1899, 12, 30, 0, 0, 0) logger.info("Loading data") # NB: utiliser une erquête access pré-enregistrée permet d'améliorer les perfs (la requete est pré-compilée) qessais = controles_db.read(Sql.format("""SELECT tblEtancheiteResultats.lngChantierId, tblEtancheitePartChantiers.strTrcRegard, tblTypeEssais.strObjetEssai, tblEtancheiteResultats.strResSigne, tblEtancheiteResultats.dtmEssai FROM ((tblTypeEssais INNER JOIN tblEtancheitePartChantiers ON tblTypeEssais.bytTypeEssaiId = tblEtancheitePartChantiers.bytTypeEssai) INNER JOIN tblEtancheiteResultats ON (tblEtancheitePartChantiers.bytPartChantierId = tblEtancheiteResultats.bytPartChantierId) AND (tblEtancheitePartChantiers.lngChantierId = tblEtancheiteResultats.lngChantierId)) INNER JOIN (SELECT tblEtancheiteResultats.lngChantierId, Max(tblEtancheiteResultats.bytIntervId) AS MaxDebytIntervId, tblEtancheiteResultats.bytPartChantierId FROM tblEtancheiteResultats GROUP BY tblEtancheiteResultats.lngChantierId, tblEtancheiteResultats.bytPartChantierId) as filter_intervs ON (tblEtancheiteResultats.bytPartChantierId = filter_intervs.bytPartChantierId) AND (tblEtancheiteResultats.bytIntervId = filter_intervs.MaxDebytIntervId) AND (tblEtancheiteResultats.lngChantierId = filter_intervs.lngChantierId) WHERE tblEtancheiteResultats.dtmEssai>{:date}; """, date_min)) nb_r, nb_t = 0, 0 for essai in qessais: # L'essai concerne un regard if essai.strObjetEssai == "R": # # Cherche le regard correspondant dans qregards regard = csig_db.first(Sql.format("""SELECT t_regards.id, t_regards.res_ce FROM t_regards INNER JOIN t_chantiers ON t_regards.id_chantier = t_chantiers.id WHERE t_regards.nom={:text} AND t_chantiers.numero={} AND t_regards.archive=False """, essai.strTrcRegard, essai.lngChantierId)) if not regard: continue if regard.res_ce != essai.strResSigne: q = csig_db.execute(Sql.format("""UPDATE t_regards SET res_ce = {res_ce:text} WHERE id = {pgid} """, res_ce=essai.strResSigne, pgid=regard.id)) nb_r += 1 logger.info("Résultat mis à jour: %s, %s > %s", essai.lngChantierId, essai.strTrcRegard, essai.strResSigne) # L'essai concerne un tronçon elif essai.strObjetEssai == "T": # Parse le nom de tronçon regex = re.search(r"^(\S*)\s?-\s?(\S*)$", essai.strTrcRegard) if not regex: logger.error(u"Nom de tronçon invalide: '{}' (chantier: {})".format(essai.strTrcRegard, essai.lngChantierId)) continue r1, r2 = regex.group(1), regex.group(2) troncon = csig_db.first(Sql.format("""SELECT t_troncons.id, t_chantiers.numero, t_regards_1.nom AS r1, t_regards.nom AS r2, t_troncons.res_ce, t_troncons.nom as nom FROM ((t_troncons INNER JOIN t_chantiers ON t_troncons.id_chantier = t_chantiers.id) INNER JOIN t_regards AS t_regards_1 ON t_troncons.id_regard_depart = t_regards_1.id) INNER JOIN t_regards ON t_troncons.id_regard_fin = t_regards.id WHERE ((t_regards_1.nom={r1:text} AND t_regards.nom={r2:text}) OR (t_regards_1.nom={r2:text} AND t_regards.nom={r1:text})) AND t_chantiers.numero={num_chantier} AND t_troncons.archive=False """, r1=r1, r2=r2, num_chantier=essai.lngChantierId)) if not troncon: continue if troncon.res_ce != essai.strResSigne: q = csig_db.execute(Sql.format("""UPDATE t_troncons SET res_ce = {res_ce:text} WHERE id = {pgid};""", res_ce=essai.strResSigne, pgid=troncon.id)) nb_t += 1 logger.info("Résultat mis à jour: %s, %s > %s", essai.lngChantierId, essai.strTrcRegard, essai.strResSigne) csig_db.commit() logger.info("- Opération terminée -") logger.info("%s regards et %s tronçons mis à jour", nb_r, nb_t)