-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoutils.py
More file actions
246 lines (226 loc) · 8.66 KB
/
outils.py
File metadata and controls
246 lines (226 loc) · 8.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
from tkinter.filedialog import *
from tkinter.scrolledtext import *
import shutil
import errno
import os
import platform
from erreurs import ErreurConsistance
class Outils(object):
"""
Classe contenant diverses méthodes utiles
"""
@staticmethod
def copier_dossier(source, dossier, destination):
chemin = destination + "/" + dossier
if not os.path.exists(chemin):
try:
shutil.copytree(source + dossier, chemin)
except OSError as exc:
if exc.errno == errno.ENOTDIR:
shutil.copy(source, destination)
if platform.system() in ['Linux', 'Darwin']:
_interface_graphique = len(os.environ.get('DISPLAY', '')) > 0
else:
_interface_graphique = True
@classmethod
def interface_graphique(cls, opt_nouvelle_valeur=None):
if opt_nouvelle_valeur is not None:
cls._interface_graphique = opt_nouvelle_valeur
return cls._interface_graphique
@classmethod
def affiche_message(cls, message):
"""
affiche une petite boite de dialogue avec un message et un bouton OK
:param message: message à afficher
"""
if cls.interface_graphique():
fenetre = Tk()
fenetre.title("Message")
texte = ScrolledText(fenetre)
texte.insert(END, message)
texte.pack()
button = Button(fenetre, text='OK', command=fenetre.destroy)
button.pack()
mainloop()
else:
print(message)
@classmethod
def fatal(cls, exn, message):
Outils.affiche_message(message + "\n" + str(exn))
if isinstance(exn, ErreurConsistance) or isinstance(exn, ValueError):
sys.exit(1)
else:
sys.exit(4)
@staticmethod
def affiche_message_conditionnel(message):
"""
affiche une petite boite de dialogue avec un message et 2 boutons OUI/NON, le NON arrête le programme
:param message: message à afficher
"""
fenetre = Tk()
fenetre.title("Message conditionnel")
texte = ScrolledText(fenetre)
texte.insert(END, message)
texte.pack()
button = Button(fenetre, text='OUI', command=fenetre.destroy)
button.pack(side="left")
button = Button(fenetre, text='NON', command=sys.exit)
button.pack(side="right")
mainloop()
@staticmethod
def choisir_dossier(plateforme):
"""
affiche une interface permettant de choisir un dossier
:param plateforme: OS utilisé
:return: la position du dossier sélectionné
"""
fenetre = Tk()
fenetre.title("Choix du dossier")
dossier = askdirectory(parent=fenetre, initialdir="/",
title='Choisissez un dossier de travail')
fenetre.destroy()
if dossier == "":
Outils.affiche_message("Aucun dossier choisi")
sys.exit("Aucun dossier choisi")
return dossier + Outils.separateur_os(plateforme)
@staticmethod
def format_heure(nombre):
"""
transforme une heure d'un format float à un format hh:mm
:param nombre: heure en float
:return: heure en hh:mm
"""
if nombre == 0:
return "00:00"
heures = "%d" % (nombre // 60)
if (nombre // 60) < 10:
heures = '0' + heures
minutes = "%d" % (nombre % 60)
if (nombre % 60) < 10:
minutes = '0' + minutes
return heures + ':' + minutes
@staticmethod
def format_si_nul(nombre):
"""
formate un nombre flottant à 2 chiffres après la virgule, retourn '-' si nul
:param nombre: nombre flottant à formatter
:return: nombre formaté
"""
if nombre > 0:
return "%.2f" % nombre
else:
return '-'
@staticmethod
def mois_string(mois):
"""
prend un mois comme nombre, et le retourne comme string, avec un '0' devant si plus petit que 10
:param mois: mois formaté en nombre
:return: mois formaté en string
"""
if mois < 10:
return "0" + str(mois)
else:
return str(mois)
@staticmethod
def separateur_os(plateforme):
"""
retourne le séparateur de chemin logique en fonction de l'OS (si windows ou pas)
:param plateforme: OS utilisé
:return: séparateur, string
"""
if plateforme == "win32":
return "\\"
else:
return "/"
@staticmethod
def separateur_lien(texte, generaux):
"""
remplace le séparateur de chemin logique en fonction du lien donné dans les paramètres généraux
:param texte: texte à traiter
:param generaux: paramètres généraux
:return: séparateur, string
"""
if "\\" in generaux.lien:
if "/" in generaux.lien:
Outils.affiche_message("'/' et '\\' présents dans le lien des paramètres généraux !!! ")
texte = texte.replace("/", "\\")
else:
texte = texte.replace("\\", "/")
return texte.replace("//", "/").replace("\\" + "\\", "\\")
@staticmethod
def separateur_dossier(texte, generaux):
"""
remplace le séparateur de chemin logique en fonction du chemin donné dans les paramètres généraux
:param texte: texte à traiter
:param generaux: paramètres généraux
:return: séparateur, string
"""
if "\\" in generaux.chemin:
if "/" in generaux.chemin:
Outils.affiche_message("'/' et '\\' présents dans le lien des paramètres généraux !!! ")
texte = texte.replace("/", "\\")
"""
if "\\" != Outils.separateur_os(plateforme):
Outils.affiche_message_conditionnel("Le chemin d'enregistrement n'utilise pas le même séparateur que "
"l'os sur lequel tourne le logiciel. Voulez-vous tout de même "
"continuer ?")
"""
else:
texte = texte.replace("\\", "/")
"""
if "/" != Outils.separateur_os(plateforme):
Outils.affiche_message_conditionnel("Le chemin d'enregistrement n'utilise pas le même séparateur que "
"l'os sur lequel tourne le logiciel. Voulez-vous tout de même "
"continuer ?")
"""
return texte.replace("//", "/").replace("\\" + "\\", "\\")
@staticmethod
def eliminer_double_separateur(texte):
"""
élimine les doubles (back)slashs
:param texte: texte à nettoyer
:return: texte nettoyé
"""
return texte.replace("//", "/").replace("\\" + "\\", "\\")
@staticmethod
def chemin_dossier(structure, plateforme, generaux):
"""
construit le chemin pour enregistrer les données
:param structure: éléments du chemin
:param plateforme:OS utilisé
:param generaux: paramètres généraux
:return:chemin logique complet pour dossier
"""
chemin = ""
for element in structure:
chemin += str(element) + Outils.separateur_os(plateforme)
if not os.path.exists(chemin):
os.makedirs(chemin)
return Outils.eliminer_double_separateur(Outils.separateur_dossier(chemin, generaux))
@staticmethod
def lien_dossier(structure, plateforme, generaux):
"""
construit le chemin pour enregistrer les données sans vérifier son existence
:param structure: éléments du chemin
:param plateforme: OS utilisé
:param generaux: paramètres généraux
:return:chemin logique complet pour dossier
"""
chemin = ""
for element in structure:
chemin += str(element) + Outils.separateur_os(plateforme)
return Outils.eliminer_double_separateur(Outils.separateur_lien(chemin, generaux))
@staticmethod
def est_un_nombre(donnee, colonne, ligne):
"""
vérifie que la donnée est bien un nombre
:param donnee: donnée à vérifier
:param colonne: colonne contenant la donnée
:param ligne: ligne contenant la donnée
:return: la donnée formatée en nombre et un string vide si ok, 0 et un message d'erreur sinon
"""
try:
fl_d = float(donnee)
return fl_d, ""
except ValueError:
return 0, colonne + " de la ligne " + str(ligne) + " doit être un nombre\n"