- ajout de l'algorithme, terminé - ajout du script, en construction - ajout d'un dossier de test
288 lines
11 KiB
Python
288 lines
11 KiB
Python
# ~~ Script DORY Digitanie ~~
|
|
|
|
# Voir algorithme.txt pour plus de détails et commentaires
|
|
|
|
import os # getcwd(),
|
|
|
|
|
|
|
|
|
|
|
|
# - une liste des extensions nécessaires
|
|
NECESSAIRES = ["cpg", "dbf", "prj", "shp", "shx"]
|
|
|
|
# - une liste des extentions auxiliaires
|
|
AUXILIAIRES = ["qix", "qmd", "qml"]
|
|
|
|
# - la configuration de la feuille Excel
|
|
CONFIG = {"NOM" : "A5",
|
|
"TYPE" : "B5",
|
|
"NB_FICHIERS" : "C5",
|
|
"ENCODAGE" : "D5",
|
|
"PROJECTION" : "E5",
|
|
"VALIDITE" : "F5"}
|
|
|
|
|
|
|
|
# REPRESENTATION DES DONNEES
|
|
|
|
class _Fichier:
|
|
def __init__(self,
|
|
nom_original="Pas de nom original",
|
|
chemin="Pas de chemin",
|
|
extension="Pas d'extension",
|
|
nom= "Pas de nom",
|
|
implication="Non-conforme"):
|
|
self.nom_original = nom_original # - son nom original - string
|
|
self.chemin = chemin # - son chemin - string
|
|
self.extension = extension # - son extension - string
|
|
self.nom = nom # - son nom formaté - string
|
|
self.implication = implication # - son implication - enum
|
|
# {"Nécessaire",
|
|
# "Auxiliaire",
|
|
# "Non-conforme",
|
|
# "A-ignorer"}
|
|
def afficher(self):
|
|
print("nom : ".center(16), self.nom)
|
|
print("nom orig : ".center(16), self.nom_original)
|
|
print("ext : ".center(16), self.extension)
|
|
print("chemin : ".center(16), self.chemin)
|
|
print("implication :".center(16), self.implication)
|
|
|
|
|
|
class _Catalogue:
|
|
def __init__(self,
|
|
necessaires="Pas de dico",
|
|
auxiliaires="Pas de dico",
|
|
non_conformes="Pas de dico"):
|
|
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
|
|
|
|
|
|
class _Projet:
|
|
def __init__(self,
|
|
nom="Pas de nom",
|
|
catalogue="Pas de catalogue",
|
|
nb_fichiers=0,
|
|
conformite=False,
|
|
projection="Pas de projection",
|
|
encodage="Pas d'encodage"):
|
|
self.nom = nom # - son nom - string
|
|
self.catalogue = catalogue # - son catalogue - _Catalogue
|
|
self.nb_fichiers = nb_fichiers # - son nombre de fichiers - entier
|
|
self.conformite = conformite # - sa conformité - bool
|
|
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
|
|
# /* pour ce script, ce devrait être forcement "UTF8" */
|
|
|
|
|
|
# DEFINITIONS DE FONCTIONS
|
|
|
|
def formatter(chaine):
|
|
"""Formate selon nomenclature.
|
|
|
|
Formate la chaine de caractères passée en paramètre :
|
|
Enlève tous les accents français. Enlève la cédille du C.
|
|
Remplace les espaces ' ' et les traits d'union '-' par
|
|
des tirets bas '_'.
|
|
Ne traite pas pour le moment le AE et OE ligaturé.
|
|
"""
|
|
#TODO : gérer les accents sur majuscules
|
|
#TODO : amélioration ou exercice, utiliser la méthode str.translate() et maketrans
|
|
resultat = ""
|
|
for c in chaine:
|
|
match c:
|
|
case "à" | "â" | "ä":
|
|
resultat+= "a"
|
|
case "é" | "è" | "ê" | "ë":
|
|
resultat+= "e"
|
|
case "î" | "ï":
|
|
resultat+= "i"
|
|
case "ô" | "ö":
|
|
resultat+= "o"
|
|
case "ù" | "û" | "ü":
|
|
resultat+= "u"
|
|
case "ÿ":
|
|
resultat+= "y"
|
|
case "ç":
|
|
resultat+= "c"
|
|
case " " | "-":
|
|
resultat+= "_"
|
|
case _:
|
|
resultat+= c
|
|
return resultat
|
|
|
|
|
|
|
|
def impliquer(fichier):
|
|
"""Définir l'implication d'un fichier
|
|
|
|
Les fichiers nécessaires sont indispensables sinon l'importation
|
|
de la couche échoue.
|
|
Les fichiers optionels (ou auxiliaires) contiennent des données
|
|
supplémentaires lors de l'importation.
|
|
Les fichiers non conformes pourraient être importer dans QGIS. Mais,
|
|
ne sont pas conformes au cahier des charges.
|
|
Les fichiers ignorés ne fonctionnent pas dans QGIS.
|
|
L'implication est définie en fonction de l'extension du fichier.
|
|
"""
|
|
resultat = fichier
|
|
match fichier.extension:
|
|
case "dbf" | "cpg" | "prj" | "shx" | "shp":
|
|
resultat.implication = "Necessaire"
|
|
case "qix" | "qmd" | "qml":
|
|
resultat.implication = "Auxiliaire"
|
|
case "qpkg" | "sqlite":
|
|
resultat.implication = "Non-conforme"
|
|
case _:
|
|
resultat.implication = "A-ignorer"
|
|
return resultat
|
|
|
|
|
|
|
|
|
|
# DEBUT DU PROGRAMME
|
|
|
|
liste = [] # - une liste des fichiers list _Fichier
|
|
dico = {} # - un dictionnaire des projets avec pour clé le nom de chaque projet
|
|
# dico de paire string : Entité Projet
|
|
racine = os.getcwd() # - un chemin absolue vers le repertoire racine à traiter string
|
|
print(racine)
|
|
|
|
|
|
|
|
# --recupérer le chemin du dossier à traiter
|
|
# Si il y a PAS un dossier de traitement dans le working directory Alors
|
|
pas_de_dossier = True
|
|
|
|
for a in os.scandir("./"):
|
|
if a.is_dir():
|
|
#il y a un dossier
|
|
pas_de_dossier = False
|
|
if pas_de_dossier:
|
|
print("Pas de dossier trouvé...\nFin de programme\n")
|
|
os.system("pause")
|
|
# fin du programme
|
|
exit()
|
|
else:
|
|
print(f"Dossier à Traiter trouvé : {a.name}")
|
|
racine = a
|
|
|
|
|
|
# --analyser le dossier
|
|
# initialiser une liste de _Fichiers
|
|
liste = []
|
|
# Pour Chaque fichier des dossiers et sous dossiers à explorer Faire
|
|
for dossier_courant, list_dossiers, list_fichiers in os.walk(racine):
|
|
for fichier_courant in list_fichiers:
|
|
# --lire, analyser chaque fichier et peupler la liste
|
|
# initialiser un _Fichier
|
|
ce_Fichier = _Fichier()
|
|
# lire son chemin
|
|
ce_Fichier.chemin = fichier_courant
|
|
# déterminer son nom original et son extension
|
|
# lire le nom original
|
|
# lire son extension
|
|
ce_Fichier.nom_original, ce_Fichier.extension = ce_Fichier.chemin.split(".")
|
|
# formatter et écrire le nom
|
|
ce_Fichier.nom = formatter(ce_Fichier.nom_original)
|
|
# déterminer son implication
|
|
ce_Fichier = impliquer(ce_Fichier) # TODO impliquer(), A VOIR si je peux passer juste l'implicatin et non l'ojbet en entier
|
|
# ajouter le _Fichier à la liste
|
|
liste.append(ce_Fichier)
|
|
# Fin Pour
|
|
|
|
# /* Ici la liste des _Fichiers doit être correctement remplie */
|
|
#TEST affichage de la liste de fichier
|
|
for a in liste:
|
|
a.afficher()
|
|
print("\n\n")
|
|
|
|
|
|
|
|
os.system("pause")
|
|
|
|
# initialiser un dictionnaire de _Projets avec comme clé leurs noms respectifs
|
|
# Pour Chaque fichier de la liste Faire
|
|
# --associer le fichier courant à un projet du dictionnaire
|
|
# /* Vérifier que le projet existe déjà dans le dico */
|
|
# Si le nom du fichier courant n'est pas dans le dico Alors
|
|
# initialiser un _Projet
|
|
# ajouter le nom comme clé dans le dictionnaire
|
|
# associer le projet à cette clé
|
|
# Fin Si
|
|
# cataloguer le fichier dans le projet concerné
|
|
# il y a un fichier de plus au projet
|
|
# Fin Pour
|
|
|
|
# Pour Chaque projet du dictionnaire Faire
|
|
# --analyser et completer les infos du projet courant
|
|
# /* conformité, projection, encodage etc */
|
|
# lire la projection du projet courant
|
|
# lire l'encodage du projet courant
|
|
# Si tous les fichiers nécessaires sont présents ET
|
|
# la projection est correcte ET
|
|
# l'encodage est correct Alors
|
|
# passer le projet à conforme
|
|
# Fin Si
|
|
# Fin Pour
|
|
|
|
# /* Ici le dictionnaire des _Projets doit être correctement remplie */
|
|
|
|
# --produire le rapport
|
|
# créer un classeur Excel
|
|
# /* 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
|
|
|
|
# Pour chaque projet du dictionnaire Faire
|
|
# --completer la feuille avec les infos du projet courant
|
|
# /* Note : Chaque ligne de la feuille correspond à un projet */
|
|
# /* Utiliser la config fournie en Constante */
|
|
# écrire le nom du projet
|
|
# écrire le type d'extention
|
|
# /* Note : ce sera "SHP" pour les projets conformes et le type
|
|
# natif pour les non-conformes */
|
|
# écrire le nombre de fichiers du projet
|
|
# écrire l'encodage
|
|
# écrire la projection
|
|
# écrire la validité (conformité)
|
|
# encadrer le "tout" pour délimiter le tableau de la feuille
|
|
# Fin Pour
|
|
|
|
# /* Ici le rapport doit être correctement produit et remplie */
|
|
|
|
# --produire le dossier de mise à disposition
|
|
# créer un dossier "Travail" et un dossier "Livraison"
|
|
# --créer l'arborescence du dossier "Travail"
|
|
# le dossier Travail devient le working directory
|
|
# créer un dossier "00-Cadastre"
|
|
# créer un dossier "01-Donnees_Valides"
|
|
# créer un dossier "02-Donnees_Invalides
|
|
# créer un dossier "03-Production"
|
|
# créer un dossier "04-Verif_Geometrie"
|
|
# --peupler le dossier "Travail"
|
|
# Pour Chaque projet du dictionnaire Faire
|
|
# copier les fichiers des projets conforme dans le dossier "01"
|
|
# copier les fichiers des projets non-conformes dans le dossier "02"
|
|
# Fin Pour
|
|
|
|
# /* Ici les dossiers doivent être correctement produit et remplie */
|
|
|
|
# ARRET DU PROGRAMME
|
|
|
|
|
|
|
|
# /* TODO Controler qu'il y a bien les 5 necessaires par projet sinon FAIL
|
|
# --> a faire dans le controle de conformité de chaque projet */
|
|
|
|
# /* TODO S'assurer que les GPKG et autres non conformes peuplent correctement
|
|
# les infos dans les projets --> géré si l'initialisation des
|
|
# projets est correctement fait */
|