2
2
from pathlib import Path
3
3
4
4
from flask import current_app
5
- from sqlalchemy import and_ , text
5
+ from sqlalchemy import and_ , text , delete , select
6
6
from sqlalchemy .exc import IntegrityError
7
7
from sqlalchemy .orm .exc import NoResultFound
8
8
9
+ from sqlalchemy .dialects .postgresql import insert as pg_insert
10
+
9
11
from geonature .utils .env import DB , BACKEND_DIR
10
- from geonature .core .gn_permissions .models import PermObject , PermissionAvailable , PermAction
12
+ from geonature .core .gn_permissions .models import (
13
+ PermObject ,
14
+ PermissionAvailable ,
15
+ PermAction ,
16
+ cor_object_module ,
17
+ )
11
18
from geonature .core .gn_commons .models import TModules
12
19
13
20
from pypnnomenclature .models import TNomenclatures , BibNomenclaturesTypes
@@ -73,13 +80,10 @@ def process_export_csv(module_code=None):
73
80
for f in files :
74
81
if not f .endswith (".sql" ):
75
82
continue
76
-
83
+ txt = Path ( Path ( root ) / Path ( f )). read_text ()
77
84
try :
78
- DB .engine .execute (
79
- text (open (Path (root ) / f , "r" ).read ())
80
- .execution_options (autocommit = True )
81
- .bindparams (module_code = module_code )
82
- )
85
+ DB .session .execute (text (txt ).bindparams (module_code = module_code ))
86
+ DB .session .commit ()
83
87
print ("{} - export csv file : {}" .format (module_code , f ))
84
88
85
89
except Exception as e :
@@ -119,37 +123,41 @@ def insert_module_available_permissions(module_code, perm_object_code, session):
119
123
print (f"L'object { perm_object_code } n'est pas traité" )
120
124
121
125
try :
122
- module = session .query ( TModules ).filter_by ( module_code = module_code ).one ()
126
+ module = session .scalars ( select ( TModules ).where ( TModules . module_code == module_code ) ).one ()
123
127
except NoResultFound :
124
128
print (f"Le module { module_code } n'est pas présent" )
125
129
return
126
130
127
131
try :
128
- perm_object = session .query (PermObject ).filter_by (code_object = perm_object_code ).one ()
132
+ perm_object = session .execute (
133
+ select (PermObject ).where (PermObject .code_object == perm_object_code )
134
+ ).scalar_one_or_none ()
129
135
except NoResultFound :
130
136
print (f"L'object de permission { perm_object_code } n'est pas présent" )
131
137
return
132
138
133
- txt_cor_object_module = f"""
134
- INSERT INTO gn_permissions.cor_object_module(
135
- id_module,
136
- id_object
137
- )
138
- VALUES({ module .id_module } , { perm_object .id_object } )
139
- ON CONFLICT DO NOTHING
140
- """
141
- session .execute (txt_cor_object_module )
139
+ stmt = (
140
+ pg_insert (cor_object_module )
141
+ .values (id_module = module .id_module , id_object = perm_object .id_object )
142
+ .on_conflict_do_nothing ()
143
+ )
144
+ session .execute (stmt )
145
+ session .commit ()
142
146
143
147
# Création d'une permission disponible pour chaque action
144
148
object_actions = PERMISSION_LABEL .get (perm_object_code )["actions" ]
145
149
for action in object_actions :
146
- permaction = session .query (PermAction ).filter_by (code_action = action ).one ()
150
+ permaction = session .execute (
151
+ select (PermAction ).where (PermAction .code_action == action )
152
+ ).scalar_one ()
147
153
try :
148
- perm = (
149
- session .query (PermissionAvailable )
150
- .filter_by (module = module , object = perm_object , action = permaction )
151
- .one ()
152
- )
154
+ perm = session .execute (
155
+ select (PermissionAvailable ).where (
156
+ PermissionAvailable .module == module ,
157
+ PermissionAvailable .object == perm_object ,
158
+ PermissionAvailable .action == permaction ,
159
+ )
160
+ ).scalar_one ()
153
161
except NoResultFound :
154
162
perm = PermissionAvailable (
155
163
module = module ,
@@ -171,13 +179,14 @@ def remove_monitoring_module(module_code):
171
179
# remove module in db
172
180
try :
173
181
# suppression des permissions disponibles pour ce module
174
- txt = f"DELETE FROM gn_permissions.t_permissions_available WHERE id_module = { module .id_module } "
175
- DB . engine . execution_options ( autocommit = True ). execute ( txt )
182
+ # txt = f"DELETE FROM gn_permissions.t_permissions_available WHERE id_module = {module.id_module}"
183
+ stmt = delete ( PermissionAvailable ). where ( PermissionAvailable . id_module == module . id_module )
176
184
177
- # HACK pour le moment suppresion avec un sql direct
178
- # Car il y a un soucis de delete cascade dans les modèles sqlalchemy
179
- txt = f"""DELETE FROM gn_commons.t_modules WHERE id_module ={ module .id_module } """
180
- DB .engine .execution_options (autocommit = True ).execute (txt )
185
+ DB .session .execute (stmt )
186
+
187
+ stmt = delete (TModules ).where (TModules .id_module == module .id_module )
188
+ DB .session .execute (stmt )
189
+ DB .session .commit ()
181
190
except IntegrityError :
182
191
print ("Impossible de supprimer le module car il y a des données associées" )
183
192
return
@@ -214,11 +223,11 @@ def add_nomenclature(module_code):
214
223
for data in nomenclature .get ("types" , []):
215
224
nomenclature_type = None
216
225
try :
217
- nomenclature_type = (
218
- DB . session . query (BibNomenclaturesTypes )
219
- . filter ( data .get ("mnemonique" ) == BibNomenclaturesTypes .mnemonique )
220
- . one ( )
221
- )
226
+ nomenclature_type = DB . session . execute (
227
+ select (BibNomenclaturesTypes ). where (
228
+ data .get ("mnemonique" ) == BibNomenclaturesTypes .mnemonique
229
+ )
230
+ ). scalar_one ()
222
231
223
232
except Exception :
224
233
pass
@@ -239,19 +248,18 @@ def add_nomenclature(module_code):
239
248
for data in nomenclature ["nomenclatures" ]:
240
249
nomenclature = None
241
250
try :
242
- nomenclature = (
243
- DB . session . query (TNomenclatures )
251
+ nomenclature = DB . session . execute (
252
+ select (TNomenclatures )
244
253
.join (
245
254
BibNomenclaturesTypes , BibNomenclaturesTypes .id_type == TNomenclatures .id_type
246
255
)
247
- .filter (
256
+ .where (
248
257
and_ (
249
258
data .get ("cd_nomenclature" ) == TNomenclatures .cd_nomenclature ,
250
259
data .get ("type" ) == BibNomenclaturesTypes .mnemonique ,
251
260
)
252
261
)
253
- .one ()
254
- )
262
+ ).scalar_one ()
255
263
256
264
except Exception as e :
257
265
pass
@@ -266,14 +274,13 @@ def add_nomenclature(module_code):
266
274
continue
267
275
268
276
id_type = None
269
-
270
277
try :
271
- id_type = (
272
- DB . session . query (BibNomenclaturesTypes .id_type )
273
- . filter ( BibNomenclaturesTypes .mnemonique == data ["type" ])
274
- . one ( )
275
- )[ 0 ]
276
- except Exception :
278
+ id_type = DB . session . execute (
279
+ select (BibNomenclaturesTypes .id_type ). where (
280
+ BibNomenclaturesTypes .mnemonique == data ["type" ]
281
+ )
282
+ ). scalar_one ()
283
+ except Exception as e :
277
284
pass
278
285
279
286
if not id_type :
@@ -295,6 +302,11 @@ def add_nomenclature(module_code):
295
302
nomenclature = TNomenclatures (** data )
296
303
DB .session .add (nomenclature )
297
304
DB .session .commit ()
305
+ print (
306
+ "nomenclature {} - {} added" .format (
307
+ nomenclature .cd_nomenclature , nomenclature .label_default
308
+ )
309
+ )
298
310
299
311
300
312
def installed_modules (session = None ):
0 commit comments