| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- """
- 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 >>>>>>>>>>>>>>>>>")
- ##-----------------------------------------------
- def main():
- # 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:
- 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("%s regards et %s tronçons mis à jour", nb_r, nb_t)
- if __name__ == "__main__":
- main()
- logger.info("-- Fin --")
|