Skip to content

Commit d3704c3

Browse files
committed
feat(input_file): added unique path for files from input file
1 parent 4f43fc7 commit d3704c3

File tree

5 files changed

+50
-71
lines changed

5 files changed

+50
-71
lines changed

src/opengeodeweb_back/routes/blueprint_routes.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,6 @@ def save_viewable_file():
251251
utils_functions.generate_native_viewable_and_light_viewable_from_file(
252252
geode_object=flask.request.json["input_geode_object"],
253253
input_filename=flask.request.json["filename"],
254-
data_id=flask.request.json["data_id"],
255254
),
256255
200,
257256
)

src/opengeodeweb_back/routes/schemas/save_viewable_file.json

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,11 @@
1212
"filename": {
1313
"type": "string",
1414
"minLength": 1
15-
},
16-
"data_id": {
17-
"type": "string",
18-
"minLength": 1
1915
}
2016
},
2117
"required": [
2218
"input_geode_object",
23-
"filename",
24-
"data_id"
19+
"filename"
2520
],
2621
"additionalProperties": false
2722
}

src/opengeodeweb_back/utils_functions.py

Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import fastjsonschema
1111
import importlib.metadata as metadata
1212
import shutil
13+
import werkzeug
1314

1415
# Local application imports
1516
from . 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+
)

tests/test_routes.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,14 @@ def get_full_data():
138138
test_utils.test_route_wrong_params(client, route, get_full_data)
139139

140140

141-
def test_save_viewable_file(client, test_id):
141+
def test_save_viewable_file(client):
142142
test_upload_file(client, filename="corbi.og_brep")
143143
route = f"/save_viewable_file"
144144

145145
def get_full_data():
146146
return {
147147
"input_geode_object": "BRep",
148148
"filename": "corbi.og_brep",
149-
"data_id": test_id,
150149
}
151150

152151
# Normal test with filename 'corbi.og_brep'
@@ -174,7 +173,7 @@ def test_texture_coordinates(client, test_id):
174173
with client.application.app_context():
175174
data_path = geode_functions.data_file_path(test_id, "hat.vtp")
176175
os.makedirs(os.path.dirname(data_path), exist_ok=True)
177-
shutil.copy("./tests/data/hat.vtp", data_path) # Utiliser hat.vtp qui existe
176+
shutil.copy("./tests/data/hat.vtp", data_path)
178177

179178
response = client.post(
180179
"/texture_coordinates",

tests/test_utils_functions.py

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,14 @@ def test_generate_native_viewable_and_light_viewable_from_object(client):
9696
assert result["input_files"] == []
9797

9898

99-
def test_generate_native_viewable_and_light_viewable_from_file(client, test_id):
99+
def test_generate_native_viewable_and_light_viewable_from_file(client):
100100
app = client.application
101101
with app.app_context():
102102
geode_object = "BRep"
103103
input_filename = "test.og_brep"
104-
data_id = test_id
105104

106105
result = utils_functions.generate_native_viewable_and_light_viewable_from_file(
107-
geode_object, input_filename, data_id
106+
geode_object, input_filename
108107
)
109108

110109
assert isinstance(result, dict)
@@ -118,24 +117,3 @@ def test_generate_native_viewable_and_light_viewable_from_file(client, test_id):
118117
assert isinstance(result["object_type"], str)
119118
assert isinstance(result["binary_light_viewable"], str)
120119
assert isinstance(result["input_files"], list)
121-
122-
123-
def test_native_viewable_and_light_viewable(client):
124-
app = client.application
125-
with app.app_context():
126-
geode_object = "BRep"
127-
data = geode_functions.load(geode_object, "./tests/data/test.og_brep")
128-
result = utils_functions.generate_native_viewable_and_light_viewable(
129-
geode_object, data
130-
)
131-
132-
assert isinstance(result, dict)
133-
assert isinstance(result["name"], str)
134-
assert isinstance(result["native_file_name"], str)
135-
assert result["native_file_name"].startswith("native.")
136-
assert isinstance(result["viewable_file_name"], str)
137-
assert result["viewable_file_name"].endswith(".vtm")
138-
assert isinstance(result["id"], str)
139-
assert re.match(r"[0-9a-f]{32}", result["id"])
140-
assert isinstance(result["object_type"], str)
141-
assert isinstance(result["binary_light_viewable"], str)

0 commit comments

Comments
 (0)