diff --git a/banbou.py b/banbou.py index 90dfc7c..1d06c1d 100644 --- a/banbou.py +++ b/banbou.py @@ -1,7 +1,9 @@ ## Script Banbou pour le prétraitement des données des dossiers de recollement ## 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 - classeur = openpyxl.load_workbook(modele) + classeur = xls.load_workbook(modele) ## definition personnalisé vers chaque feuille du classeur - FRONT = wb[wb.sheetnames[0]] - PDF = wb[wb.sheetnames[1]] - CSV = wb[wb.sheetnames[2]] - DWG = wb[wb.sheetnames[3]] + FRONT = classeur[classeur.sheetnames[0]] + PDF = classeur[classeur.sheetnames[1]] + CSV = classeur[classeur.sheetnames[2]] + DWG = classeur[classeur.sheetnames[3]] @@ -295,7 +297,7 @@ def remplir_VISA(modele, projet): # Nom dossier # Date de reception # 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 # 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. - 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 if projet.nb_dwgs == 0: 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 fail = projet.controles & FAIL_DWG # operation logique avec le masque # notifie en consequence if fail : - FRONT['B3'] = "FAIL" - FRONT['B3'].fill = PatternFill("solid", start_color="FF4343") + FRONT['B3'].value = "FAIL" + FRONT['B3'].fill = xls.styles.PatternFill("solid", start_color="FF4343") else : - FRONT['B3'] = "OK" - FRONT['B3'].fill = PatternFill("solid", start_color="52BE80") # ancien vert "68D000" + FRONT['B3'].value = "OK" + FRONT['B3'].fill = xls.styles.PatternFill("solid", start_color="52BE80") # ancien vert "68D000" # 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 if projet.nb_pdfs == 0: @@ -335,51 +337,51 @@ def remplir_VISA(modele, projet): fail = projet.controles & FAIL_PDF # notifie en consequence if fail : - FRONT['B4'] = "FAIL" - FRONT['B4'].fill = PatternFill("solid", start_color="FF4343") + FRONT['B4'].value = "FAIL" + FRONT['B4'].fill = xls.styles.PatternFill("solid", start_color="FF4343") else : - FRONT['B4'] = "OK" - FRONT['B4'].fill = PatternFill("solid", start_color="52BE80") + FRONT['B4'].value = "OK" + FRONT['B4'].fill = xls.styles.PatternFill("solid", start_color="52BE80") # 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 if projet.nb_csvs == 0: 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 fail = projet.controles & FAIL_CSV # notifie en consequence if fail : - FRONT['B5'] = "FAIL" - FRONT['B5'].fill = PatternFill("solid", start_color="FF4343") + FRONT['B5'].value = "FAIL" + FRONT['B5'].fill = xls.styles.PatternFill("solid", start_color="FF4343") else : - FRONT['B5'] = "OK" - FRONT['B5'].fill = PatternFill("solid", start_color="52BE80") + FRONT['B5'].value = "OK" + FRONT['B5'].fill = xls.styles.PatternFill("solid", start_color="52BE80") # 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 if projet.nb_releves == 0: 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 - fail = projet.controles & FAIL_CSV + # Regarde si des fails ont été détectés sur les Fiches Topo + fail = projet.controles & FAIL_INFO # notifie en consequence if fail : - FRONT['B6'] = "FAIL" - FRONT['B6'].fill = PatternFill("solid", start_color="FF4343") + FRONT['B6'].value = "FAIL" + FRONT['B6'].fill = xls.styles.PatternFill("solid", start_color="FF4343") else : - FRONT['B6'] = "OK" - FRONT['B6'].fill = PatternFill("solid", start_color="52BE80") + FRONT['B6'].value = "OK" + FRONT['B6'].fill = xls.styles.PatternFill("solid", start_color="52BE80") @@ -435,7 +437,7 @@ class _Fichier: taille=0): self.nom_original = nom_original # - son nom original 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.implication = implication # - son implication dans le projet self.taille = taille # taille en octets @@ -593,7 +595,8 @@ class _Projet: Créer un dossier "Travail" dans la racine du working directory et 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" @@ -619,10 +622,14 @@ class _Projet: match fichier.extension: case "csv": dest = self.racine + "\\" + travail + "\\" + "Point_" + fichier.nom + "_IN" + "." + fichier.extension - - + self.nb_csvs += 1 case "dwg": 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 _: 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 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 + NOTE: Ne pas formatter le fichier original, mais celui qui est deja copié dans le dossier Travail """ # titres des colonnes correctement formattés. titres = "id_point;TYPE;X;Y;Z\n" @@ -786,40 +794,70 @@ class _Notification: # # -------------------------------------------------------------------------- # # # MAIN -# racine = os.getcwd() -# print("\nRépertoire courant : ".center(18), racine) +racine = os.getcwd() +print("\nRépertoire courant : ".center(18), racine) -# # --recupérer le chemin du dossier à traiter -# pas_de_dossier = True +# --recupérer le chemin du dossier à traiter +pas_de_dossier = True -# for a in os.scandir(): -# print("\ncourant scandir() = ", a.name.ljust(25), " ", a.is_dir()) -# if a.is_dir(): -# #il y a un dossier -# pas_de_dossier = False -# print(f"\nDossier à Traiter trouvé : {a.name}") -# racine = a +for a in os.scandir(): + print("\ncourant scandir() = ", a.name.ljust(25), " ", a.is_dir()) + if a.is_dir(): + #il y a un dossier + pas_de_dossier = False + print(f"\nDossier à Traiter trouvé : {a.name}") + racine = a -# if pas_de_dossier: -# print("\nPas de dossier trouvé...\nFin de programme.\n") -# os.system("pause") -# exit() +if pas_de_dossier: + print("\nPas de dossier trouvé...\nFin de programme.\n") + os.system("pause") + exit() -# # Création entité projet et maj de ses attributs -# projet = _Projet() +# Création entité projet et maj de ses attributs +projet = _Projet() -# projet.dater() +projet.dater() -# projet.nommer() -# # controle de la longueur du nom du projet -# 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") -# os.system("pause") -# exit() +projet.nommer() +# controle de la longueur du nom du projet +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") + os.system("pause") + 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() \ No newline at end of file diff --git a/test/JEUXDONNEES/dossier02/modele_visa02.xlsx b/test/JEUXDONNEES/dossier02/modele_visa02.xlsx new file mode 100644 index 0000000..c428a79 Binary files /dev/null and b/test/JEUXDONNEES/dossier02/modele_visa02.xlsx differ diff --git a/test/test_remplir_visa.py b/test/test_remplir_visa.py index 82bad9d..1ddc2bc 100644 --- a/test/test_remplir_visa.py +++ b/test/test_remplir_visa.py @@ -1,8 +1,16 @@ from banbou import remplir_VISA +from banbou import _Notification 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): @@ -15,13 +23,31 @@ def test_notifie_correctement_le_visa(mocker): # projet.nb_csvs # projet.nb_releves # 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 \ No newline at end of file + + + 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) \ No newline at end of file