Version fonctionnelle
This commit is contained in:
parent
dde2b39958
commit
61adf4a972
@ -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 */
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user