Modifié par Aurelie Bertrand le 2025/02/07 10:18

Afficher les derniers auteurs
1 (% style="line-height:1.38; text-align:justify" %)
2 Il est possible de réaliser une vérification sur les fichiers (sanity check) ajoutés via les tableaux de bord (contenu additionnel [[**Bouton**>>doc:Digdash.user_guide.dashboard.dashboard_editor_guide.create_dashboard.Ajouter des éléments additionnels.WebHome||anchor="Contenu_add_bouton"]] ou [[**Documents**>>doc:Digdash.user_guide.dashboard.dashboard_editor_guide.create_dashboard.Ajouter des éléments additionnels.WebHome||anchor="Contenu_add_documents"]]) ou le Studio pour s’assurer qu’ils répondent bien à certains critères : nom, extension, contenu, etc.
3
4 Pour cela, on va configurer dans les paramètres serveurs, un script (Python, Shell ou autre) qui sera exécuté à chaque ajout de fichier. Si aucun script n’est configuré, le comportement par défaut s'applique : aucune vérification n’est réalisée sur les fichiers ajoutés.
5
6 (% class="box warningmessage" style="line-height: 1.38; text-align: justify;" %)
7 (((
8 ❗ **Si la fonctionnalité est activée, tous les fichiers ajoutés (que ce soit via les tableaux de bord ou le Studio) sont vérifiés.**
9 L’idée est alors dans le script de vérifier uniquement les fichiers ajoutés dans certains serveurs de documents spécifiques. Si cela n’est pas fait, les ajouts d’autres fichiers comme des cartes JSON, des modèles HTML (pour les fabriques et/ou rapports HTML), d’images peuvent être bloqués.
10 )))
11
12
13 = Fonctionnement =
14
15 (% class="box warningmessage" %)
16 (((
17 ❗ Ne fonctionne que pour l’ajout de fichiers vers des serveurs de documents de type **//file system//**.
18 )))
19
20 Il faut tout d'abord configurer :
21
22 * Le script dans les paramètres serveurs
23 * Un contenu additionnel (**Bouton **ou **Documents**) dans les tableaux de bord pour autoriser les utilisateurs à ajouter des fichiers dans un certain dossier cible (serveur de documents).
24
25 Pour plus de détails, consultez le paragraphe [[Configuration >>doc:||anchor="Configuration"]]ci-dessous.
26
27 Une fois ces configurations effectuées, à chaque ajout de fichier – via les éléments de contenus additionnels configurés – DigDash fera appel au script.
28
29 1. Avant exécution du script : le fichier est placé dans le répertoire “temp” de l’utilisateur.
30 1. À l'exécution du script :
31 1*. Si le fichier est supprimé ou déplacé du dossier “temp” de l’utilisateur avant la fin de l'exécution, l’ajout ne se fait pas dans le dossier cible.
32 ➡ le fichier ne correspond pas aux critères attendus vérifiés dans le script.
33 1*. Si le fichier n’est pas supprimé ou déplacé du dossier “temp” de l’utilisateur à la fin de l’exécution, le fichier est ajouté au dossier cible.
34
35 Un message s'affiche pour indiquer le statut du fichier.
36
37 = Configuration{{id name="Configuration"/}} =
38
39 == Configuration dans DigDash ==
40
41 === Paramètres serveur ===
42
43 1. Allez dans **Configuration -> Paramètres serveur.**
44 1. Allez dans le menu **Exports et API -> Hook pour l'envoi de fichiers**.
45 [[image:Hook.png||alt="Hook"]]
46 1. Dans le champ **Chemin de l'exécutable**, entrez le chemin vers le script à exécuter.
47 Sous Windows, on ne peut pas directement faire appel au script Python, il faut passer par un fichier .bat.
48
49 === Tableaux de bord ===
50
51 Dans les tableaux de bord, ajoutez un contenu additionnel **Bouton** ou **Documents** pour autoriser les utilisateurs à ajouter des fichiers dans un certain dossier cible.
52 Consultez le paragraphe [[Ajouter des éléments additionnels>>doc:Digdash.user_guide.dashboard.dashboard_editor_guide.create_dashboard.Ajouter des éléments additionnels.WebHome||anchor="Contenu_additionnel"]] pour plus de détails.
53
54 (% style="line-height: 1.38; text-align: justify;" %)
55 == Configuration du Script Python{{id name="Script"/}} ==
56
57 (% style="line-height:1.38; text-align:justify" %)
58 À chaque appel du script, celui-ci est exécuté avec 6 paramètres. L'ordre est important pour les utiliser dans l'exécutable.
59
60 * sys.argv[0] : le chemin d'accès à l'exécutable
61 * sys.argv[1] : le nom d'utilisateur connecté qui envoie le fichier
62 * sys.argv[2] : le chemin du dossier cible (exemple un serveur de documents)
63 * sys.argv[3] : le nom du fichier envoyé
64 * sys.argv[4] : le chemin du fichier temporaire qui sera envoyé au dossier cible à la fin de l'exécutable s’il n’y a pas d'erreur
65 * sys.argv[5] : l'identifiant du CMS
66
67 Pour indiquer le statut du fichier, les codes de sortie suivants sont utilisés :
68
69 * sys.exit(0) : Le fichier a été correctement intégré ➡ Affichage du message standard indiquant que le fichier a été correctement intégré
70 * sys.exit(n différent de 0) : Le fichier a été rejeté ➡ Affichage du message personnalisé du script (via un print())
71 Par exemple, sys.exit(1).
72
73 Exemple de script :
74
75 {{code}}
76 import pandas as pd #Need to install xlrd library
77 import shutil
78 import sys
79 import os
80 from datetime import datetime, date
81
82 filename = sys.argv[3]
83 filepath = sys.argv[4]
84 user = sys.argv[1]
85 destination_error_path = "C:/Users/lovaraza/Desktop/atelier/dev/hookup/rejected/"
86
87 #Delete file on error
88 def delete_file(filepath):
89 os.remove(filepath)
90
91 #Move file on error
92 def move_file(filepath, destination_error_path, filename):
93 shutil.move(filepath,destination_error_path+filename.replace(os.path.splitext(filename)[1],datetime.now().strftime("_%Y%m%d%H%M%S_by_user_" + user + os.path.splitext(filename)[1])))
94 #shutil.move(filepath,destination_error_path+filename.replace(".xls",date.today().strftime("_%Y%m%d_%H%M%S.xls")))
95
96 #Format : KPI_YYYY.xls
97 #Content : "Date", "Category", "Nb"
98 def check_file(filename, destination_error_path, filepath):
99 error_message = ''
100
101 #Check file extension
102 if os.path.splitext(filename)[1] != ".xls":
103 error_message += "*** Error in the file type. Xls file expected. "
104 else:
105 filename_split = filename.replace(".xls","").split("_")
106
107 #Check filename format
108 if len(filename_split) != 2:
109 error_message += '*** The file does not have the 2 parameters expected. '
110 else:
111 #Check 1st parameter
112 if filename_split[0] != "KPI" :
113 error_message += "*** Error in the filename. First parameter should be equal to KPI. "
114
115 #Check 2nd parameter
116 try:
117 if int(filename_split[1]) < 2000 or int(filename_split[1]) > 2023:
118 error_message += "*** Error in the filename. Second parameter should be an integer representing the year in yyyy format and between 2000 and 2023 included (ex: 2022). "
119 except:
120 error_message += "*** Error in the filename. Second parameter should be an integer representing the year in yyyy format and between 2000 and 2023 included (ex: 2022). "
121
122 df = pd.read_excel(filepath)
123 column_order = ["Date", "Category", "Nb"]
124
125 #Check column order
126 index = 0
127 for i in df.columns:
128 if column_order[index] != i:
129 index_column = index + 1
130 error_message += "*** Error in the name of column " + str(index_column) + " : " + column_order[index] + " is expected instead of " + i + " . "
131 index += 1
132
133 if error_message != '':
134 #delete_file(filepath)
135 error_message += " *** File renamed " + filename.replace(os.path.splitext(filename)[1],datetime.now().strftime("_%Y%m%d%H%M%S_attempt_by_" + user + os.path.splitext(filename)[1])) + " and moved to " + destination_error_path + "."
136 move_file(filepath, destination_error_path, filename)
137 print(error_message)
138 sys.exit(1)
139 else:
140 sys.exit(0)
141
142 check_file(filename, destination_error_path, filepath)
143 {{/code}}