quickinteg 2.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- quickinteg/__about__.py +34 -0
- quickinteg/__init__.py +0 -0
- quickinteg/cfg_reader.py +104 -0
- quickinteg/cli.py +144 -0
- quickinteg/excel_shortcut.py +163 -0
- quickinteg/external/__init__.py +0 -0
- quickinteg/mcd_check.py +368 -0
- quickinteg/processing_logging.py +107 -0
- quickinteg/rop_grace.py +585 -0
- quickinteg/spatialiteio.py +646 -0
- quickinteg-2.5.0.dist-info/METADATA +75 -0
- quickinteg-2.5.0.dist-info/RECORD +16 -0
- quickinteg-2.5.0.dist-info/WHEEL +5 -0
- quickinteg-2.5.0.dist-info/entry_points.txt +6 -0
- quickinteg-2.5.0.dist-info/licenses/LICENSE +674 -0
- quickinteg-2.5.0.dist-info/top_level.txt +1 -0
quickinteg/mcd_check.py
ADDED
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
#! python3 # noqa: E265
|
|
2
|
+
|
|
3
|
+
################################################################################
|
|
4
|
+
# This file is part of quickinteg.
|
|
5
|
+
|
|
6
|
+
# quickinteg is free software: you can redistribute it and/or modify
|
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
9
|
+
# (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# quickinteg is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
# GNU General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You should have received a copy of the GNU General Public License
|
|
17
|
+
# along with quickinteg. If not, see <https://www.gnu.org/licenses/>.
|
|
18
|
+
################################################################################
|
|
19
|
+
|
|
20
|
+
# ############################################################################
|
|
21
|
+
# ########## Libraries #############
|
|
22
|
+
# ##################################
|
|
23
|
+
|
|
24
|
+
# standard library
|
|
25
|
+
import logging
|
|
26
|
+
import math
|
|
27
|
+
|
|
28
|
+
# package
|
|
29
|
+
from . import processing_logging
|
|
30
|
+
from .excel_shortcut import read_all_sheet_to_dict
|
|
31
|
+
|
|
32
|
+
# ############################################################################
|
|
33
|
+
# ########## Globals ###############
|
|
34
|
+
# ##################################
|
|
35
|
+
module_logger = logging.getLogger(__name__)
|
|
36
|
+
module_logger.setLevel(logging.DEBUG)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
catalogue_config = {
|
|
40
|
+
"id_test_col": "id_test",
|
|
41
|
+
"description_col": "description",
|
|
42
|
+
"classe_col": "classe",
|
|
43
|
+
"attribut_col": "attribut",
|
|
44
|
+
"xx_code_col": "xx_code",
|
|
45
|
+
"param1_col": "param1",
|
|
46
|
+
"param2_col": "param2",
|
|
47
|
+
"param3_col": "param3",
|
|
48
|
+
"requ_princ_col": "requ_princ",
|
|
49
|
+
"condition_col": "condition",
|
|
50
|
+
"detail_erreur_col": "detail_erreur",
|
|
51
|
+
}
|
|
52
|
+
config_controle_config = {
|
|
53
|
+
"id_test_col": "id_test",
|
|
54
|
+
"config_col": "config",
|
|
55
|
+
"param1_col": "param1",
|
|
56
|
+
"param2_col": "param2",
|
|
57
|
+
"param3_col": "param3",
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# ############################################################################
|
|
62
|
+
# ########## Functions #############
|
|
63
|
+
# ##################################
|
|
64
|
+
def log(message, logLevel="info"):
|
|
65
|
+
processing_logging.log(message, module_logger, logLevel)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
# Création de l'objet controle, et de toutes ses fonctions associées
|
|
69
|
+
class Controle:
|
|
70
|
+
"""Un point de contrôle est défini par :
|
|
71
|
+
* Un identifiant
|
|
72
|
+
* Une description
|
|
73
|
+
* Une requête SQL principale
|
|
74
|
+
* Une condition d'erreur dans cette requête
|
|
75
|
+
* La classe (table) sur laquelle porte l'erreur
|
|
76
|
+
* L'attribut sur lequel porte l'erreur (dans la table / classe)
|
|
77
|
+
* 0 à 3 paramètres
|
|
78
|
+
* L'expression (SQL) du détail de l'erreur.
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
# ########################################################################
|
|
82
|
+
# ### Methods ###############
|
|
83
|
+
# ###########################
|
|
84
|
+
|
|
85
|
+
def make_view_ctrl(list_controles_sql, view_name="v_ctrl_all_source"):
|
|
86
|
+
"""L'attribut "list_controles_sql" est une liste de codes sql de points
|
|
87
|
+
de controle (sortie de Controle.get_sql()).
|
|
88
|
+
La fonction ajoute en en-têtes :
|
|
89
|
+
DROP VIEW IF EXISTS {view_name};
|
|
90
|
+
CREATE VIEW {view_name} AS
|
|
91
|
+
et termine par un ;"""
|
|
92
|
+
# Il y a une limite intrasèque à SQLITE sur le nombre d'UNION max dans une requête (500 max).
|
|
93
|
+
# On tronçonne donc la vue 'v_ctrl_all_source' en plusieurs vues intermédiaires et on refait un UNION ensuite
|
|
94
|
+
nb_controles = len(list_controles_sql)
|
|
95
|
+
view_name_from_param = view_name
|
|
96
|
+
if nb_controles <= 400:
|
|
97
|
+
sql_code = '\nDROP VIEW IF EXISTS "%s";\n' % (view_name)
|
|
98
|
+
sql_code += 'CREATE VIEW "%s" AS' % (view_name)
|
|
99
|
+
for i, controle_sql in enumerate(list_controles_sql):
|
|
100
|
+
if i == 0:
|
|
101
|
+
sql_code += "\n\t%s" % (controle_sql)
|
|
102
|
+
else:
|
|
103
|
+
sql_code += " UNION \n\t%s" % (controle_sql)
|
|
104
|
+
sql_code += ";"
|
|
105
|
+
return sql_code
|
|
106
|
+
else:
|
|
107
|
+
# sql_code comprend le code complet de la requête (liste des vues intermédiares + UNION final des vues intermédiaires)
|
|
108
|
+
sql_code = ""
|
|
109
|
+
# last_union comprend le UNION final des vues intermédiaires. On l'initialise ici et on le complète à chaque itération
|
|
110
|
+
# de la boucle for.
|
|
111
|
+
last_union = '\n\nDROP VIEW IF EXISTS "%s";\n' % (view_name)
|
|
112
|
+
last_union += 'CREATE VIEW "%s" AS' % (view_name)
|
|
113
|
+
# On crée une vue intermédiaire pour chaque tronçons de 400 requêtes
|
|
114
|
+
# math.ceil --> arrondi entier supérieur
|
|
115
|
+
# par ex : si 800 requêtes on aura range(2). Pour 801 requêtes on aura range(3)
|
|
116
|
+
for i in range(math.ceil(nb_controles / 400)):
|
|
117
|
+
# On appelle Controle.make_view_ctrl sur une sous partie de la liste des requetes
|
|
118
|
+
extract_list_controles = list_controles_sql[
|
|
119
|
+
i * 400 : min(len(list_controles_sql), ((i + 1) * 400))
|
|
120
|
+
]
|
|
121
|
+
intermediate_view_name = view_name_from_param + str(i)
|
|
122
|
+
sql_code += Controle.make_view_ctrl(
|
|
123
|
+
extract_list_controles, view_name=intermediate_view_name
|
|
124
|
+
)
|
|
125
|
+
# On alimente last_union
|
|
126
|
+
if i == 0:
|
|
127
|
+
last_union += "\n\tSELECT * FROM %s" % (intermediate_view_name)
|
|
128
|
+
else:
|
|
129
|
+
last_union += " UNION \n\tSELECT * FROM %s" % (intermediate_view_name)
|
|
130
|
+
last_union += ";"
|
|
131
|
+
sql_code += last_union
|
|
132
|
+
return sql_code
|
|
133
|
+
|
|
134
|
+
# ########################################################################
|
|
135
|
+
# #### Constructor ####
|
|
136
|
+
# ######################
|
|
137
|
+
|
|
138
|
+
def __init__(
|
|
139
|
+
self,
|
|
140
|
+
ctrl_id,
|
|
141
|
+
ctrl_description,
|
|
142
|
+
ctrl_classe,
|
|
143
|
+
ctrl_attr,
|
|
144
|
+
ctrl_xxcode,
|
|
145
|
+
ctrl_desc_param1,
|
|
146
|
+
ctrl_desc_param2,
|
|
147
|
+
ctrl_desc_param3,
|
|
148
|
+
ctrl_reqprinc,
|
|
149
|
+
ctrl_condition,
|
|
150
|
+
ctrl_detail_erreur,
|
|
151
|
+
ctrl_nbparam,
|
|
152
|
+
):
|
|
153
|
+
# Déclaration des variables
|
|
154
|
+
self.id = ctrl_id
|
|
155
|
+
self.description = ctrl_description
|
|
156
|
+
self.classe = ctrl_classe
|
|
157
|
+
self.attr = ctrl_attr
|
|
158
|
+
self.xxcode = ctrl_xxcode
|
|
159
|
+
self.description_param1 = ctrl_desc_param1
|
|
160
|
+
self.description_param2 = ctrl_desc_param2
|
|
161
|
+
self.description_param3 = ctrl_desc_param3
|
|
162
|
+
self.reqprinc = ctrl_reqprinc
|
|
163
|
+
self.condition = ctrl_condition
|
|
164
|
+
self.nbparam = ctrl_nbparam # Pour controle de cohérence
|
|
165
|
+
self.detail_erreur = ctrl_detail_erreur
|
|
166
|
+
|
|
167
|
+
# #############################
|
|
168
|
+
# ## Methodes d'instance ####
|
|
169
|
+
# #############################
|
|
170
|
+
|
|
171
|
+
# Extraction des différentes variables de la classe Contrôle
|
|
172
|
+
def get_id(self):
|
|
173
|
+
return self.id
|
|
174
|
+
|
|
175
|
+
def get_description(self):
|
|
176
|
+
return self.description
|
|
177
|
+
|
|
178
|
+
def get_classe(self):
|
|
179
|
+
return self.classe
|
|
180
|
+
|
|
181
|
+
def get_attr(self):
|
|
182
|
+
return self.attr
|
|
183
|
+
|
|
184
|
+
def get_xxcode(self):
|
|
185
|
+
return self.xxcode
|
|
186
|
+
|
|
187
|
+
def get_description_param1(self):
|
|
188
|
+
return self.description_param1
|
|
189
|
+
|
|
190
|
+
def get_description_param2(self):
|
|
191
|
+
return self.description_param2
|
|
192
|
+
|
|
193
|
+
def get_description_param3(self):
|
|
194
|
+
return self.description_param3
|
|
195
|
+
|
|
196
|
+
def get_reqprinc(self):
|
|
197
|
+
return self.reqprinc
|
|
198
|
+
|
|
199
|
+
def get_condition(self):
|
|
200
|
+
return self.condition
|
|
201
|
+
|
|
202
|
+
def get_nbparam(self):
|
|
203
|
+
return self.nbparam
|
|
204
|
+
|
|
205
|
+
def get_detail_erreur(self):
|
|
206
|
+
return self.detail_erreur
|
|
207
|
+
|
|
208
|
+
def check_param_compatibility(self, param1, param2, param3):
|
|
209
|
+
"""Fonction de contrôle des paramètres"""
|
|
210
|
+
nb_erreur = 0
|
|
211
|
+
if (self.description_param1) is not None and (param1 is None):
|
|
212
|
+
nb_erreur = nb_erreur + 1
|
|
213
|
+
if (self.description_param2) is not None and (param2 is None):
|
|
214
|
+
nb_erreur = nb_erreur + 1
|
|
215
|
+
if (self.description_param3) is not None and (param3 is None):
|
|
216
|
+
nb_erreur = nb_erreur + 1
|
|
217
|
+
return nb_erreur
|
|
218
|
+
|
|
219
|
+
def insert_param_in_sql(self, requete_sql, param1, param2, param3):
|
|
220
|
+
"""
|
|
221
|
+
Les paramètres sont renseignées de la sorte dans le point de contrôle:
|
|
222
|
+
ex : self.description_param1 = 'param1:default=8' (issus de la lecture du
|
|
223
|
+
catalogue de contrôle xlsx)
|
|
224
|
+
La fonction insert_param_in_sql remplace ces chaines de caractère par les
|
|
225
|
+
valeurs réelles des paramètres param1, param2, param3, (issus de la lecture
|
|
226
|
+
de la configuration de contrôle xlsx).
|
|
227
|
+
"""
|
|
228
|
+
requete_with_param = requete_sql
|
|
229
|
+
if (self.description_param1) is not None and (param1 is not None):
|
|
230
|
+
requete_with_param = requete_with_param.replace(self.description_param1, param1)
|
|
231
|
+
if (self.description_param2) is not None and (param2 is not None):
|
|
232
|
+
requete_with_param = requete_with_param.replace(self.description_param2, param2)
|
|
233
|
+
if (self.description_param3) is not None and (param3 is not None):
|
|
234
|
+
requete_with_param = requete_with_param.replace(self.description_param3, param3)
|
|
235
|
+
return requete_with_param
|
|
236
|
+
|
|
237
|
+
def get_entete(self, param1=None, param2=None, param3=None):
|
|
238
|
+
"""Fonction d'écriture de l'entete"""
|
|
239
|
+
# Assemblage de l'entête
|
|
240
|
+
sql_entete = (
|
|
241
|
+
"SELECT '"
|
|
242
|
+
+ self.id
|
|
243
|
+
+ "' AS ID_Test, \""
|
|
244
|
+
+ self.description
|
|
245
|
+
+ "\" AS Description, '"
|
|
246
|
+
+ self.classe
|
|
247
|
+
+ "' AS Classe, '"
|
|
248
|
+
+ self.attr
|
|
249
|
+
+ "' AS Attribut, "
|
|
250
|
+
+ self.xxcode
|
|
251
|
+
+ " AS xx_code"
|
|
252
|
+
)
|
|
253
|
+
return self.insert_param_in_sql(sql_entete, param1, param2, param3)
|
|
254
|
+
|
|
255
|
+
def get_sql(self, param1, param2, param3, version_sql="v3"):
|
|
256
|
+
"""Fonction d'écriture des requetes sql 1 et 2"""
|
|
257
|
+
if self.check_param_compatibility(param1, param2, param3) > 0:
|
|
258
|
+
print("ERREUR !!! Il y a un probleme dans les parametres du fichier de configuration")
|
|
259
|
+
else:
|
|
260
|
+
if version_sql == "v1":
|
|
261
|
+
sql_requete_controle = (
|
|
262
|
+
self.get_entete(param1, param2, param3)
|
|
263
|
+
+ " FROM ("
|
|
264
|
+
+ self.reqprinc
|
|
265
|
+
+ ") AS tb_ctrl WHERE "
|
|
266
|
+
+ self.condition
|
|
267
|
+
)
|
|
268
|
+
elif version_sql == "v2":
|
|
269
|
+
sql_requete_controle = (
|
|
270
|
+
self.get_entete(param1, param2, param3)
|
|
271
|
+
+ " , "
|
|
272
|
+
+ self.condition
|
|
273
|
+
+ " AS Is_Error FROM ("
|
|
274
|
+
+ self.reqprinc
|
|
275
|
+
+ ") AS tb_ctrl"
|
|
276
|
+
)
|
|
277
|
+
elif version_sql == "v3":
|
|
278
|
+
# print(self.id)
|
|
279
|
+
# print(self.detail_erreur)
|
|
280
|
+
# print(type(self.detail_erreur))
|
|
281
|
+
sql_requete_controle = (
|
|
282
|
+
self.get_entete(param1, param2, param3)
|
|
283
|
+
+ " , "
|
|
284
|
+
+ str(self.detail_erreur)
|
|
285
|
+
+ " AS DETAIL_ERREUR "
|
|
286
|
+
+ " FROM ("
|
|
287
|
+
+ self.reqprinc
|
|
288
|
+
+ ") AS tb_ctrl WHERE "
|
|
289
|
+
+ self.condition
|
|
290
|
+
)
|
|
291
|
+
return self.insert_param_in_sql(sql_requete_controle, param1, param2, param3)
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def read_xlsx_catalogue(catalogue_file, column_config=catalogue_config):
|
|
295
|
+
log("Lecture du catalogue de contrôle depuis le fichier %s" % (catalogue_file))
|
|
296
|
+
# Création du dictionnaire de Controle ##
|
|
297
|
+
# On lit dans un premiet temps le fichier excel dans un dict en définissant les colonnes nécessaires à l'instanciation des objets Controle
|
|
298
|
+
# Récupération de la liste des colonnes obligatoires à partir de la configuration
|
|
299
|
+
catalogue_cols = [colonne_name for colonne_name in column_config.values()]
|
|
300
|
+
|
|
301
|
+
catalogue_dict = read_all_sheet_to_dict(catalogue_file, catalogue_cols, "id_test")
|
|
302
|
+
# On parcours ensuite le dict pour créer un nouveau dict d'objets Controle
|
|
303
|
+
catalogue_controle = dict()
|
|
304
|
+
for i in catalogue_dict.values():
|
|
305
|
+
nb_param = (
|
|
306
|
+
(i[column_config["param1_col"]] is not None)
|
|
307
|
+
+ (i[column_config["param2_col"]] is not None)
|
|
308
|
+
+ (i[column_config["param3_col"]] is not None)
|
|
309
|
+
)
|
|
310
|
+
catalogue_controle[i["id_test"]] = Controle(
|
|
311
|
+
i[column_config["id_test_col"]],
|
|
312
|
+
i[column_config["description_col"]],
|
|
313
|
+
i[column_config["classe_col"]],
|
|
314
|
+
i[column_config["attribut_col"]],
|
|
315
|
+
i[column_config["xx_code_col"]],
|
|
316
|
+
i[column_config["param1_col"]],
|
|
317
|
+
i[column_config["param2_col"]],
|
|
318
|
+
i[column_config["param3_col"]],
|
|
319
|
+
i[column_config["requ_princ_col"]],
|
|
320
|
+
i[column_config["condition_col"]],
|
|
321
|
+
i[column_config["detail_erreur_col"]],
|
|
322
|
+
nb_param,
|
|
323
|
+
)
|
|
324
|
+
return catalogue_controle
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
def read_xlsx_config(config_file, column_config=config_controle_config):
|
|
328
|
+
log("Lecture de la configuration de contrôle depuis le fichier %s" % (config_file))
|
|
329
|
+
# Création du dictionnaire de configuration ##
|
|
330
|
+
# Récupération de la liste des colonnes obligatoires à partir de la configuration
|
|
331
|
+
config_cols = [colonne_name for colonne_name in column_config.values()]
|
|
332
|
+
config_dict = read_all_sheet_to_dict(config_file, config_cols, "id_test")
|
|
333
|
+
return config_dict
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def translate_config_to_sql(
|
|
337
|
+
catalogue_controle_xlsx,
|
|
338
|
+
config_controle_xlsx,
|
|
339
|
+
catalogue_column_config=catalogue_config,
|
|
340
|
+
config_column_config=config_controle_config,
|
|
341
|
+
):
|
|
342
|
+
log(
|
|
343
|
+
"Traduction en SQL de la configuation de contrôle : \n"
|
|
344
|
+
"Catalogue : %s\n"
|
|
345
|
+
"Configuration : %s\n" % (catalogue_controle_xlsx, config_controle_xlsx)
|
|
346
|
+
)
|
|
347
|
+
catalogue = read_xlsx_catalogue(catalogue_controle_xlsx, catalogue_column_config)
|
|
348
|
+
config = read_xlsx_config(config_controle_xlsx, config_column_config)
|
|
349
|
+
# On crée d'abors une liste [] de points de contrôles SQL puis on appelle la foncion Controle.make_view_ctrl pour construire la vue.
|
|
350
|
+
list_controles_sql = []
|
|
351
|
+
for i in config.values():
|
|
352
|
+
# Récupération des valeurs du dict pour une meilleur lisibilité
|
|
353
|
+
controle_configuration = i[
|
|
354
|
+
config_column_config["config_col"]
|
|
355
|
+
] # valeur O ou N selon que le test est défini ou non dans la configuration de contrôle
|
|
356
|
+
controle_id = i["id_test"]
|
|
357
|
+
controle_param1 = i[config_column_config["param1_col"]]
|
|
358
|
+
controle_param2 = i[config_column_config["param2_col"]]
|
|
359
|
+
controle_param3 = i[config_column_config["param3_col"]]
|
|
360
|
+
if controle_configuration == "O":
|
|
361
|
+
list_controles_sql.append(
|
|
362
|
+
catalogue[controle_id].get_sql(
|
|
363
|
+
controle_param1, controle_param2, controle_param3, version_sql="v3"
|
|
364
|
+
)
|
|
365
|
+
)
|
|
366
|
+
# Construction du SQL de la vue dans un fichier
|
|
367
|
+
sql_code = Controle.make_view_ctrl(list_controles_sql)
|
|
368
|
+
return sql_code
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#! python3 # noqa: E265
|
|
2
|
+
|
|
3
|
+
################################################################################
|
|
4
|
+
# This file is part of quickinteg.
|
|
5
|
+
|
|
6
|
+
# quickinteg is free software: you can redistribute it and/or modify
|
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
9
|
+
# (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# quickinteg is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
# GNU General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You should have received a copy of the GNU General Public License
|
|
17
|
+
# along with quickinteg. If not, see <https://www.gnu.org/licenses/>.
|
|
18
|
+
################################################################################
|
|
19
|
+
|
|
20
|
+
# ############################################################################
|
|
21
|
+
# ########## Libraries #############
|
|
22
|
+
# ##################################
|
|
23
|
+
|
|
24
|
+
# standard library
|
|
25
|
+
import logging
|
|
26
|
+
from logging.handlers import RotatingFileHandler
|
|
27
|
+
|
|
28
|
+
from .__about__ import __version__ as version_number
|
|
29
|
+
|
|
30
|
+
# ############################################################################
|
|
31
|
+
# ########## Globals ###############
|
|
32
|
+
# ##################################
|
|
33
|
+
log_in_qgis_processing = False # if true, the function will call feedback.pushInfo(str(msg))
|
|
34
|
+
log_in_qgis_processing_method = None # refer the function to call (feedback.pushInfo)
|
|
35
|
+
|
|
36
|
+
# loggers = dict()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# ############################################################################
|
|
40
|
+
# ########## Functions #############
|
|
41
|
+
# ##################################
|
|
42
|
+
def log(message, logger, level):
|
|
43
|
+
"""
|
|
44
|
+
Log message to Logger "logger" but also call Qgis processig logging function
|
|
45
|
+
if log_in_qgis_processing is True
|
|
46
|
+
"""
|
|
47
|
+
switcher = {"info": logger.info, "warning": logger.warning, "debug": logger.debug}
|
|
48
|
+
switcher[level](message)
|
|
49
|
+
if log_in_qgis_processing and level in ("info", "warning"):
|
|
50
|
+
log_in_qgis_processing_method(f"[qi_{version_number}] {message}")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def add_console_handler(logger, logLevel=logging.INFO):
|
|
54
|
+
stream_handler = logging.StreamHandler()
|
|
55
|
+
stream_handler.setLevel(logLevel)
|
|
56
|
+
formatter = logging.Formatter("%(levelname)s :: %(message)s")
|
|
57
|
+
stream_handler.setFormatter(formatter)
|
|
58
|
+
logger.addHandler(stream_handler)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def add_file_handler(logger, file, logLevel=logging.DEBUG):
|
|
62
|
+
# création d'un handler qui va rediriger une écriture du log vers
|
|
63
|
+
# un fichier en mode 'append', avec 1 backup et une taille max de 1Mo
|
|
64
|
+
file_handler = RotatingFileHandler(file, "a", 1000000, 1)
|
|
65
|
+
file_handler.setLevel(logLevel)
|
|
66
|
+
formatter = logging.Formatter(
|
|
67
|
+
f"%(asctime)s :: %(levelname)s :: qi_{version_number} %(module)s %(message)s"
|
|
68
|
+
)
|
|
69
|
+
file_handler.setFormatter(formatter)
|
|
70
|
+
logger.addHandler(file_handler)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# def init_Logger(console = False, file = False, loggerName = None, logLevel = logging.DEBUG):
|
|
74
|
+
# """
|
|
75
|
+
# Création d'un nouveau logger, ou bien retourne le logger existant si la fonction
|
|
76
|
+
# a déja été appelée.
|
|
77
|
+
# """
|
|
78
|
+
# # création de l'objet logger qui va nous servir à écrire dans les logs
|
|
79
|
+
# global loggers
|
|
80
|
+
# #dealing with root logger for dictionary index
|
|
81
|
+
# logger_index = loggerName if loggerName != None else 'root'
|
|
82
|
+
# if logger_index not in loggers.keys():
|
|
83
|
+
# loggers[logger_index] = logging.getLogger(loggerName)
|
|
84
|
+
# loggers[logger_index].setLevel(logLevel)
|
|
85
|
+
# if file :
|
|
86
|
+
# # création d'un handler qui va rediriger une écriture du log vers
|
|
87
|
+
# # un fichier en mode 'append', avec 1 backup et une taille max de 1Mo
|
|
88
|
+
# file_handler = RotatingFileHandler(file, 'a', 1000000, 1)
|
|
89
|
+
# file_handler.setLevel(logLevel)
|
|
90
|
+
# formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')
|
|
91
|
+
# file_handler.setFormatter(formatter)
|
|
92
|
+
# loggers[logger_index].addHandler(file_handler)
|
|
93
|
+
# if console:
|
|
94
|
+
# stream_handler = logging.StreamHandler()
|
|
95
|
+
# stream_handler.setLevel(logLevel)
|
|
96
|
+
# formatter = logging.Formatter('%(levelname)s :: %(message)s')
|
|
97
|
+
# stream_handler.setFormatter(formatter)
|
|
98
|
+
# loggers[logger_index].addHandler(stream_handler)
|
|
99
|
+
# try:
|
|
100
|
+
# return(loggers[logger_index])
|
|
101
|
+
# except Exception as e:
|
|
102
|
+
# print(e)
|
|
103
|
+
# print(loggers)
|
|
104
|
+
#
|
|
105
|
+
# def get_logger(loggerName = None):
|
|
106
|
+
# logger_index = loggerName if loggerName != None else 'root'
|
|
107
|
+
# return loggers[loggerName]
|