Compare commits

..

2 Commits

View File

@ -1,6 +1,7 @@
"""
Sert a créer l'arborescence pour le dossier CNIG, renommer et ranger les .pdf
"""
import os
import re
import glob
@ -24,6 +25,7 @@ FOLDERNAMES = [
]
ANNEXE_FOLDER_ID = 4
PLANS_DE_SECTEUR_ID = 7
# Les mots clef associés à chaque dossier
KEYWORDS = {
@ -36,7 +38,7 @@ KEYWORDS = {
"Reglement": FOLDERNAMES[3],
"Orientations_amenagement": FOLDERNAMES[5],
"POA": FOLDERNAMES[6],
"Plan_de_secteur": FOLDERNAMES[7],
"Plan_de_secteurs": FOLDERNAMES[7],
}
def confirm_choice(choice) -> bool:
@ -51,7 +53,7 @@ def confirm_choice(choice) -> bool:
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
# Pattern pour vérifier qu'il y a bien 8 chiffres, 4 pour 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}$"
@ -68,6 +70,7 @@ def test_date(date_input: str):
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:
@ -83,6 +86,7 @@ def test_siren_insee(is_plu: bool, number: str):
print("Le numero siren est invalide")
return False
def create_folders(is_plu: bool, prefixe, suffixe):
"""Crée l'arborescence"""
main_path = f"{prefixe}_PLU{"i" if not is_plu else ""}_{suffixe}"
@ -111,60 +115,93 @@ def create_folders(is_plu: bool, prefixe, suffixe):
return main_path
def correct_file_name(file):
"""
Corrige les erreurs de nomage des fichiers
espaces et tirets deviennent des underscore
Corrige les erreurs de nomage des fichiers
espaces et tirets deviennent des underscore
"""
basename = os.path.basename(file)
correct_file = basename.replace(" ","_").replace("-","_")
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)
# 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)
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
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
# compte le nombre de fois mot clef apparait
keyword_count = {key: 0 for key in KEYWORDS}
folders_file_count = [0] * len(FOLDERNAMES)
for file in files:
no_keyword = True
#corrige les erreur de nommage de fichiers
# corrige les erreur de nommage de fichiers
file = correct_file_name(file)
sector = re.search(r'SECT(\d{2})',file)
#Test cas particuliers Plans de secteurs
if sector:
sector_name = sector.group(0)
folder_path = f"{sort_path}/7_Plans_de_secteur/{sector_name}"
if not os.path.isdir(folder_path):
os.mkdir(folder_path)
os.mkdir(f"{folder_path}/3_Reglement")
os.mkdir(f"{folder_path}/5_Orientations_amenagement")
specific_keywords = ["Reglement_graphique","Reglement","Orientations_amenagement"]
for index, keyword in enumerate(specific_keywords):
if keyword.lower() in file.lower():
filename = f"{prefixe}_{keyword}_{sector_name}_{suffixe}.pdf"
newpath =""
if index <= 1:
newpath = f"{folder_path}/3_Reglement"
else:
newpath = f"{folder_path}/5_Orientations_amenagement"
renamed = os.path.join(os.path.dirname(file),filename)
os.rename(file,renamed)
shutil.move(renamed,newpath)
folders_file_count[PLANS_DE_SECTEUR_ID] += 1
break
continue
for keyword, folder in KEYWORDS.items():
# Si le mot clef (en minuscule) est dans le nom du fichier (en minuscule)
if keyword.lower() in file.lower():
keyword_count[keyword] +=1
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
# 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",)
prefixe + "_" + filename + "_" + suffixe + ".pdf",
)
folders_file_count[int(folder[0])] +=1
folders_file_count[int(folder[0])] += 1
os.rename(file, renamed)
shutil.move(renamed, new_path)
no_keyword = False
@ -172,68 +209,83 @@ def sort_files(prefixe, suffixe, sort_path):
# 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
# 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
# on ajoute le nom du fichier dans le dictionnaire
if not filename in keyword_count:
keyword_count.update({filename:1})
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",
prefixe + "_" + filename + "_" + suffixe + ".pdf",
)
os.rename(file, renamed)
shutil.move(renamed, sort_path + "/" + FOLDERNAMES[ANNEXE_FOLDER_ID])
folders_file_count[ANNEXE_FOLDER_ID] += 1
return keyword_count, folders_file_count
return folders_file_count
# return True
def error_report(file_data,folder_data):
def error_report(folder_data):
"""
Crée le rapport d'utilisation du script
Crée le rapport d'utilisation du script
"""
#Couleur rouge
error_color = PatternFill(patternType='solid',fgColor='00cb4335')
column_name_color = PatternFill(patternType='solid',fgColor='0085929e')
row_color = PatternFill(patternType='solid',fgColor='00ccd1d1')
# Couleurs de cellules
error_color = PatternFill(patternType="solid", fgColor="00cb4335")
column_name_color = PatternFill(patternType="solid", fgColor="0085929e")
row_color = PatternFill(patternType="solid", fgColor="00ccd1d1")
report = xls.Workbook()
report_worsheet = report.active
# Nomme la worksheet et les colonnes du tableau
report_worsheet.title = "Compte rendu"
report_worsheet['B1'] = "Dossiers"
report_worsheet['C1'] = "NB Fichiers"
report_worsheet['D1'] = "Rapport d'erreur"
report_worsheet["B1"] = "Dossiers"
report_worsheet["C1"] = "NB Fichiers"
report_worsheet["D1"] = "Rapport d'erreur"
report_worsheet.column_dimensions['B'].width *= 3
report_worsheet.column_dimensions['C'].width *= 3
report_worsheet.column_dimensions['D'].width *= 3
# Triple la largeur des colonnes pour plus de clarté
report_worsheet.column_dimensions["B"].width *= 3
report_worsheet.column_dimensions["C"].width *= 3
report_worsheet.column_dimensions["D"].width *= 3
report_worsheet['B1'].fill = report_worsheet['C1'].fill = report_worsheet['D1'].fill = column_name_color
# Applique la couleur de fond aux cellules titres de colonnes
report_worsheet["B1"].fill = report_worsheet["C1"].fill = report_worsheet[
"D1"
].fill = column_name_color
#on commence à la cellule 2
currrent_cell = 2
for i, content in enumerate(folder_data):
report_worsheet['B'+ str(currrent_cell)] = FOLDERNAMES[i]
report_worsheet['C'+ str(currrent_cell)] = content
if i % 2 == 0:
report_worsheet['B'+ str(currrent_cell)].fill = report_worsheet['C'+ str(currrent_cell)].fill = report_worsheet['D'+ str(currrent_cell)].fill = row_color
# Pour chaque dossiers
# On écrit son nom dans la colonne B
# On écris le nombre de fichier contenus dans la colonne C
for i, content in enumerate(folder_data):
report_worsheet["B" + str(currrent_cell)] = FOLDERNAMES[i]
report_worsheet["C" + str(currrent_cell)] = content
# 1 ligne sur 2 change de couleur
if i % 2 == 0:
report_worsheet["B" + str(currrent_cell)].fill = report_worsheet[
"C" + str(currrent_cell)
].fill = report_worsheet["D" + str(currrent_cell)].fill = row_color
# Si dossier vide Erreur Colonne D
if content == 0:
report_worsheet['D'+ str(currrent_cell)] = "/!\\ aucun fichier dans le dossier /!\\"
report_worsheet['D'+ str(currrent_cell)].fill = error_color
currrent_cell+=1
report_worsheet["D" + str(currrent_cell)] = (
"/!\\ aucun fichier dans le dossier /!\\"
)
report_worsheet["D" + str(currrent_cell)].fill = error_color
currrent_cell += 1
report.save("Rapport.xlsx")
def sortout():
"""Classe le dossier voulu selon les donées renseignées par l'utilisateur"""
is_plu = True
@ -254,8 +306,14 @@ def sortout():
# 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="")
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) and confirm_choice(prefixe):
break
@ -269,6 +327,6 @@ def sortout():
main_path = create_folders(is_plu, prefixe, suffixe)
donees_fichiers, donnees_dossiers = sort_files(prefixe, suffixe, main_path)
donnees_dossiers = sort_files(prefixe, suffixe, main_path)
error_report(donees_fichiers,donnees_dossiers)
error_report(donnees_dossiers)