22import os
33import threading
44import time
5- import uuid
65import zipfile
76from collections .abc import Callable
87from typing import Any
1716
1817# Local application imports
1918from . import geode_functions
19+ from .data import Data
20+ from .database import database
2021
2122
2223def increment_request_counter (current_app : flask .Flask ) -> None :
@@ -152,17 +153,29 @@ def handle_exception(exception: HTTPException) -> flask.Response:
152153 return response
153154
154155
155- def create_unique_data_folder ( ) -> tuple [ str , str ] :
156+ def create_data_folder_from_id ( data_id : str ) -> str :
156157 base_data_folder = flask .current_app .config ["DATA_FOLDER_PATH" ]
157- generated_id = str (uuid .uuid4 ()).replace ("-" , "" )
158- data_path = os .path .join (base_data_folder , generated_id )
158+ data_path = os .path .join (base_data_folder , data_id )
159159 os .makedirs (data_path , exist_ok = True )
160- return generated_id , data_path
160+ return data_path
161161
162162
163163def save_all_viewables_and_return_info (
164- geode_object , data , generated_id , data_path , additional_files = None
165- ):
164+ geode_object : str ,
165+ data : Any ,
166+ input_file : str ,
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+ name = data .name (),
174+ geode_object = geode_object ,
175+ input_file = input_file ,
176+ additional_files = additional_files ,
177+ )
178+ data_path = create_data_folder_from_id (data_entry .id )
166179 saved_native_file_path = geode_functions .save (
167180 geode_object ,
168181 data ,
@@ -177,36 +190,50 @@ def save_all_viewables_and_return_info(
177190 )
178191 with open (saved_light_viewable_file_path , "rb" ) as f :
179192 binary_light_viewable = f .read ()
193+ data_entry .native_file_name = os .path .basename (saved_native_file_path [0 ])
194+ data_entry .viewable_file_name = os .path .basename (saved_viewable_file_path )
195+ data_entry .light_viewable = os .path .basename (saved_light_viewable_file_path )
196+
197+ database .session .commit ()
180198
181199 return {
182- "name" : data .name () ,
183- "native_file_name" : os . path . basename ( saved_native_file_path [ 0 ]) ,
184- "viewable_file_name" : os . path . basename ( saved_viewable_file_path ) ,
185- "id" : generated_id ,
200+ "name" : data_entry .name ,
201+ "native_file_name" : data_entry . native_file_name ,
202+ "viewable_file_name" : data_entry . viewable_file_name ,
203+ "id" : data_entry . id ,
186204 "object_type" : geode_functions .get_object_type (geode_object ),
187205 "binary_light_viewable" : binary_light_viewable .decode ("utf-8" ),
188- "geode_object" : geode_object ,
189- "input_files" : additional_files or [],
206+ "geode_object" : data_entry .geode_object ,
207+ "input_files" : data_entry .input_file ,
208+ "additional_files" : data_entry .additional_files ,
190209 }
191210
192211
193- def generate_native_viewable_and_light_viewable_from_object (geode_object , data ):
194- generated_id , data_path = create_unique_data_folder ()
195- return save_all_viewables_and_return_info (
196- geode_object , data , generated_id , data_path
197- )
212+ def generate_native_viewable_and_light_viewable_from_object (
213+ geode_object : str , data : Any
214+ ) -> dict [str , Any ]:
215+ return save_all_viewables_and_return_info (geode_object , data , input_file = "" )
198216
199217
200- def generate_native_viewable_and_light_viewable_from_file (geode_object , input_filename ):
201- generated_id , data_path = create_unique_data_folder ()
218+ def generate_native_viewable_and_light_viewable_from_file (
219+ geode_object : str , input_filename : str
220+ ) -> dict [str , Any ]:
221+ temp_data_entry = Data .create (
222+ name = "temp" ,
223+ geode_object = geode_object ,
224+ input_file = input_filename ,
225+ additional_files = [],
226+ )
227+
228+ data_path = create_data_folder_from_id (temp_data_entry .id )
202229
203230 full_input_filename = geode_functions .upload_file_path (input_filename )
204231 copied_full_path = os .path .join (
205232 data_path , werkzeug .utils .secure_filename (input_filename )
206233 )
207234 shutil .copy2 (full_input_filename , copied_full_path )
208235
209- additional_files_copied = []
236+ additional_files_copied : list [ str ] = []
210237 additional = geode_functions .additional_files (geode_object , full_input_filename )
211238 for additional_file in additional .mandatory_files + additional .optional_files :
212239 if additional_file .is_missing :
@@ -221,12 +248,14 @@ def generate_native_viewable_and_light_viewable_from_file(geode_object, input_fi
221248 shutil .copy2 (source_path , dest_path )
222249 additional_files_copied .append (additional_file .filename )
223250
224- data = geode_functions .load_data (geode_object , generated_id , input_filename )
251+ data = geode_functions .load_data (geode_object , temp_data_entry .id , input_filename )
252+
253+ database .session .delete (temp_data_entry )
254+ database .session .flush ()
225255
226256 return save_all_viewables_and_return_info (
227257 geode_object ,
228258 data ,
229- generated_id ,
230- data_path ,
259+ input_file = input_filename ,
231260 additional_files = additional_files_copied ,
232261 )
0 commit comments