Dory/dory_sort_out.py

255 lines
8.1 KiB
Python

"""
Sert a créer l'arborescence pour le dossier CNIG, renommer et ranger les .pdf
"""
import os
import re
import glob
import shutil
import unicodedata
from datetime import datetime
import openpyxl as xls
# Les noms de tous les dossier a créer
FOLDERNAMES = [
"0_Procedure",
"1_Rapport_de_presentation",
"2_PADD",
"3_Reglement",
"4_Annexes",
"5_Orientations_amenagement",
"6_POA",
"7_Plans_de_secteur",
]
# Les mots clef associés à chaque dossier
KEYWORDS = {
"Jugement": FOLDERNAMES[0],
"Procedure": FOLDERNAMES[0],
"Rapport": FOLDERNAMES[1],
"PADD": FOLDERNAMES[2],
"Prescription": FOLDERNAMES[3],
"Reglement_graphique": FOLDERNAMES[3],
"Reglement": FOLDERNAMES[3],
"Orientations_amenagement": FOLDERNAMES[5],
"POA": FOLDERNAMES[6],
"Plan_de_secteur": FOLDERNAMES[7],
}
def test_date(date_input: str):
"""teste si la date donnée est valide"""
# Pattern pour vérifier qu'il y a bien 8 chiffres, 4pour l'année, 2 pour le mois, 2 pour le jour
# permet d'exclure les erreurs de frappes, comme les "." les " " ou les lettres
pattern = r"^\d{4}\d{2}\d{2}$"
if re.match(pattern, date_input):
try:
datetime.strptime(date_input, "%Y%m%d")
return True
except ValueError:
print(
"Erreur dans le format de la date, veuillez la saisir comme suit AAAAMMJJ"
)
return False
else:
print("Erreur de frappe, la date ne noit contenir que 8 chiffres")
return False
def test_siren_insee(is_plu: bool, number: str):
"""teste si le numero Siren ou Insee donné est valide"""
if is_plu:
if len(number) == 5 and number.isdigit():
return True
print("Le numero INSEE est invalide")
return False
else:
if len(number) == 9 and number.isdigit():
return True
print("Le numero siren est invalide")
return False
def create_folders(is_plu: bool, prefixe, suffixe):
"""Crée l'arborescence"""
main_path = prefixe + "_" + ("PLU" if is_plu else "PLUi") + "_" + suffixe
try:
os.mkdir(main_path)
except FileExistsError:
print("Ce dossier suivant existe déjà : " + main_path)
return ""
os.mkdir(main_path + "/Donnees_geographiques")
os.mkdir(main_path + "/Pieces_ecrites")
main_path += "/Pieces_ecrites"
for folder_name in FOLDERNAMES:
try:
if (
not folder_name == "6_POA" and not folder_name == "7_Plans_de_secteur"
) or (
not is_plu
and (folder_name == "6_POA" or folder_name == "7_Plans_de_secteur")
):
os.mkdir(main_path + "/" + folder_name)
except FileExistsError:
print("Le dossier suivant existe déjà : " + folder_name)
return main_path
def correct_file_name(file):
"""
Corrige les erreurs de nomage des fichiers
espaces et tirets deviennent des underscore
"""
basename = os.path.basename(file)
correct_file = basename.replace(" ","_").replace("-","_")
# Supprime les accents et les convertis en minuscules
correct_file = ''.join(
(c if unicodedata.category(c) != 'Mn' else '')
for c in unicodedata.normalize('NFD', correct_file)
)
correct_file = os.path.join(os.path.dirname(file),correct_file)
os.rename(file,correct_file)
return correct_file
def sort_files(prefixe, suffixe, sort_path):
"""
Range les fichiers dans l'arborescence, selon des mots clefs
Renvoi un dictionaire avec tous les noms de fichiers trouvés et leur compte
"""
# cherche tous les fichiers pdf présents dans l'arborescence
# à partir du Current working directory,
# y compris ceux dans des dossiers
files = glob.glob(os.getcwd() + "/**/*.pdf", recursive=True)
#compte le nombre de fois mot clef apparait
keyword_count = {key: 0 for key in KEYWORDS}
for file in files:
no_keyword = True
#corrige les erreur de nommage de fichiers
file = correct_file_name(file)
for keyword, folder in KEYWORDS.items():
if keyword.lower() in file.lower():
keyword_count[keyword] +=1
filename = keyword
if keyword_count[keyword] > 1:
# Le nouveau nom du fichier
filename += "_" + str(keyword_count[keyword] - 1)
# Le dossier de destination du fichier
new_path = sort_path + "/" + folder
# Le nouveau nom du fichier
renamed = os.path.join(
os.path.dirname(file),
prefixe + "_" + filename + "_" + suffixe + ".pdf",)
os.rename(file, renamed)
shutil.move(renamed, new_path)
no_keyword = False
break
# si aucun mot clef n'a été trouvé dans le nom du fichier,
# on l'envoi dans le dossier Annexes
if no_keyword:
#on s'assure que le nom commence par une majuscule
filename = os.path.splitext(os.path.basename(file))[0].capitalize()
#on ajoute le nom du fichier dans le dictionnaire
if not filename in keyword_count:
keyword_count.update({filename:1})
else:
keyword_count[filename] += 1
filename += "_" + str(keyword_count[filename] - 1)
renamed = os.path.join(
os.path.dirname(file),
prefixe
+ "_"
+ filename
+ "_"
+ suffixe
+ ".pdf",
)
os.rename(file, renamed)
shutil.move(renamed, sort_path + "/" + FOLDERNAMES[4])
return keyword_count
# return True
def error_report(data):
"""
Crée le rapport d'utilisation du script
"""
report = xls.Workbook()
report_worsheet = report.active
report_worsheet.title = "Compte rendu"
report_worsheet['A1'] = "Fichiers trouvés"
report_worsheet['B1'] = "Occurences"
report_worsheet['F1'] = "Dossiers"
report_worsheet['G1'] = "Fichiers contenus"
report_worsheet.column_dimensions['A'].width *= 3
report_worsheet.column_dimensions['B'].width *= 3
report_worsheet.column_dimensions['F'].width *= 3
report_worsheet.column_dimensions['G'].width *= 3
currrent_cell = 2
for key in data:
report_worsheet['A'+ str(currrent_cell)] = key
report_worsheet['B'+ str(currrent_cell)] = data.get(key)
currrent_cell+=1
report_worsheet['A'+str(3 + len(data.keys()))] = "Total fichiers"
report_worsheet['B'+str(3 + len(data.keys()))] = '=SUM(B2:B' + str(1 + len(data.keys())) + ')'
report.save("Rapport.xlsx")
def sortout():
"""Classe le dossier voulu selon les donées renseignées par l'utilisateur"""
is_plu = True
# demande si c'est un PLU ou un PLUi tant que l'input ne correspond pas à ce que l'on attend
while True:
answer = int(
input("[1] - PLU \n[2] - PLUi \nQuel type de dossier est a étudier ? :")
)
if answer > 2 or answer < 1:
print("erreur dans la saisie du choix")
# print("\033[A\033[K", end="") #supprime la dernière ligne
else:
is_plu = answer == 1
break
# On demande le numero INSEE ou SIREN tant que l'input est invalide
while True:
print("numero INSEE (Format 5 chiffres): "
if is_plu else "numero siren (Format 9 chiffres): ", end="")
prefixe = input()
if test_siren_insee(is_plu, prefixe):
break
# On demande la date d'approbation tant que l'input est invalide
while True:
print("Date d'approbation (Format AAAAMMJJ): ", end="")
suffixe = input()
if test_date(suffixe):
break
main_path = create_folders(is_plu, prefixe, suffixe)
donees_fichiers = sort_files(prefixe, suffixe, main_path)
error_report(donees_fichiers)
# Chargement
# for i in range(100):
# print(f"{i}%")
# time.sleep(0.5)
# if i <100:
# print("\033[A\033[K", end="")