Version fonctionnelle

This commit is contained in:
David Castex 2025-03-07 15:40:37 +01:00
parent dde2b39958
commit 61adf4a972

View File

@ -4,15 +4,48 @@
# ----- INSTALLATION DE PIP ET CONTROLE MODULES -----
# Repris depuis script Banbou
import subprocess
def check_and_update_pip():
# Vérifier s'il existe une version plus récente de pip
try:
result = subprocess.run(['pip', 'install', '--upgrade', 'pip', '--disable-pip-version-check'], capture_output=True, text=True)
if result.returncode == 0:
print("pip a été mis à jour avec succès.") #TODO bizarre, c'est affiché alors qu'il n'y avait pas d'internet
except subprocess.CalledProcessError:
print("La mise à jour de pip a échoué.")
# Lancer le code deux fois
for _ in range(2):
check_and_update_pip()
# Liste des bibliothèques à vérifier et installer
bibliotheques = ['csv', 'os', 're', 'shutil', 'sys', 'openpyxl']
for bibliotheque in bibliotheques:
try:
__import__(bibliotheque)
except ImportError:
# Installer la bibliothèque
print(f"{bibliotheque} n'est pas installée. Installation en cours...")
subprocess.check_call(['pip', 'install', bibliotheque])
print(f"{bibliotheque} a été installée avec succès.")
import os # getcwd(), walk() import os # getcwd(), walk()
import openpyxl # gestion et manipulation de fichier Open XML import openpyxl # gestion et manipulation de fichier Open XML
import re # RegEx import re # RegEx
from shutil import copyfile # copie de fichiers
# REPRESENTATION DES DONNEES
class _Fichier: class _Fichier:
def __init__(self, def __init__(self,
nom_original="Pas de nom original", nom_original="Pas de nom original",
@ -62,50 +95,6 @@ class _Fichier:
# TODO : gerer la casse des extensions pour que le controle se fasse # TODO : gerer la casse des extensions pour que le controle se fasse
## TODO Mettre les init de dico à vide {} plutot ??
class _Catalogue:
def __init__(self,
necessaires,
auxiliaires,
non_conformes
):
self.necessaires = necessaires # - son dictionnaire de fichiers nécessaires avec pour clé l'extention
# de chaque fichier - dico de paire string : _Fichier
self.auxiliaires = auxiliaires # - son dictionnaire de fichiers auxiliaires avec pour clé l'extention
# de chaque fichier - dico de paire string : _Fichier
self.non_conformes = non_conformes # - son dictionnaire de fichiers non-conformes avec pour clé l'extention
# de chaque fichier - dico de paire string : _Fichier
# PB : Pour le moment cette facon de representer des groupes de fichiers
# ne gèrent pas le fait qu'il y ai plusieurs fichiers avec la meme extension,
# en effet, je ne peux pas avoir plusieurs clés avec la meme extension
def afficher(self):
"""Affiche le catalogue dans la sortie standard
Affiche aussi un message si pour chaque dictionnaire vide
"""
if self.necessaires: # TODO renvoie False si dico = {} ou alors dois je écrire if necessaires == {}
print("fichiers nécessaires :".center(28))
for fichier in self.necessaires.values():
print(" ", fichier.nom, fichier.extension)
else:
print("Pas de Nécessaires".center(28))
if self.auxiliaires:
print("fichiers auxiliaires :".center(28))
for fichier in self.auxiliaires.values():
print(" ", fichier.nom, fichier.extension)
else:
print("Pas d'Auxiliaires".center(28))
if self.non_conformes:
print("fichiers non conformes :".center(28))
for fichier in self.non_conformes.values():
print(" ", fichier.non_conformes)
else:
print("Pas de Non-conformes".center(28))
class _Projet: class _Projet:
def __init__(self, def __init__(self,
nom="Pas de nom", nom="Pas de nom",
@ -117,11 +106,14 @@ class _Projet:
projection="Inconnu", projection="Inconnu",
encodage="Inconnu"): encodage="Inconnu"):
self.nom = nom # - son nom - string self.nom = nom # - son nom - string
self.necessaires = necessaires self.necessaires = necessaires # - son dictionnaire de fichiers nécessaires avec pour clé l'extention
self.auxiliaires = auxiliaires # de chaque fichier - dico de paire string : _Fichier
self.non_conformes = non_conformes self.auxiliaires = auxiliaires # - son dictionnaire de fichiers nécessaires avec pour clé l'extention
# de chaque fichier - dico de paire string : _Fichier
self.non_conformes = non_conformes # - son dictionnaire de fichiers nécessaires avec pour clé l'extention
# de chaque fichier - dico de paire string : _Fichier
self.nb_fichiers = nb_fichiers # - son nombre de fichiers - entier self.nb_fichiers = nb_fichiers # - son nombre de fichiers - entier
self.conformite = conformite # - sa conformité - bool self.conformite = conformite # - sa conformité - string
self.projection = projection # - sa projection géodésique - string // ou énumération --> voir Constantes self.projection = projection # - sa projection géodésique - string // ou énumération --> voir Constantes
self.encodage = encodage # - son type d'encodage prévu dans QGIS string self.encodage = encodage # - son type d'encodage prévu dans QGIS string
# /* pour ce script, ce devrait être forcement "UTF8" */ # /* pour ce script, ce devrait être forcement "UTF8" */
@ -137,13 +129,12 @@ class _Projet:
print("necessaires :".center(16), self.necessaires) print("necessaires :".center(16), self.necessaires)
print("auxiliaires :".center(16), self.auxiliaires) print("auxiliaires :".center(16), self.auxiliaires)
print("non_conformes :".center(16), self.non_conformes) print("non_conformes :".center(16), self.non_conformes)
#self.catalogue.afficher()
def cataloguer(self, fichier): def cataloguer(self, fichier):
"""Catalogue le fichier dans le projet """Catalogue le fichier dans le projet
La méthode ajoute le fichier suivant son extension La méthode ajoute le fichier suivant son extension
dans un des dictionnaires du catalogue dans un des dictionnaires du projet
""" """
match fichier.implication: match fichier.implication:
case "Necessaire": case "Necessaire":
@ -164,7 +155,7 @@ class _Projet:
chaine = df.readline() chaine = df.readline()
df.close() df.close()
#cherche le motif : "Ligne qui commence par PROJCS[" #cherche le motif : "Ligne qui commence par PROJCS["
# puis suivi de caracteres # puis suivi de 0 ou plusieurs caracteres
#puis suivi de Lambert_93" #puis suivi de Lambert_93"
motif = re.findall('^PROJCS[[]".*Lambert_93"', chaine) motif = re.findall('^PROJCS[[]".*Lambert_93"', chaine)
print("motif = ", motif) print("motif = ", motif)
@ -226,9 +217,13 @@ class _Projet:
if nb_controles_OK == 3: if nb_controles_OK == 3:
self.conformite = "Conforme" self.conformite = "Conforme"
def copier(self):
"""Copie les fichiers du projets
"""
pass
# TODO :
# DEFINITIONS DE FONCTIONS
def formatter(chaine): def formatter(chaine):
"""Formate selon nomenclature. """Formate selon nomenclature.
@ -318,7 +313,6 @@ for dossier_courant, list_sousdossiers, list_fichiers in os.walk(racine):
# Fin Pour # Fin Pour
# /* Ici la liste des _Fichiers doit être correctement remplie */ # /* Ici la liste des _Fichiers doit être correctement remplie */
#TEST affichage de la liste de fichier
# initialiser un dictionnaire de _Projets avec comme clé leurs noms respectifs # initialiser un dictionnaire de _Projets avec comme clé leurs noms respectifs
print("Init Dictionnaire des Projets\n") print("Init Dictionnaire des Projets\n")
@ -371,27 +365,23 @@ for projet in dico.values():
# --produire le rapport # --produire le rapport
# créer un classeur Excel # créer un classeur Excel
# TODO pour le moment je vais partir sur un modele deja ecrit que j'ouvre # TODO pour le moment je vais partir sur un modele deja ecrit que j'ouvre
# Contrainte : l'opérateur doit placer le modèle dans le même dossier racine que le present script # Contrainte : l'opérateur doit placer le modèle dans le même dossier que le script
classeur = openpyxl.load_workbook("modele_VISA_DORY.xlsx") classeur = openpyxl.load_workbook("modele_VISA_DORY.xlsx")
feuille = classeur.active feuille = classeur.active
# /* Note : peut être utiliser un modèle pré-config */
# --mettre en page la première feuille du classeur
# inserer une image
# écrire les nom des colonnes
# écrire les formules de colorations auto des colonnes
cell = feuille["A2"] cell = feuille["A2"]
cell.value = "Dossier : "+ racine.name cell.value = "Dossier : "+ racine.name
# Pour chaque projet du dictionnaire Faire # Pour chaque projet du dictionnaire Faire
ligne_courante = 4 ligne_courante = 4
for nom_projet, projet in dico.items(): for nom_projet, projet in dico.items():
# --completer la feuille avec les infos du projet courant # --completer la feuille avec les infos du projet courant
# /* Note : Chaque ligne de la feuille correspond à un projet */ # /* Note : Chaque ligne de la feuille correspond à un projet */
# /* Utiliser la config fournie en Constante */
# écrire le nom du projet # écrire le nom du projet
cell = feuille["A"+str(ligne_courante)] cell = feuille["A"+str(ligne_courante)]
cell.value = nom_projet cell.value = nom_projet
print(cell.value) #print(cell.value)
# écrire le type d'extention # écrire le type d'extention
cell = feuille["B"+str(ligne_courante)] cell = feuille["B"+str(ligne_courante)]
if "shp" in projet.necessaires: if "shp" in projet.necessaires:
@ -402,15 +392,19 @@ for nom_projet, projet in dico.items():
for extension in projet.non_conformes: for extension in projet.non_conformes:
cell.value = extension.upper() cell.value = extension.upper()
print(cell.value) print(cell.value)
# écrire le nombre de fichiers du projet # écrire le nombre de fichiers du projet
cell = feuille["C"+str(ligne_courante)] cell = feuille["C"+str(ligne_courante)]
cell.value = projet.nb_fichiers cell.value = projet.nb_fichiers
# écrire l'encodage # écrire l'encodage
cell = feuille["D"+str(ligne_courante)] cell = feuille["D"+str(ligne_courante)]
cell.value = projet.encodage cell.value = projet.encodage
# écrire la projection # écrire la projection
cell = feuille["E"+str(ligne_courante)] cell = feuille["E"+str(ligne_courante)]
cell.value = projet.projection cell.value = projet.projection
# écrire la validité (conformité) # écrire la validité (conformité)
cell = feuille["F"+str(ligne_courante)] cell = feuille["F"+str(ligne_courante)]
if projet.conformite in "Conforme": if projet.conformite in "Conforme":
@ -463,8 +457,24 @@ except FileExistsError as erreur:
print(erreur) print(erreur)
# --peupler le dossier "Travail" # --peupler le dossier "Travail"
# Pour Chaque projet du dictionnaire Faire # Pour Chaque projet du dictionnaire Faire
dossier_cible = "Travail"
for projet in dico.values():
# copier les fichiers des projets conforme dans le dossier "01" # copier les fichiers des projets conforme dans le dossier "01"
# copier les fichiers des projets non-conformes dans le dossier "02" if projet.conformite in "Conforme":
for fichier in projet.necessaires.values():
#print("chemin : ".center(30), fichier.chemin)
#print("nom : ".center(30), fichier.nom + "." + fichier.extension)
copyfile(fichier.chemin, "Travail\\01-Donnees_Valides\\"+fichier.nom+"."+fichier.extension)
for fichier in projet.auxiliaires.values():
copyfile(fichier.chemin, "Travail\\01-Donnees_Valides\\"+fichier.nom+"."+fichier.extension)
else:
for fichier in projet.necessaires.values():
copyfile(fichier.chemin, "Travail\\02-Donnees_Invalides\\"+fichier.nom+"."+fichier.extension)
for fichier in projet.auxiliaires.values():
copyfile(fichier.chemin, "Travail\\02-Donnees_Invalides\\"+fichier.nom+"."+fichier.extension)
for fichier in projet.non_conformes.values():
copyfile(fichier.chemin, "Travail\\02-Donnees_Invalides\\"+fichier.nom+"."+fichier.extension)
# Fin Pour # Fin Pour
# /* Ici les dossiers doivent être correctement produit et remplie */ # /* Ici les dossiers doivent être correctement produit et remplie */