44import time
55import zipfile
66from collections .abc import Callable
7- from typing import Any
87from concurrent .futures import ThreadPoolExecutor
98
109# Third party imports
@@ -41,13 +40,28 @@ def update_last_request_time(current_app: flask.Flask) -> None:
4140 current_app .config .update (LAST_REQUEST_TIME = LAST_REQUEST_TIME )
4241
4342
43+ def terminate_session (exception : BaseException | None ) -> None :
44+ session = flask .g .pop ("session" , None )
45+ if session is None :
46+ return
47+ if exception is None :
48+ session .commit ()
49+ else :
50+ session .rollback ()
51+ session .close ()
52+
53+
4454def before_request (current_app : flask .Flask ) -> None :
4555 increment_request_counter (current_app )
56+ flask .g .session = get_session ()
4657
4758
48- def teardown_request (current_app : flask .Flask ) -> None :
59+ def teardown_request (
60+ current_app : flask .Flask , exception : BaseException | None = None
61+ ) -> None :
4962 decrement_request_counter (current_app )
5063 update_last_request_time (current_app )
64+ terminate_session (exception )
5165
5266
5367def kill_task (current_app : flask .Flask ) -> None :
@@ -97,7 +111,7 @@ def validate_request(request: flask.Request, schema: dict[str, str]) -> None:
97111
98112
99113def set_interval (
100- function : Callable [[Any ], None ], seconds : float , args : Any
114+ function : Callable [[flask . Flask ], None ], seconds : float , args : flask . Flask
101115) -> threading .Timer :
102116 def function_wrapper () -> None :
103117 set_interval (function , seconds , args )
@@ -114,7 +128,7 @@ def extension_from_filename(filename: str) -> str:
114128
115129
116130def send_file (
117- upload_folder : str , saved_files : str , new_file_name : str
131+ upload_folder : str , saved_files : list [ str ] , new_file_name : str
118132) -> flask .Response :
119133 if len (saved_files ) == 1 :
120134 mimetype = "application/octet-binary"
@@ -162,19 +176,10 @@ def create_data_folder_from_id(data_id: str) -> str:
162176
163177def save_all_viewables_and_return_info (
164178 geode_object : str ,
165- data : Any ,
166- input_file : str | None = None ,
167- additional_files : list [str ] | None = None ,
168- ) -> dict [str , Any ]:
169- if additional_files is None :
170- additional_files = []
171-
172- data_entry = Data .create (
173- geode_object = geode_object ,
174- input_file = input_file ,
175- additional_files = additional_files ,
176- )
177- data_path = create_data_folder_from_id (data_entry .id )
179+ data : object ,
180+ data_entry : Data ,
181+ data_path : str ,
182+ ) -> dict [str , str | list [str ]]:
178183 with ThreadPoolExecutor () as executor :
179184 native_future = executor .submit (
180185 geode_functions .save ,
@@ -202,38 +207,40 @@ def save_all_viewables_and_return_info(
202207 data_entry .viewable_file_name = os .path .basename (saved_viewable_file_path )
203208 data_entry .light_viewable = os .path .basename (saved_light_viewable_file_path )
204209
205- session = get_session ()
206- if session :
207- session .commit ()
208-
209210 return {
210211 "native_file_name" : data_entry .native_file_name ,
211212 "viewable_file_name" : data_entry .viewable_file_name ,
212213 "id" : data_entry .id ,
213214 "object_type" : geode_functions .get_object_type (geode_object ),
214215 "binary_light_viewable" : binary_light_viewable .decode ("utf-8" ),
215216 "geode_object" : data_entry .geode_object ,
216- "input_files " : data_entry .input_file ,
217+ "input_file " : data_entry .input_file ,
217218 "additional_files" : data_entry .additional_files ,
218219 }
219220
220221
221222def generate_native_viewable_and_light_viewable_from_object (
222- geode_object : str , data : Any
223- ) -> dict [str , Any ]:
224- return save_all_viewables_and_return_info (geode_object , data , input_file = "" )
223+ geode_object : str , data : object
224+ ) -> dict [str , str | list [str ]]:
225+ data_entry = Data .create (
226+ geode_object = geode_object ,
227+ input_file = "" ,
228+ additional_files = [],
229+ )
230+ data_path = create_data_folder_from_id (data_entry .id )
231+ return save_all_viewables_and_return_info (geode_object , data , data_entry , data_path )
225232
226233
227234def generate_native_viewable_and_light_viewable_from_file (
228235 geode_object : str , input_filename : str
229- ) -> dict [str , Any ]:
230- temp_data_entry = Data .create (
236+ ) -> dict [str , str | list [ str ] ]:
237+ data_entry = Data .create (
231238 geode_object = geode_object ,
232239 input_file = input_filename ,
233240 additional_files = [],
234241 )
235242
236- data_path = create_data_folder_from_id (temp_data_entry .id )
243+ data_path = create_data_folder_from_id (data_entry .id )
237244
238245 full_input_filename = geode_functions .upload_file_path (input_filename )
239246 copied_full_path = os .path .join (
@@ -258,14 +265,10 @@ def generate_native_viewable_and_light_viewable_from_file(
258265
259266 data = geode_functions .load (geode_object , copied_full_path )
260267
261- session = get_session ()
262- if session :
263- session .delete (temp_data_entry )
264- session .flush ()
265-
268+ data_entry .additional_files = additional_files_copied
266269 return save_all_viewables_and_return_info (
267270 geode_object ,
268271 data ,
269- input_file = input_filename ,
270- additional_files = additional_files_copied ,
272+ data_entry ,
273+ data_path ,
271274 )
0 commit comments