assemblage du déroulement du script
Des bugs sont apparues : à corriger
This commit is contained in:
parent
a38d1ae453
commit
1dae288b35
176
banbou.py
176
banbou.py
@ -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():
|
||||||
|
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()
|
||||||
|
|
||||||
|
# Création entité projet et maj de ses attributs
|
||||||
|
projet = _Projet()
|
||||||
|
|
||||||
|
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.enraciner()
|
||||||
|
|
||||||
|
## projet.rapport = f"{racine}\\Visa_lot_2.xlsx"
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
# 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()
|
# exit()
|
||||||
|
|
||||||
# # Création entité projet et maj de ses attributs
|
|
||||||
# projet = _Projet()
|
|
||||||
|
|
||||||
# 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.enraciner()
|
|
||||||
|
|
||||||
# projet.rapport = f"{racine}\\Visa_lot_2.xlsx"
|
|
||||||
|
|
||||||
# projet.fichiers = creer_liste(projet.racine)
|
|
||||||
|
|
||||||
|
|||||||
BIN
test/JEUXDONNEES/dossier02/modele_visa02.xlsx
Normal file
BIN
test/JEUXDONNEES/dossier02/modele_visa02.xlsx
Normal file
Binary file not shown.
@ -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)
|
||||||
Loading…
Reference in New Issue
Block a user