Explorar el Código

CHG #20 Insère la synchro wincan au démarrage de la synchro video

olivier.massot hace 7 años
padre
commit
6dae410c9e
Se han modificado 5 ficheros con 344 adiciones y 328 borrados
  1. 2 0
      logging.yaml
  2. 214 203
      qgis_sync_video.py
  3. 122 118
      qgis_sync_wincan.py
  4. 0 1
      resources/test_qgis_sync_video.py
  5. 6 6
      resources/test_qgis_sync_wincan.py

+ 2 - 0
logging.yaml

@@ -58,9 +58,11 @@ loggers:
     qgis_sync_wincan:
         level: DEBUG
         handlers: [console, file]
+        propagate: no
     qgis_sync_video:
         level: DEBUG
         handlers: [console, file]
+        propagate: no
     qgis_sync_videores:
         level: DEBUG
         handlers: [console, file]

+ 214 - 203
qgis_sync_video.py

@@ -14,12 +14,14 @@ import logging
 import re
 import sys
 
-from path import Path
+from path import Path  # @UnusedImport
 
 from core import logconf
 from core.model import Sql
 from core.pde import WincanDb, QGisRegard, QGisChantier, QGisTroncon, \
     ControlesDb, CSigDb, SRID
+import qgis_sync_wincan
+
 
 
 logger = logging.getLogger("qgis_sync_video")
@@ -28,227 +30,236 @@ logconf.start("qgis_sync_video", logging.DEBUG)
 # # POUR TESTER, décommenter les lignes suivantes
 ##-----------------------------------------------
 
-# ControlesDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\cg67Parc_data.mdb")
-# WincanDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\Wincan\parc_2007\DB\PARC_2007.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   >>>>>>>>>>>>>>>>>")
+ControlesDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\cg67Parc_data.mdb")
+WincanDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\Wincan\parc_2007\DB\PARC_2007.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 à CSig
-csig_db = CSigDb(autocommit=False)
-
-# Connexion à Wincan
-wincan_db = WincanDb(autocommit=False)
-
-# Connexion à Controles
-controles_db = ControlesDb(autocommit=False)
-
-
-logger.info("Chargement des données")
-qessais = wincan_db.read(Sql.format("""SELECT S_AutoNumber, S_StartNode, S_EndNode, S_StartNodeCoord_X, S_StartNodeCoord_Y,
-                                         S_EndNodeCoord_X, S_EndNodeCoord_Y, SI_AutoNumber, SI_InspName
-                                         FROM csig_sync_video;"""))
-chantiers = {}
-
-for essai in qessais:
-    chantier_name = "<inconnu>"
-
-    r1, r2 = QGisRegard(), QGisRegard()
-
-    r1.number = essai.S_StartNode
-    r1.x = essai.S_StartNodeCoord_X
-    r1.y = essai.S_StartNodeCoord_Y
-
-    r2.number = essai.S_EndNode
-    r2.x = essai.S_EndNodeCoord_X
-    r2.y = essai.S_EndNodeCoord_Y
-
-    if not essai.SI_AutoNumber:
-        logger.error("%s - Le SI_Autonumber du troncon est manquant", essai.SI_InspName)
-        continue
-
-    # Parse le nom du chantier
-    parsed = re.search(r"^(\d{5,6})(-S?\d{1,2})?[\s_]?(.*)$", essai.SI_InspName)
-    if not parsed:
-        logger.error("Nom de chantier illisible: '{}'".format(essai.SI_InspName))
-        continue
-
-    chantier_number = parsed.group(1)
-
-    # Créé un nouveau chantier si pas encore créé
-    try:
-        chantier = chantiers[chantier_number]
-    except KeyError:
-        chantier = QGisChantier()
-        chantier.name = essai.SI_InspName
-        chantier.number = chantier_number
-        chantiers[chantier_number] = chantier
-
-    # Créé un nouveau tronçon
-    troncon = QGisTroncon()
-    troncon.r1 = r1
-    troncon.r2 = r2
-    troncon.si_autonumber = essai.SI_AutoNumber
-    troncon.s_autonumber = essai.S_AutoNumber
-
-    # Importe le résultat de l'essai Vidéo depuis contrôle
-    row = controles_db.first(Sql.format("""SELECT DG FROM csig_itv_results
-                                             WHERE SI_AutoNumber={si_autonumber}
-                                             """, si_autonumber=essai.SI_AutoNumber))
-    if row:
-        troncon.res_itv = row.DG
-    else:
-        logger.error("Impossible de trouver le resultat ITV du tronçon {}-{} (%s)", r1.number, r2.number, essai.SI_InspName)
-
-    # Importe le résultat de l'essai d'Etanchéité du tronçon depuis contrôle
-    row = controles_db.first(Sql.format("""SELECT strResSigne FROM csig_etancheite_results
-                                   WHERE (strTrcRegard='{r1}-{r2}' OR strTrcRegard='{r2}-{r1}')
-                                        AND lngChantierId={lngChantierId}
-                                    """, r1=r1.number, r2=r2.number, lngChantierId=chantier_number))
-    if row:
-        troncon.res_ce = row.strResSigne
-    else:
-        logger.error("Impossible de trouver le resultat Etanchéité du tronçon %s-%s (%s)", r1.number, r2.number, essai.SI_InspName)
-
-
-    # Importe le résultat de l'essai d'Etanchéité des regards depuis contrôle
-    for regard in (troncon.r1, troncon.r2):
+def main():
+
+    # Connexion à CSig
+    csig_db = CSigDb(autocommit=False)
+
+    # Connexion à Wincan
+    wincan_db = WincanDb(autocommit=False)
+
+    # Connexion à Controles
+    controles_db = ControlesDb(autocommit=False)
+
+
+    logger.info("Chargement des données")
+    qessais = wincan_db.read(Sql.format("""SELECT S_AutoNumber, S_StartNode, S_EndNode, S_StartNodeCoord_X, S_StartNodeCoord_Y,
+                                             S_EndNodeCoord_X, S_EndNodeCoord_Y, SI_AutoNumber, SI_InspName
+                                             FROM csig_sync_video;"""))
+    chantiers = {}
+
+    for essai in qessais:
+        r1, r2 = QGisRegard(), QGisRegard()
+
+        r1.number = essai.S_StartNode
+        r1.x = essai.S_StartNodeCoord_X
+        r1.y = essai.S_StartNodeCoord_Y
+
+        r2.number = essai.S_EndNode
+        r2.x = essai.S_EndNodeCoord_X
+        r2.y = essai.S_EndNodeCoord_Y
 
+        if not essai.SI_AutoNumber:
+            logger.error("%s - Le SI_Autonumber du troncon est manquant", essai.SI_InspName)
+            continue
+
+        # Parse le nom du chantier
+        parsed = re.search(r"^(\d{5,6})(-S?\d{1,2})?[\s_]?(.*)$", essai.SI_InspName)
+        if not parsed:
+            logger.error("Nom de chantier illisible: '{}'".format(essai.SI_InspName))
+            continue
+
+        chantier_number = parsed.group(1)
+
+        # Créé un nouveau chantier si pas encore créé
+        try:
+            chantier = chantiers[chantier_number]
+        except KeyError:
+            chantier = QGisChantier()
+            chantier.name = essai.SI_InspName
+            chantier.number = chantier_number
+            chantiers[chantier_number] = chantier
+
+        # Créé un nouveau tronçon
+        troncon = QGisTroncon()
+        troncon.r1 = r1
+        troncon.r2 = r2
+        troncon.si_autonumber = essai.SI_AutoNumber
+        troncon.s_autonumber = essai.S_AutoNumber
+
+        # Importe le résultat de l'essai Vidéo depuis contrôle
+        row = controles_db.first(Sql.format("""SELECT DG FROM csig_itv_results
+                                                 WHERE SI_AutoNumber={si_autonumber}
+                                                 """, si_autonumber=essai.SI_AutoNumber))
+        if row:
+            troncon.res_itv = row.DG
+        else:
+            logger.error("Impossible de trouver le resultat ITV du tronçon {}-{} (%s)", r1.number, r2.number, essai.SI_InspName)
+
+        # Importe le résultat de l'essai d'Etanchéité du tronçon depuis contrôle
         row = controles_db.first(Sql.format("""SELECT strResSigne FROM csig_etancheite_results
-                                                WHERE strTrcRegard={regard:text} AND lngChantierId={lngChantierId}
-                                                """, regard=regard.number, lngChantierId=chantier_number))
+                                       WHERE (strTrcRegard='{r1}-{r2}' OR strTrcRegard='{r2}-{r1}')
+                                            AND lngChantierId={lngChantierId}
+                                        """, r1=r1.number, r2=r2.number, lngChantierId=chantier_number))
         if row:
-            regard.res_ce = row.strResSigne
+            troncon.res_ce = row.strResSigne
         else:
-            logger.error("Impossible de trouver le resultat Etanchéité du regard %s (%s)", regard.number, essai.SI_InspName)
+            logger.error("Impossible de trouver le resultat Etanchéité du tronçon %s-%s (%s)", r1.number, r2.number, essai.SI_InspName)
 
-    chantier.items.append(troncon)
 
-if not chantiers:
-    logger.info("Aucun nouveaux chantiers")
-    sys.exit(0)
+        # Importe le résultat de l'essai d'Etanchéité des regards depuis contrôle
+        for regard in (troncon.r1, troncon.r2):
 
-logger.info("{} chantiers chargés en mémoire".format(len(chantiers)))
+            row = controles_db.first(Sql.format("""SELECT strResSigne FROM csig_etancheite_results
+                                                    WHERE strTrcRegard={regard:text} AND lngChantierId={lngChantierId}
+                                                    """, regard=regard.number, lngChantierId=chantier_number))
+            if row:
+                regard.res_ce = row.strResSigne
+            else:
+                logger.error("Impossible de trouver le resultat Etanchéité du regard %s (%s)", regard.number, essai.SI_InspName)
 
+        chantier.items.append(troncon)
 
-# Pour la génération des etiquettes
-_labbelled = []
-def label_for(id_chantier, regard_number):
-    """ Renvoie le contenu de l'etiquette pour le regard
-    Un regard est etiquetté seulement si c'est le premier du chantier portant ce numéro """
-    if not (id_chantier, regard_number) in _labbelled:
-        _labbelled.append((id_chantier, regard_number))
-        return regard_number
-    else:
-        return ""
+    if not chantiers:
+        logger.info("Aucun nouveaux chantiers")
+        sys.exit(0)
 
+    logger.info("{} chantiers chargés en mémoire".format(len(chantiers)))
 
-for chantier in chantiers.values():
-    logger.info("** Création du chantier: {}".format(chantier.name))
 
-    # Vérifie si le chantier existe déjà
-    existants = csig_db.read_all(Sql.format("SELECT id FROM t_chantiers WHERE nom = {:text} AND id_type_chantier=1", chantier.name))
+    # Pour la génération des etiquettes
+    _labbelled = []
+    def label_for(id_chantier, regard_number):
+        """ Renvoie le contenu de l'etiquette pour le regard
+        Un regard est etiquetté seulement si c'est le premier du chantier portant ce numéro """
+        if not (id_chantier, regard_number) in _labbelled:
+            _labbelled.append((id_chantier, regard_number))
+            return regard_number
+        else:
+            return ""
 
-    cancel = False
 
-    for row in existants:
-        logger.info("Un chantier portant ce nom existe déjà dans ControlesSig {} (id {})".format(chantier.name, row.id))
+    for chantier in chantiers.values():
+        logger.info("** Création du chantier: {}".format(chantier.name))
 
-        replace = input("Voulez-vous le remplacer? (o/n)")
-        if replace:
-            # Supprime l'ancien chantier
-            csig_db.execute(Sql.format("""DELETE FROM t_troncons WHERE id_chantier = {}""", row.id))
-            csig_db.execute(Sql.format("""DELETE FROM t_regards WHERE id_chantier = {}""", row.id))
-            csig_db.execute(Sql.format("""DELETE FROM t_chantiers WHERE id = {}""", row.id))
-        else:
-            # pass the chantier, do not register any error
-            logger.warning("Import du chantier annulé par l'utilisateur")
-            cancel = True
-
-    if cancel:
-        continue
-
-    # Calcule l'emprise du chantier
-    regards = set([troncon.r1 for troncon in chantier.items]) | set([troncon.r2 for troncon in chantier.items])
-    chantier.x0 = min([regard.x for regard in regards]) - 5
-    chantier.x1 = max([regard.x for regard in regards]) + 5
-    chantier.y0 = min([regard.y for regard in regards]) - 5
-    chantier.y1 = max([regard.y for regard in regards]) + 5
-
-    # Créé le chantier
-    logger.info("> Création du chantier")
-
-    row = csig_db.first(Sql.format("""INSERT INTO t_chantiers(id_type_chantier, numero, nom, archive, geom)
-                                       VALUES ({chantier_type}, {number}, {name:text}, False,
-                                               ST_GeomFromText('POLYGON(({x0} {y0}, {x0} {y1}, {x1} {y1}, {x1} {y0}, {x0} {y0}))', {srid}))
-                                       RETURNING id
-                                        """, chantier_type=1,
-                                            number=chantier.number,
-                                            name=chantier.name,
-                                            x0=chantier.x0,
-                                            x1=chantier.x1,
-                                            y0=chantier.y0,
-                                            y1=chantier.y1,
-                                            srid=SRID
-                                            )
-                       )
-    # Récupère son id postgis
-    chantier.pgid = row.id
-
-    # Créé les regards, puis le tronçon
-    for troncon in chantier.items:
+        # Vérifie si le chantier existe déjà
+        existants = csig_db.read_all(Sql.format("SELECT id FROM t_chantiers WHERE nom = {:text} AND id_type_chantier=1", chantier.name))
 
-        for regard in (troncon.r1, troncon.r2):
-            logger.info("> Création du regard %s", regard.number)
+        cancel = False
+
+        for row in existants:
+            logger.info("Un chantier portant ce nom existe déjà dans ControlesSig {} (id {})".format(chantier.name, row.id))
 
-            label = label_for(chantier.pgid, regard.number)
+            replace = input("Voulez-vous le remplacer? (o/n)")
+            if replace:
+                # Supprime l'ancien chantier
+                csig_db.execute(Sql.format("""DELETE FROM t_troncons WHERE id_chantier = {}""", row.id))
+                csig_db.execute(Sql.format("""DELETE FROM t_regards WHERE id_chantier = {}""", row.id))
+                csig_db.execute(Sql.format("""DELETE FROM t_chantiers WHERE id = {}""", row.id))
+                logger.info("Le chantier existant a été supprimé")
+            else:
+                # pass the chantier, do not register any error
+                logger.warning("Import du chantier annulé par l'utilisateur")
+                cancel = True
 
-            row = csig_db.first(Sql.format("""INSERT INTO t_regards(nom, id_chantier, res_ce, s_autonumber, geom, label, archive)
-                                           VALUES ({name:text}, {chantier_id}, {res_ce:text}, {s_autonumber}, ST_GeomFromText('POINT({x} {y})', {srid}), {label:text}, False)
+        if cancel:
+            continue
+
+        # Calcule l'emprise du chantier
+        regards = set([troncon.r1 for troncon in chantier.items]) | set([troncon.r2 for troncon in chantier.items])
+        chantier.x0 = min([regard.x for regard in regards]) - 5
+        chantier.x1 = max([regard.x for regard in regards]) + 5
+        chantier.y0 = min([regard.y for regard in regards]) - 5
+        chantier.y1 = max([regard.y for regard in regards]) + 5
+
+        # Créé le chantier
+        logger.info("> Création du chantier")
+
+        row = csig_db.first(Sql.format("""INSERT INTO t_chantiers(id_type_chantier, numero, nom, archive, geom)
+                                           VALUES ({chantier_type}, {number}, {name:text}, False,
+                                                   ST_GeomFromText('POLYGON(({x0} {y0}, {x0} {y1}, {x1} {y1}, {x1} {y0}, {x0} {y0}))', {srid}))
                                            RETURNING id
-                                           """, name=regard.number,
-                                                   chantier_id=chantier.pgid,
-                                                   res_ce=regard.res_ce,
-                                                   s_autonumber=troncon.s_autonumber,
-                                                   x=regard.x,
-                                                   y=regard.y,
-                                                   srid=SRID,
-                                                   label=label)
-                                )
-            regard.pgid = row.id
-
-        logger.debug("> Création du tronçon {}".format("{}-{}".format(troncon.r1.number, troncon.r2.number)))
-
-        csig_db.first(Sql.format("""INSERT INTO t_troncons(nom, id_chantier, id_regard_depart, id_regard_fin, s_autonumber, si_autonumber, res_itv, res_ce, geom, archive)
-                                   VALUES ({name:text}, {chantier_id}, {id_regard_depart}, {id_regard_fin}, {s_autonumber}, {si_autonumber}, {res_itv:text}, {res_ce:text},
-                                           ST_GeomFromText('LINESTRING ({x1} {y1}, {x2} {y2})', {srid}), False)
-                                   RETURNING id
-                                 """, name="{}-{}".format(troncon.r1.number, troncon.r2.number),
-                                    chantier_id=chantier.pgid,
-                                    id_regard_depart=troncon.r1.pgid,
-                                    id_regard_fin=troncon.r2.pgid,
-                                    s_autonumber=troncon.s_autonumber,
-                                    si_autonumber=troncon.si_autonumber,
-                                    res_itv=troncon.res_itv,
-                                    res_ce=troncon.res_ce,
-                                    x1=troncon.r1.x,
-                                    y1=troncon.r1.y,
-                                    x2=troncon.r2.x,
-                                    y2=troncon.r2.y,
-                                    srid=SRID
-                                )
-                       )
-
-
-    csig_db.commit()
-
-    # update si_spare3 in Wincan to mark the chantier as imported
-    logger.info("> Marque le chantier comme importé dans WincanDb")
-
-    wincan_db.execute(Sql.format("UPDATE SI_T SET SI_T.SI_Spare3 = '1' \
-                                  WHERE (((SI_T.SI_InspName) Like '{}%'));", chantier.number))
-    wincan_db.commit()
-    logger.info("Chantier créé")
+                                            """, chantier_type=1,
+                                                number=chantier.number,
+                                                name=chantier.name,
+                                                x0=chantier.x0,
+                                                x1=chantier.x1,
+                                                y0=chantier.y0,
+                                                y1=chantier.y1,
+                                                srid=SRID
+                                                )
+                           )
+        # Récupère son id postgis
+        chantier.pgid = row.id
+
+        # Créé les regards, puis le tronçon
+        for troncon in chantier.items:
+
+            for regard in (troncon.r1, troncon.r2):
+                logger.info("> Création du regard %s", regard.number)
+
+                label = label_for(chantier.pgid, regard.number)
+
+                row = csig_db.first(Sql.format("""INSERT INTO t_regards(nom, id_chantier, res_ce, s_autonumber, geom, label, archive)
+                                               VALUES ({name:text}, {chantier_id}, {res_ce:text}, {s_autonumber}, ST_GeomFromText('POINT({x} {y})', {srid}), {label:text}, False)
+                                               RETURNING id
+                                               """, name=regard.number,
+                                                       chantier_id=chantier.pgid,
+                                                       res_ce=regard.res_ce,
+                                                       s_autonumber=troncon.s_autonumber,
+                                                       x=regard.x,
+                                                       y=regard.y,
+                                                       srid=SRID,
+                                                       label=label)
+                                    )
+                regard.pgid = row.id
+
+            logger.debug("> Création du tronçon {}".format("{}-{}".format(troncon.r1.number, troncon.r2.number)))
+
+            csig_db.first(Sql.format("""INSERT INTO t_troncons(nom, id_chantier, id_regard_depart, id_regard_fin, s_autonumber, si_autonumber, res_itv, res_ce, geom, archive)
+                                       VALUES ({name:text}, {chantier_id}, {id_regard_depart}, {id_regard_fin}, {s_autonumber}, {si_autonumber}, {res_itv:text}, {res_ce:text},
+                                               ST_GeomFromText('LINESTRING ({x1} {y1}, {x2} {y2})', {srid}), False)
+                                       RETURNING id
+                                     """, name="{}-{}".format(troncon.r1.number, troncon.r2.number),
+                                        chantier_id=chantier.pgid,
+                                        id_regard_depart=troncon.r1.pgid,
+                                        id_regard_fin=troncon.r2.pgid,
+                                        s_autonumber=troncon.s_autonumber,
+                                        si_autonumber=troncon.si_autonumber,
+                                        res_itv=troncon.res_itv,
+                                        res_ce=troncon.res_ce,
+                                        x1=troncon.r1.x,
+                                        y1=troncon.r1.y,
+                                        x2=troncon.r2.x,
+                                        y2=troncon.r2.y,
+                                        srid=SRID
+                                    )
+                           )
+
+
+        csig_db.commit()
+
+        # update si_spare3 in Wincan to mark the chantier as imported
+        logger.info("> Marque le chantier comme importé dans WincanDb")
+
+        wincan_db.execute(Sql.format("UPDATE SI_T SET SI_T.SI_Spare3 = '1' \
+                                      WHERE (((SI_T.SI_InspName) Like '{}%'));", chantier.number))
+        wincan_db.commit()
+        logger.info("Chantier créé")
+
+
+if __name__ == "__main__":
+
+    # lance la synchro compactage avant
+    qgis_sync_wincan.main()
+
+    main()

+ 122 - 118
qgis_sync_wincan.py

@@ -20,7 +20,7 @@ import logging
 import re
 import sys
 
-from path import Path
+from path import Path  # @UnusedImport
 import shapefile
 
 from core import logconf
@@ -37,123 +37,127 @@ IMPORT_DEPUIS = 24  # Ne cherche des données à importer que sur les X derniers
 # # POUR TESTER, décommenter les lignes suivantes
 ##-----------------------------------------------
 
-# WincanDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\Wincan\parc_2007\DB\PARC_2007.mdb")
-# ITV_DIR = Path(__file__).parent / "resources" / "test_qgis_sync_wincan"
-# logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)]
-# logger.warning("<<<<<<<<<<<<<<   Mode TEST   >>>>>>>>>>>>>>>>>")
+WincanDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\Wincan\parc_2007\DB\PARC_2007.mdb")
+ITV_DIR = Path(__file__).parent / "resources" / "test_qgis_sync_wincan"
+logger.handlers = [h for h in logger.handlers if (type(h) == logging.StreamHandler)]
+logger.warning("<<<<<<<<<<<<<<   Mode TEST   >>>>>>>>>>>>>>>>>")
 
 ##-----------------------------------------------
 
-# Connexion à Wincan
-wincan_db = WincanDb(autocommit=False)
-
-# Regex pour parser les noms de repertoires
-rx = re.compile(r"^(I_)?(\d{5,6})(-S?\d{1,2})?[\s_]?(.*)$")  # tous
-rxi = re.compile(r"^(\d{5,6})(-S?\d{1,2})?[\s_]?(.*)$")  # non importés
-
-
-logger.info("Parcours des répertoires")
-a_importer = [subdir for subdir in ITV_DIR.dirs() if rxi.search(subdir.name)]
-
-if not a_importer:
-    logger.info("Aucun nouveau dossier à importer")
-    sys.exit()
-
-
-for chantier_dir in a_importer:
-    # Ici, les noms de chantier sont de la forme 000000, 000000-0, ou 000000-S0
-    dir_name = chantier_dir.name
-    logger.info("# Traitement du répertoire: {}".format(chantier_dir.name))
-
-    # check the existence of the chantier in WincanDb, and check if the chantier has been treated in Controles (SI_Spare1 = 1)
-    if not wincan_db.exists(Sql.format("""SELECT SI_T.SI_AutoNumber
-                                         FROM SI_T
-                                         WHERE (((SI_T.SI_Spare1) is not null
-                                         AND (SI_T.SI_JobNumber) Like {:text}))""", chantier_dir.name)):
-        logger.error("Le chantier n'existe pas dans wincan, ou SI_Spare1 est null")
-        continue
-
-    shp_path = chantier_dir / "{}_p_Regards.shp".format(chantier_dir.name)
-
-    logger.debug("> Lecture du fichier shapefile")
-    sf = shapefile.Reader(shp_path)
-
-    # should we check? :
-    if sf.shapeType != 1:
-        logger.error("Le fichier shapefile n'est pas de type POINT")
-        continue
-
-    sh_points = sf.shapeRecords()
-    if not sh_points:
-        logger.error("Le fichier shapefile ne contient aucune donnees")
-        continue
-
-    # Génère des objets 'Points' à partir des données du shapefile
-    points = []
-    for sh_point in sh_points:
-        point = QGisPoint()
-        point.number = sh_point.record[0]
-        point.name = sh_point.record[1]
-        point.x, point.y = sh_point.shape.points[0]
-        points.append(point)
-
-    del sf, sh_points
-
-    logger.info("> Contrôle des données")
-    shp_regards_name = set([point.number for point in points])
-
-    # Vérifie l'absence de duplicats
-    if len(shp_regards_name) != len(points):
-        logger.error("Shapefile - Doublons dans les noms de regards")
-        continue
-
-    # Vérifie l'existence des regards dans WincanDb
-    wincan_regards_name = set([])  # Le set garantit l'unicité des items
-
-    wincan_regards_name |= {r.nom for r in wincan_db.read_all(Sql.format("""SELECT S_T.S_EndNode as nom
-                                                            FROM S_T INNER JOIN SI_T ON S_T.S_ID = SI_T.SI_Section_ID
-                                                            WHERE (S_T.S_EndNode Not Like 'T%' And S_T.S_EndNode Not Like 'BP%'
-                                                            AND SI_T.SI_JobNumber Like {:text})""", chantier_dir.name))}
-
-    wincan_regards_name |= {r.nom for r in wincan_db.read_all(Sql.format("""SELECT S_T.S_StartNode as nom
-                                                            FROM S_T INNER JOIN SI_T ON S_T.S_ID = SI_T.SI_Section_ID
-                                                            WHERE (S_T.S_StartNode Not Like 'T%' And S_T.S_StartNode Not Like 'BP%'
-                                                            AND SI_T.SI_JobNumber Like {:text})""", chantier_dir.name))}
-
-    for regard_name in shp_regards_name - wincan_regards_name:
-        logger.error("Le regards suivant n'existe pas dans Wincan ({})".format(regard_name))
-    for regard_name in wincan_regards_name - shp_regards_name:
-        logger.error("Le regards suivant est absent du fichier shapefile ({})".format(regard_name))
-    if shp_regards_name != wincan_regards_name:
-        logger.info("Mise à jour annulée")
-        continue
-
-    # # Update the coordinates of the regards in WincanDb
-
-    for point in points:
-        q = wincan_db.execute(Sql.format("""UPDATE S_T INNER JOIN SI_T ON S_T.S_ID = SI_T.SI_Section_ID
-                                            SET S_T.S_StartNodeCoord_X = {x}, S_T.S_StartNodeCoord_Y = {y}
-                                            WHERE SI_T.SI_InspName Like {chantier:text} AND S_T.S_StartNode={num:text};
-                                            """, chantier=chantier_dir.name + "%",
-                                                 num=point.number,
-                                                 x=point.x,
-                                                 y=point.y))
-        q = wincan_db.execute(Sql.format("""UPDATE S_T INNER JOIN SI_T ON S_T.S_ID = SI_T.SI_Section_ID
-                                            SET S_T.S_EndNodeCoord_X = {x}, S_T.S_EndNodeCoord_Y = {y}
-                                            WHERE SI_T.SI_InspName Like {chantier:text} AND S_T.S_EndNode={num:text};
-                                            """, chantier=chantier_dir.name + "%",
-                                                 num=point.number,
-                                                 x=point.x,
-                                                 y=point.y))
-        wincan_db.commit()
-
-    logger.info("> Mise à jour de la base Wincan")
-
-    # rename the directory to mark it as imported ('I_')
-    new_path = chantier_dir.parent / "I_{}".format(chantier_dir.name)
-    logger.debug("> Renomme {} en {}".format(chantier_dir.name, new_path.name))
-
-    try:
-        chantier_dir.rename(new_path)
-    except:
-        logger.error("Impossible de renommer le dossier")
+def main():
+    # Connexion à Wincan
+    wincan_db = WincanDb(autocommit=False)
+
+    # Regex pour parser les noms de repertoires
+    rxi = re.compile(r"^(\d{5,6})(-S?\d{1,2})?[\s_]?(.*)$")  # non importés
+
+    logger.info("Parcours des répertoires")
+    a_importer = [subdir for subdir in ITV_DIR.dirs() if rxi.search(subdir.name)]
+
+    if not a_importer:
+        logger.info("Aucun nouveau dossier à importer")
+        sys.exit()
+
+
+    for chantier_dir in a_importer:
+        # Ici, les noms de chantier sont de la forme 000000, 000000-0, ou 000000-S0
+        logger.info("# Traitement du répertoire: {}".format(chantier_dir.name))
+
+        # check the existence of the chantier in WincanDb, and check if the chantier has been treated in Controles (SI_Spare1 = 1)
+        if not wincan_db.exists(Sql.format("""SELECT SI_T.SI_AutoNumber
+                                             FROM SI_T
+                                             WHERE (((SI_T.SI_Spare1) is not null
+                                             AND (SI_T.SI_JobNumber) Like {:text}))""", chantier_dir.name)):
+            logger.error("Le chantier n'existe pas dans wincan, ou SI_Spare1 est null")
+            continue
+
+        shp_path = chantier_dir / "{}_p_Regards.shp".format(chantier_dir.name)
+
+        logger.debug("> Lecture du fichier shapefile")
+        sf = shapefile.Reader(shp_path)
+
+        # should we check? :
+        if sf.shapeType != 1:
+            logger.error("Le fichier shapefile n'est pas de type POINT")
+            continue
+
+        sh_points = sf.shapeRecords()
+        if not sh_points:
+            logger.error("Le fichier shapefile ne contient aucune donnees")
+            continue
+
+        # Génère des objets 'Points' à partir des données du shapefile
+        points = []
+        for sh_point in sh_points:
+            point = QGisPoint()
+            point.number = sh_point.record[0]
+            point.name = sh_point.record[1]
+            point.x, point.y = sh_point.shape.points[0]
+            points.append(point)
+
+        del sf, sh_points
+
+        logger.info("> Contrôle des données")
+        shp_regards_name = set([point.number for point in points])
+
+        # Vérifie l'absence de duplicats
+        if len(shp_regards_name) != len(points):
+            logger.error("Shapefile - Doublons dans les noms de regards")
+            continue
+
+        # Vérifie l'existence des regards dans WincanDb
+        wincan_regards_name = set([])  # Le set garantit l'unicité des items
+
+        wincan_regards_name |= {r.nom for r in wincan_db.read_all(Sql.format("""SELECT S_T.S_EndNode as nom
+                                                                FROM S_T INNER JOIN SI_T ON S_T.S_ID = SI_T.SI_Section_ID
+                                                                WHERE (S_T.S_EndNode Not Like 'T%' And S_T.S_EndNode Not Like 'BP%'
+                                                                AND SI_T.SI_JobNumber Like {:text})""", chantier_dir.name))}
+
+        wincan_regards_name |= {r.nom for r in wincan_db.read_all(Sql.format("""SELECT S_T.S_StartNode as nom
+                                                                FROM S_T INNER JOIN SI_T ON S_T.S_ID = SI_T.SI_Section_ID
+                                                                WHERE (S_T.S_StartNode Not Like 'T%' And S_T.S_StartNode Not Like 'BP%'
+                                                                AND SI_T.SI_JobNumber Like {:text})""", chantier_dir.name))}
+
+        for regard_name in shp_regards_name - wincan_regards_name:
+            logger.error("Le regards suivant n'existe pas dans Wincan ({})".format(regard_name))
+        for regard_name in wincan_regards_name - shp_regards_name:
+            logger.error("Le regards suivant est absent du fichier shapefile ({})".format(regard_name))
+        if shp_regards_name != wincan_regards_name:
+            logger.info("Mise à jour annulée")
+            continue
+
+        # # Update the coordinates of the regards in WincanDb
+
+        for point in points:
+            wincan_db.execute(Sql.format("""UPDATE S_T INNER JOIN SI_T ON S_T.S_ID = SI_T.SI_Section_ID
+                                                SET S_T.S_StartNodeCoord_X = {x}, S_T.S_StartNodeCoord_Y = {y}
+                                                WHERE SI_T.SI_InspName Like {chantier:text} AND S_T.S_StartNode={num:text};
+                                                """, chantier=chantier_dir.name + "%",
+                                                     num=point.number,
+                                                     x=point.x,
+                                                     y=point.y))
+            wincan_db.execute(Sql.format("""UPDATE S_T INNER JOIN SI_T ON S_T.S_ID = SI_T.SI_Section_ID
+                                                SET S_T.S_EndNodeCoord_X = {x}, S_T.S_EndNodeCoord_Y = {y}
+                                                WHERE SI_T.SI_InspName Like {chantier:text} AND S_T.S_EndNode={num:text};
+                                                """, chantier=chantier_dir.name + "%",
+                                                     num=point.number,
+                                                     x=point.x,
+                                                     y=point.y))
+            wincan_db.commit()
+
+        logger.info("> Mise à jour de la base Wincan")
+
+        # rename the directory to mark it as imported ('I_')
+        new_path = chantier_dir.parent / "I_{}".format(chantier_dir.name)
+        logger.debug("> Renomme {} en {}".format(chantier_dir.name, new_path.name))
+
+        try:
+            chantier_dir.rename(new_path)
+        except:
+            logger.error("Impossible de renommer le dossier")
+
+    logger.info("-- Fin --")
+
+if __name__ == "__main__":
+    main()
+

+ 0 - 1
resources/test_qgis_sync_video.py

@@ -10,7 +10,6 @@ from core.pde import CSigDb, WincanDb
 
 if __name__ == "__main__":
 
-
     CSigDb.server = "TR-POSTGIS-02"
     CSigDb.pwd = "Am5VOMkdFHU7WwrfVOs9"
     WincanDb._path = Path(r"\\h2o\local\4-transversal\BDD\mdb_test\Wincan\parc_2007\DB\PARC_2007.mdb")

+ 6 - 6
resources/test_qgis_sync_wincan.py

@@ -23,11 +23,11 @@ if __name__ == "__main__":
         if d.name[:2] == "I_":
             d.rename(ITV_DIR / d.name[2:])
 
-        chantier = csig_db.first("SELECT id FROM t_chantiers WHERE id_type_chantier=1 AND nom ~* '{}\s.*'".format(d.name))
-        if chantier:
-            q = wincan_db.execute("""UPDATE S_T INNER JOIN SI_T ON S_T.S_ID = SI_T.SI_Section_ID
-                                    SET S_T.S_StartNodeCoord_X = Null, S_T.S_StartNodeCoord_Y = Null, S_T.S_EndNodeCoord_X = Null, S_T.S_EndNodeCoord_Y = Null
-                                    WHERE SI_T.SI_InspName Like '{}%';
-                                    """.format(d.name))
+#         chantier = csig_db.first("SELECT id FROM t_chantiers WHERE id_type_chantier=1 AND nom ~* '{}\s.*'".format(d.name))
+#         if chantier:
+        q = wincan_db.execute("""UPDATE S_T INNER JOIN SI_T ON S_T.S_ID = SI_T.SI_Section_ID
+                                SET S_T.S_StartNodeCoord_X = Null, S_T.S_StartNodeCoord_Y = Null, S_T.S_EndNodeCoord_X = Null, S_T.S_EndNodeCoord_Y = Null, SI_T.SI_Spare3 = Null
+                                WHERE SI_T.SI_InspName Like '{}%';
+                                """.format(d.name))
 
     wincan_db.commit()