assemblage du déroulement du script

Des bugs sont apparues : à corriger
This commit is contained in:
David Castex 2025-06-06 16:36:25 +02:00
parent a38d1ae453
commit 1dae288b35
3 changed files with 131 additions and 67 deletions

164
banbou.py
View File

@ -1,7 +1,9 @@
## Script Banbou pour le prétraitement des données des dossiers de recollement ## Script Banbou pour le prétraitement des données des dossiers de recollement
## de fibre optique. ## de fibre optique.
import os, shutil, datetime, openpyxl import os, shutil, datetime
import openpyxl as xls
#from openpyxl.styles import Alignment, PatternFill
@ -273,14 +275,14 @@ def remplir_VISA(modele, projet):
# creation d'un workbook à partir d'un modele # creation d'un workbook à partir d'un modele
classeur = openpyxl.load_workbook(modele) classeur = xls.load_workbook(modele)
## definition personnalisé vers chaque feuille du classeur ## definition personnalisé vers chaque feuille du classeur
FRONT = wb[wb.sheetnames[0]] FRONT = classeur[classeur.sheetnames[0]]
PDF = wb[wb.sheetnames[1]] PDF = classeur[classeur.sheetnames[1]]
CSV = wb[wb.sheetnames[2]] CSV = classeur[classeur.sheetnames[2]]
DWG = wb[wb.sheetnames[3]] DWG = classeur[classeur.sheetnames[3]]
@ -295,7 +297,7 @@ def remplir_VISA(modele, projet):
# Nom dossier # Nom dossier
# Date de reception # Date de reception
# Date Visa # Date Visa
FRONT['C1'] = f'Analyse : {projet.nom}\nDate de réception :\nDate visa : {projet.date}' FRONT['C1'].value = f'Analyse : {projet.nom}\nDate de réception :\nDate visa : {projet.date}'
@ -304,27 +306,27 @@ def remplir_VISA(modele, projet):
# FRONT DWG # FRONT DWG
# Je ne peux pas controler automatiquement la projection du DWG (c'est un binaire illisible hors de AutoCAD) # Je ne peux pas controler automatiquement la projection du DWG (c'est un binaire illisible hors de AutoCAD)
# J'ajoute automatiquement la mention comme dans le script précedent. # J'ajoute automatiquement la mention comme dans le script précedent.
FRONT['C3'] = f"{projet.nb_dwgs} fichier(s) DWG présent(s).\nProjection de tous les fichiers DWG : RFG93-CC43 (EPSG:3943)." FRONT['C3'].value = f"{projet.nb_dwgs} fichier(s) DWG présent(s).\nProjection de tous les fichiers DWG : RFG93-CC43 (EPSG:3943)."
# Controle le nb de fichiers DWG # Controle le nb de fichiers DWG
if projet.nb_dwgs == 0: if projet.nb_dwgs == 0:
projet.controles |= 2**4 # allume le bit 5ième bit projet.controles |= 2**4 # allume le bit 5ième bit
FRONT['C3'] = "Pas de fichier DWG présent." FRONT['C3'].value = "Pas de fichier DWG présent."
# Regarde si des fails ont été détectés sur les DWGs # Regarde si des fails ont été détectés sur les DWGs
fail = projet.controles & FAIL_DWG # operation logique avec le masque fail = projet.controles & FAIL_DWG # operation logique avec le masque
# notifie en consequence # notifie en consequence
if fail : if fail :
FRONT['B3'] = "FAIL" FRONT['B3'].value = "FAIL"
FRONT['B3'].fill = PatternFill("solid", start_color="FF4343") FRONT['B3'].fill = xls.styles.PatternFill("solid", start_color="FF4343")
else : else :
FRONT['B3'] = "OK" FRONT['B3'].value = "OK"
FRONT['B3'].fill = PatternFill("solid", start_color="52BE80") # ancien vert "68D000" FRONT['B3'].fill = xls.styles.PatternFill("solid", start_color="52BE80") # ancien vert "68D000"
# FRONT PDF # FRONT PDF
FRONT['C4'] = f"{projet.nb_pdfs} fichier(s) PDF présent(s)." FRONT['C4'].value = f"{projet.nb_pdfs} fichier(s) PDF présent(s)."
# Controle le nb de fichiers PDF # Controle le nb de fichiers PDF
if projet.nb_pdfs == 0: if projet.nb_pdfs == 0:
@ -335,51 +337,51 @@ def remplir_VISA(modele, projet):
fail = projet.controles & FAIL_PDF fail = projet.controles & FAIL_PDF
# notifie en consequence # notifie en consequence
if fail : if fail :
FRONT['B4'] = "FAIL" FRONT['B4'].value = "FAIL"
FRONT['B4'].fill = PatternFill("solid", start_color="FF4343") FRONT['B4'].fill = xls.styles.PatternFill("solid", start_color="FF4343")
else : else :
FRONT['B4'] = "OK" FRONT['B4'].value = "OK"
FRONT['B4'].fill = PatternFill("solid", start_color="52BE80") FRONT['B4'].fill = xls.styles.PatternFill("solid", start_color="52BE80")
# FRONT CSV # FRONT CSV
FRONT['C5'] = f"{projet.nb_points} point(s) en RFG93-CC43 (EPSG:3943)." FRONT['C5'].value = f"{projet.nb_points} point(s) en RFG93-CC43 (EPSG:3943)."
# Controle le nb de fichiers CSV # Controle le nb de fichiers CSV
if projet.nb_csvs == 0: if projet.nb_csvs == 0:
projet.controles |= 2**0 # allume le 1er bit projet.controles |= 2**0 # allume le 1er bit
FRONT['C5'] = "Pas de fichier CSV présent." FRONT['C5'].value = "Pas de fichier CSV présent."
# Regarde si des fails ont été détectés sur les CSVs # Regarde si des fails ont été détectés sur les CSVs
fail = projet.controles & FAIL_CSV fail = projet.controles & FAIL_CSV
# notifie en consequence # notifie en consequence
if fail : if fail :
FRONT['B5'] = "FAIL" FRONT['B5'].value = "FAIL"
FRONT['B5'].fill = PatternFill("solid", start_color="FF4343") FRONT['B5'].fill = xls.styles.PatternFill("solid", start_color="FF4343")
else : else :
FRONT['B5'] = "OK" FRONT['B5'].value = "OK"
FRONT['B5'].fill = PatternFill("solid", start_color="52BE80") FRONT['B5'].fill = xls.styles.PatternFill("solid", start_color="52BE80")
# FRONT FICHE INFO TOPOLOGIE # FRONT FICHE INFO TOPOLOGIE
FRONT['C6'] = f"{projet.nb_releves} fiche(s) Info. présente(s)." FRONT['C6'].value = f"{projet.nb_releves} fiche(s) Info. présente(s)."
# Controle le nb de fichiers Fiche Topologique # Controle le nb de fichiers Fiche Topologique
if projet.nb_releves == 0: if projet.nb_releves == 0:
projet.controles |= 2**12 # allume le 13ième bit projet.controles |= 2**12 # allume le 13ième bit
FRONT['C6'] = "Pas de fiche d'Info. Topologie présente." FRONT['C6'].value = "Pas de fiche d'Info. Topologie présente."
# Regarde si des fails ont été détectés sur les CSVs # Regarde si des fails ont été détectés sur les Fiches Topo
fail = projet.controles & FAIL_CSV fail = projet.controles & FAIL_INFO
# notifie en consequence # notifie en consequence
if fail : if fail :
FRONT['B6'] = "FAIL" FRONT['B6'].value = "FAIL"
FRONT['B6'].fill = PatternFill("solid", start_color="FF4343") FRONT['B6'].fill = xls.styles.PatternFill("solid", start_color="FF4343")
else : else :
FRONT['B6'] = "OK" FRONT['B6'].value = "OK"
FRONT['B6'].fill = PatternFill("solid", start_color="52BE80") FRONT['B6'].fill = xls.styles.PatternFill("solid", start_color="52BE80")
@ -435,7 +437,7 @@ class _Fichier:
taille=0): taille=0):
self.nom_original = nom_original # - son nom original self.nom_original = nom_original # - son nom original
self.chemin = chemin # - son chemin absolue (dossier+fichier) self.chemin = chemin # - son chemin absolue (dossier+fichier)
self.extension = extension # - son extension self.extension = extension # - son extension (ecrit en minuscule)
self.nom = nom # - son nom formaté self.nom = nom # - son nom formaté
self.implication = implication # - son implication dans le projet self.implication = implication # - son implication dans le projet
self.taille = taille # taille en octets self.taille = taille # taille en octets
@ -593,7 +595,8 @@ class _Projet:
Créer un dossier "Travail" dans la racine du working directory et Créer un dossier "Travail" dans la racine du working directory et
le peuple des fichiers nécessaires le peuple des fichiers nécessaires
Met à jour le nombre de fichiers CSVs, DWGs et Met à jour le nombre de fichiers CSVs, DWGs
Préfixe et suffixe les fichiers le nécessitant (le CSV et le DWG)
""" """
travail = "Travail" travail = "Travail"
@ -619,10 +622,14 @@ class _Projet:
match fichier.extension: match fichier.extension:
case "csv": case "csv":
dest = self.racine + "\\" + travail + "\\" + "Point_" + fichier.nom + "_IN" + "." + fichier.extension dest = self.racine + "\\" + travail + "\\" + "Point_" + fichier.nom + "_IN" + "." + fichier.extension
self.nb_csvs += 1
case "dwg": case "dwg":
dest = self.racine + "\\" + travail + "\\" + "Plan_" + fichier.nom + "." + fichier.extension dest = self.racine + "\\" + travail + "\\" + "Plan_" + fichier.nom + "." + fichier.extension
self.nb_dwgs += 1
case "pdf":
dest = self.racine + "\\" + travail + "\\" + fichier.nom + "." + fichier.extension
self.nb_pdfs += 1 # TODO: refaire le comptage auillleurs !!!!
case _: case _:
dest = self.racine + "\\" + travail + "\\" + fichier.nom + "." + fichier.extension dest = self.racine + "\\" + travail + "\\" + fichier.nom + "." + fichier.extension
@ -655,6 +662,7 @@ class _Projet:
- Le fichier CSV NÉCESSITE des ';' comme séparateur d'élements. (Normalement c'est toujours le cas de toutes façon) - Le fichier CSV NÉCESSITE des ';' comme séparateur d'élements. (Normalement c'est toujours le cas de toutes façon)
- Le fichier doit avoir exactement 5 colonnes. TODO : vois si plus de souplesse avec le catchage de paramètres restants - Le fichier doit avoir exactement 5 colonnes. TODO : vois si plus de souplesse avec le catchage de paramètres restants
param user_input: nom complet d'un fichier csv param user_input: nom complet d'un fichier csv
NOTE: Ne pas formatter le fichier original, mais celui qui est deja copié dans le dossier Travail
""" """
# titres des colonnes correctement formattés. # titres des colonnes correctement formattés.
titres = "id_point;TYPE;X;Y;Z\n" titres = "id_point;TYPE;X;Y;Z\n"
@ -786,40 +794,70 @@ class _Notification:
# # -------------------------------------------------------------------------- # # # -------------------------------------------------------------------------- #
# # MAIN # # MAIN
# racine = os.getcwd() racine = os.getcwd()
# print("\nRépertoire courant : ".center(18), racine) print("\nRépertoire courant : ".center(18), racine)
# # --recupérer le chemin du dossier à traiter # --recupérer le chemin du dossier à traiter
# pas_de_dossier = True pas_de_dossier = True
# for a in os.scandir(): for a in os.scandir():
# print("\ncourant scandir() = ", a.name.ljust(25), " ", a.is_dir()) print("\ncourant scandir() = ", a.name.ljust(25), " ", a.is_dir())
# if a.is_dir(): if a.is_dir():
# #il y a un dossier #il y a un dossier
# pas_de_dossier = False pas_de_dossier = False
# print(f"\nDossier à Traiter trouvé : {a.name}") print(f"\nDossier à Traiter trouvé : {a.name}")
# racine = a racine = a
# if pas_de_dossier: if pas_de_dossier:
# print("\nPas de dossier trouvé...\nFin de programme.\n") print("\nPas de dossier trouvé...\nFin de programme.\n")
# os.system("pause") os.system("pause")
# exit() exit()
# # Création entité projet et maj de ses attributs # Création entité projet et maj de ses attributs
# projet = _Projet() projet = _Projet()
# projet.dater() projet.dater()
# projet.nommer() projet.nommer()
# # controle de la longueur du nom du projet # controle de la longueur du nom du projet
# if len(projet.nom) >=46 : if len(projet.nom) >=46 :
# print(f"\n{projet.nom} est un nom de dossier trop long (+ de 46 caractères). Veuillez raccourcir son nom\nFin de programme.\n") print(f"\n{projet.nom} est un nom de dossier trop long (+ de 46 caractères). Veuillez raccourcir son nom\nFin de programme.\n")
# os.system("pause") os.system("pause")
# exit() exit()
# projet.enraciner() projet.enraciner()
# projet.rapport = f"{racine}\\Visa_lot_2.xlsx" ## projet.rapport = f"{racine}\\Visa_lot_2.xlsx"
# projet.fichiers = creer_liste(projet.racine) projet.fichiers = creer_liste(projet.racine)
projet.calculer_taille()
projet.preparer_dossier_travail()
# il faut UN SEUL fichier CSV
if projet.nb_csvs > 1:
print("Avertissement : Il y a plusieurs fichiers CSV.\n Veuillez ne garder qu'UN SEUL fichier CSV dans le dossier original.\nFin de programme.\n")
os.system("pause")
exit()
fichier_csv = ""
for fichier in projet.fichiers:
if fichier.extension in "csv":
entree = projet.racine + "\\Travail\\Point_" + fichier.nom + "_IN" + ".csv"
sortie = projet.racine + "\\Travail\\Point_" + fichier.nom + "_IN" + ".csv"
projet.formatter_vers_ArcGIS(fichier.chemin, sortie)
projet.controler_longueur_noms()
modele = projet.racine + "\\Visa_banbou03.xlsx"
remplir_VISA(modele, projet)
# exit()

Binary file not shown.

View File

@ -1,8 +1,16 @@
from banbou import remplir_VISA from banbou import remplir_VISA
from banbou import _Notification
import banbou import banbou
from openpyxl import workbook
# NOTE: les jeux de données de ces tests sont dans le dossier "dossier02"
# NOTE: Il faut un dossier Travail dans le même dossier que le script banbou, en effet le script place le VISA rempli à cet emplacement là
# Je vais test de mocker : classeur.save(f"Travail\\{projet.nom}_VISA.xlsx") pour enregeistrer la ou je veux pour mon test
# TODO: mocker la focntion save de openpyxl, pour sauvegarder dans le bon dossier Travail dans le dossier02 PAS REUSSI ENCORE A MOCKER JUSTE DES PARAMETRES DE METHODES
def test_notifie_correctement_le_visa(mocker): def test_notifie_correctement_le_visa(mocker):
@ -15,13 +23,31 @@ def test_notifie_correctement_le_visa(mocker):
# projet.nb_csvs # projet.nb_csvs
# projet.nb_releves # projet.nb_releves
# projet.notifs # projet.notifs
# projet.nb_points
modele = r"C:\Users\David_Castex\Documents\DATAS\GITDAV\NEOBANBOU\test\JEUXDONNEES\dossier02\modele_visa.xlsx"
# ENCOURS
# remplir_VISA(modele, projet)
pass class MockResponse:
def __init__(self):
self.nom = "FIBER"
self.date = "20001225"
self.nb_dwgs = 1
self.controles = 0
self.nb_pdfs = 1
self.nb_csvs = 1
self.nb_releves = 1
self.notifs = [_Notification("CSV", "Il manque un point..."), _Notification("PDF", "Nom trop long."), _Notification("CSV", "Encore un point de manqué.")]
self.nb_points = 38
mocker.patch("banbou._Projet", return_value = MockResponse())
sut = banbou._Projet()
modele = r"C:\Users\David_Castex\Documents\DATAS\GITDAV\NEOBANBOU\test\JEUXDONNEES\dossier02\Visa_banbou03.xlsx"
remplir_VISA(modele, sut)