1010import fastjsonschema
1111import importlib .metadata as metadata
1212import shutil
13+ import werkzeug
1314
1415# Local application imports
1516from . import geode_functions
@@ -144,44 +145,14 @@ def handle_exception(e):
144145 return response
145146
146147
147- def generate_native_viewable_and_light_viewable_from_object (geode_object , data ):
148- return generate_native_viewable_and_light_viewable (geode_object , data )
149-
150-
151- def generate_native_viewable_and_light_viewable_from_file (
152- geode_object , input_filename , data_id
153- ):
154- data = geode_functions .load_data (geode_object , data_id , input_filename )
155- full_input_filename = geode_functions .data_file_path (data_id , input_filename )
156- return generate_native_viewable_and_light_viewable (
157- geode_object , data , full_input_filename
158- )
159-
160-
161- def generate_native_viewable_and_light_viewable (
162- geode_object , data , input_filename = None
163- ):
148+ def create_unique_data_folder (base_data_folder : str ) -> tuple [str , str ]:
164149 generated_id = str (uuid .uuid4 ()).replace ("-" , "" )
165- DATA_FOLDER_PATH = flask .current_app .config ["DATA_FOLDER_PATH" ]
166- data_path = os .path .join (DATA_FOLDER_PATH , generated_id )
150+ data_path = os .path .join (base_data_folder , generated_id )
167151 os .makedirs (data_path , exist_ok = True )
152+ return generated_id , data_path
168153
169- additional_files_copied = []
170- if input_filename :
171- additional = geode_functions .additional_files (geode_object , input_filename )
172- for additional_file in additional .mandatory_files + additional .optional_files :
173- if additional_file .is_missing :
174- continue
175- source_path = os .path .join (
176- os .path .dirname (input_filename ), additional_file .filename
177- )
178- if not os .path .exists (source_path ):
179- continue
180- dest_path = os .path .join (data_path , additional_file .filename )
181- os .makedirs (os .path .dirname (dest_path ), exist_ok = True )
182- shutil .copy2 (source_path , dest_path )
183- additional_files_copied .append (additional_file .filename )
184154
155+ def save_all_viewables_and_return_info (geode_object , data , generated_id , data_path , additional_files = None ):
185156 saved_native_file_path = geode_functions .save (
186157 geode_object ,
187158 data ,
@@ -191,7 +162,6 @@ def generate_native_viewable_and_light_viewable(
191162 saved_viewable_file_path = geode_functions .save_viewable (
192163 geode_object , data , data_path , "viewable"
193164 )
194- viewable_file_name = os .path .basename (saved_viewable_file_path )
195165 saved_light_viewable_file_path = geode_functions .save_light_viewable (
196166 geode_object , data , data_path , "light_viewable"
197167 )
@@ -201,10 +171,48 @@ def generate_native_viewable_and_light_viewable(
201171 return {
202172 "name" : data .name (),
203173 "native_file_name" : os .path .basename (saved_native_file_path [0 ]),
204- "viewable_file_name" : viewable_file_name ,
174+ "viewable_file_name" : os . path . basename ( saved_viewable_file_path ) ,
205175 "id" : generated_id ,
206176 "object_type" : geode_functions .get_object_type (geode_object ),
207177 "binary_light_viewable" : binary_light_viewable .decode ("utf-8" ),
208178 "geode_object" : geode_object ,
209- "input_files" : additional_files_copied ,
179+ "input_files" : additional_files or [] ,
210180 }
181+
182+ def generate_native_viewable_and_light_viewable_from_object (geode_object , data ):
183+ base_data_folder = flask .current_app .config ["DATA_FOLDER_PATH" ]
184+ generated_id , data_path = create_unique_data_folder (base_data_folder )
185+
186+ return save_all_viewables_and_return_info (geode_object , data , generated_id , data_path )
187+
188+
189+ def generate_native_viewable_and_light_viewable_from_file (geode_object , input_filename ):
190+ base_data_folder = flask .current_app .config ["DATA_FOLDER_PATH" ]
191+ generated_id , data_path = create_unique_data_folder (base_data_folder )
192+
193+ full_input_filename = geode_functions .upload_file_path (input_filename )
194+ copied_full_path = os .path .join (data_path , werkzeug .utils .secure_filename (input_filename ))
195+ shutil .copy2 (full_input_filename , copied_full_path )
196+
197+ additional_files_copied = []
198+ additional = geode_functions .additional_files (geode_object , full_input_filename )
199+ for additional_file in additional .mandatory_files + additional .optional_files :
200+ if additional_file .is_missing :
201+ continue
202+ source_path = os .path .join (os .path .dirname (full_input_filename ), additional_file .filename )
203+ if not os .path .exists (source_path ):
204+ continue
205+ dest_path = os .path .join (data_path , additional_file .filename )
206+ os .makedirs (os .path .dirname (dest_path ), exist_ok = True )
207+ shutil .copy2 (source_path , dest_path )
208+ additional_files_copied .append (additional_file .filename )
209+
210+ data = geode_functions .load_data (geode_object , generated_id , input_filename )
211+
212+ return save_all_viewables_and_return_info (
213+ geode_object ,
214+ data ,
215+ generated_id ,
216+ data_path ,
217+ additional_files = additional_files_copied ,
218+ )
0 commit comments