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,23 +115,25 @@ 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
"""
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)
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
@ -138,20 +144,50 @@ def sort_files(prefixe, suffixe, sort_path):
# 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
@ -162,9 +198,10 @@ def sort_files(prefixe, suffixe, sort_path):
# 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
"""
#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)