55from app .administration import bp
66from app .tasks import process_file
77from unidecode import unidecode
8- from flask import render_template , request , current_app , Response
8+ from flask import render_template , request , current_app , Response , jsonify
9+ from flask_login import current_user
910from werkzeug .utils import secure_filename
1011from flask_login import login_required
1112from app .decorators import admin_required
@@ -52,14 +53,27 @@ def upload():
5253 folder_id = json_data .get ("folderId" )
5354 file_data = json_data .get ("data" )
5455 filename = unidecode (secure_filename (json_data .get ("filename" ))).lower ()
55- user_tags = ' ' .join (json_data .get ("tags" ).replace (' ' , ';' ).split (';' ))
56+ existing_file = FICHIER .query .filter_by (nom_Fichier = filename ).first ()
57+ force = json_data .get ("force" )
58+ if existing_file is not None :
59+ if force :
60+ delete_file (str (existing_file .id_Fichier ))
61+ else :
62+ return jsonify ({'filename' : filename ,
63+ 'existingFolder' : existing_file .DOSSIER_ .nom_Dossier ,
64+ 'attemptedFolder' : DOSSIER .query .get (folder_id ).nom_Dossier ,
65+ 'existingFileAuthorFirstName' : existing_file .AUTEUR .prenom_Utilisateur ,
66+ 'existingFileAuthorLastName' : existing_file .AUTEUR .nom_Utilisateur ,
67+ 'existingFileDate' : existing_file .date_Fichier .strftime ('%d/%m/%Y à %H:%M' )}), 409
68+ user_tags = unidecode (' ' .join (json_data .get ("tags" ).replace (' ' , ';' ).split (';' ))).lower ()
5669 storage_directory = os .path .join (current_app .root_path , "storage" )
5770 if not os .path .exists (f"{ storage_directory } /{ folder_id } " ):
5871 os .makedirs (f"{ storage_directory } /{ folder_id } " )
5972 file = FICHIER (
6073 id_Dossier = folder_id ,
6174 nom_Fichier = filename ,
6275 extension_Fichier = filename .split ("." )[- 1 ],
76+ id_Utilisateur = current_user .id_Utilisateur ,
6377 )
6478 db .session .add (file )
6579 db .session .commit ()
@@ -98,33 +112,6 @@ def connect():
98112 )
99113
100114
101- @socketio .on ("trash_file" , namespace = "/administration" )
102- def trash_file (data ):
103- try :
104- file_id = data .get ("fileId" )
105- folder_id = data .get ("folderId" )
106- with InterProcessLock (f"{ current_app .root_path } /whoosh.lock" ):
107- Whoosh ().delete_document (file_id )
108- file = FICHIER .query .get (file_id )
109- db .session .delete (file )
110- os .remove (
111- os .path .join (
112- current_app .root_path ,
113- "storage" ,
114- folder_id ,
115- f"{ file_id } .{ file .extension_Fichier } " ,
116- )
117- )
118- db .session .commit ()
119- socketio .emit ("file_deleted" , data , namespace = "/administration" )
120- except Exception as e :
121- socketio .emit (
122- "file_deletion_failed" ,
123- {** data , "error" : str (e )},
124- namespace = "/administration" ,
125- )
126-
127-
128115@socketio .on ("search_files" , namespace = "/administration" )
129116def search_files (data ):
130117 search_query = data .get ("query" )
@@ -203,8 +190,11 @@ def create_folder(data):
203190 parent_folder_id = data .get ('parentFolderId' )
204191 folder_roles = data .get ('folderRoles' )
205192 folder_color = data .get ('folderColor' )
206- last_priority = db .session .query (db .func .max (DOSSIER .priorite_Dossier )).scalar ()
207- folder = DOSSIER (nom_Dossier = folder_name , priorite_Dossier = last_priority + 1 , couleur_Dossier = folder_color )
193+ folder_priority = data .get ('folderPriority' )
194+ folders_to_update = DOSSIER .query .filter (DOSSIER .priorite_Dossier >= folder_priority ).filter (DOSSIER .id_Dossier != 10 ).all ()
195+ for folder_to_update in folders_to_update :
196+ folder_to_update .priorite_Dossier += 1
197+ folder = DOSSIER (nom_Dossier = folder_name , priorite_Dossier = folder_priority , couleur_Dossier = folder_color )
208198 db .session .add (folder )
209199 try :
210200 db .session .commit ()
@@ -244,11 +234,25 @@ def modify_folder(data):
244234 folder_name = data .get ('folderName' )
245235 parent_folder_id = data .get ('parentFolderId' )
246236 folder_roles = data .get ('folderRoles' )
237+ folder_priority = data .get ('folderPriority' )
247238 folder_color = data .get ('folderColor' )
248239 folder = DOSSIER .query .get (folder_id )
249240 folder .nom_Dossier = folder_name
250241 folder .couleur_Dossier = folder_color
242+ if folder .priorite_Dossier != int (folder_priority ):
243+ if int (folder_priority ) > folder .priorite_Dossier :
244+ folders_to_update = DOSSIER .query .filter (DOSSIER .priorite_Dossier > folder .priorite_Dossier ).filter (DOSSIER .priorite_Dossier <= int (folder_priority )).filter (DOSSIER .id_Dossier != 10 ).all ()
245+ for folder_to_update in folders_to_update :
246+ folder_to_update .priorite_Dossier -= 1
247+ else :
248+ folders_to_update = DOSSIER .query .filter (DOSSIER .priorite_Dossier >= int (folder_priority )).filter (DOSSIER .priorite_Dossier < folder .priorite_Dossier ).filter (DOSSIER .id_Dossier != 10 ).all ()
249+ for folder_to_update in folders_to_update :
250+ folder_to_update .priorite_Dossier += 1
251+ folder .priorite_Dossier = folder_priority
251252 try :
253+ if parent_folder_id == folder_id :
254+ socketio .emit ('folder_not_modified' , {'error' : 'Un classeur ne peut pas être son propre parent.' }, namespace = '/administration' )
255+ return
252256 if parent_folder_id != 0 :
253257 db .session .execute (SOUS_DOSSIER .delete ().where (SOUS_DOSSIER .c .id_Dossier_Enfant == folder_id ))
254258 db .session .execute (SOUS_DOSSIER .insert ().values (id_Dossier_Parent = parent_folder_id , id_Dossier_Enfant = folder_id ))
@@ -277,4 +281,103 @@ def modify_folder(data):
277281 socketio .emit ('folder_not_modified' , {'error' : str (e )}, namespace = '/administration' )
278282 return
279283 db .session .commit ()
280- socketio .emit ('folder_modified' , {'folderId' : folder_id , 'folderName' : folder_name , 'folderColor' : folder_color }, namespace = '/administration' )
284+ socketio .emit ('folder_modified' , {'folderId' : folder_id , 'folderName' : folder_name , 'folderColor' : folder_color }, namespace = '/administration' )
285+
286+ @socketio .on ('delete_folder' , namespace = '/administration' )
287+ def delete_folder (data ):
288+ folder = DOSSIER .query .get (data .get ('folderId' ))
289+ if folder .id_Dossier == 10 :
290+ socketio .emit ('folder_not_deleted' , {'error' : 'Le classeur d\' archive ne peut pas être supprimé.' }, namespace = '/administration' )
291+ return
292+ if len (folder .DOSSIER_ ) > 0 :
293+ socketio .emit ('folder_not_deleted' , {'error' : 'Le classeur contient des sous-classeurs.' }, namespace = '/administration' )
294+ return
295+ if len (folder .FICHIER ) > 0 :
296+ socketio .emit ('folder_not_deleted' , {'error' : 'Le classeur contient des fichiers.' }, namespace = '/administration' )
297+ return
298+ try :
299+ db .session .execute (SOUS_DOSSIER .delete ().where (SOUS_DOSSIER .c .id_Dossier_Enfant == folder .id_Dossier ))
300+ db .session .execute (SOUS_DOSSIER .delete ().where (SOUS_DOSSIER .c .id_Dossier_Parent == folder .id_Dossier ))
301+ db .session .commit ()
302+ except Exception as e :
303+ db .session .rollback ()
304+ socketio .emit ('folder_not_deleted' , {'error' : str (e )}, namespace = '/administration' )
305+ return
306+ try :
307+ db .session .execute (A_ACCES .delete ().where (A_ACCES .c .id_Dossier == folder .id_Dossier ))
308+ db .session .commit ()
309+ except Exception as e :
310+ db .session .rollback ()
311+ socketio .emit ('folder_not_deleted' , {'error' : str (e )}, namespace = '/administration' )
312+ return
313+ deleted_priority = folder .priorite_Dossier
314+ db .session .delete (folder )
315+ db .session .commit ()
316+ folders_to_update = DOSSIER .query .filter (DOSSIER .priorite_Dossier > deleted_priority ).filter (DOSSIER .id_Dossier != 10 ).all ()
317+ for folder_to_update in folders_to_update :
318+ folder_to_update .priorite_Dossier -= 1
319+ db .session .commit ()
320+ socketio .emit ('folder_deleted' , {'folderId' : folder .id_Dossier }, namespace = '/administration' )
321+
322+
323+ @socketio .on ('archive_folders' , namespace = '/administration' )
324+ def archive_folders (data ):
325+ folder_ids = data .get ('folderIds' )
326+ try :
327+ for folder_id in folder_ids :
328+ database_folder = DOSSIER .query .get (folder_id )
329+ if folder_id == '10' :
330+ pass
331+ elif database_folder .DOSSIER != [] and database_folder .DOSSIER [0 ].id_Dossier == 10 :
332+ pass
333+ elif database_folder .DOSSIER != [] and str (database_folder .DOSSIER [0 ].id_Dossier ) in folder_ids :
334+ pass
335+ else :
336+ if database_folder .DOSSIER != []:
337+ db .session .execute (SOUS_DOSSIER .delete ().where (SOUS_DOSSIER .c .id_Dossier_Enfant == folder_id ))
338+ db .session .execute (SOUS_DOSSIER .insert ().values (id_Dossier_Parent = 10 , id_Dossier_Enfant = folder_id ))
339+ db .session .commit ()
340+ except Exception as e :
341+ db .session .rollback ()
342+ socketio .emit ('folders_not_archived' , {'error' : str (e )}, namespace = '/administration' )
343+ return
344+ socketio .emit ('folders_archived' , {'folderIds' : folder_ids }, namespace = '/administration' )
345+
346+ @socketio .on ('delete_files' , namespace = '/administration' )
347+ def delete_files (data ):
348+ file_ids = data .get ('fileIds' )
349+ try :
350+ for file_id in file_ids :
351+ with InterProcessLock (f"{ current_app .root_path } /whoosh.lock" ):
352+ Whoosh ().delete_document (file_id )
353+ database_file = FICHIER .query .get (file_id )
354+ db .session .delete (database_file )
355+ os .remove (
356+ os .path .join (
357+ current_app .root_path ,
358+ "storage" ,
359+ str (database_file .id_Dossier ),
360+ f"{ file_id } .{ database_file .extension_Fichier } " ,
361+ )
362+ )
363+ db .session .commit ()
364+ except Exception as e :
365+ db .session .rollback ()
366+ socketio .emit ('files_not_deleted' , {'error' : str (e )}, namespace = '/administration' )
367+ return
368+ socketio .emit ('files_deleted' , {'fileIds' : file_ids }, namespace = '/administration' )
369+
370+ def delete_file (file_id ):
371+ with InterProcessLock (f"{ current_app .root_path } /whoosh.lock" ):
372+ Whoosh ().delete_document (file_id )
373+ database_file = FICHIER .query .get (file_id )
374+ db .session .delete (database_file )
375+ os .remove (
376+ os .path .join (
377+ current_app .root_path ,
378+ "storage" ,
379+ str (database_file .id_Dossier ),
380+ f"{ file_id } .{ database_file .extension_Fichier } " ,
381+ )
382+ )
383+ db .session .commit ()
0 commit comments