From 3aeb2765b659c5fd61d08653cae5411742fa4880 Mon Sep 17 00:00:00 2001 From: SpliiT Date: Thu, 11 Dec 2025 15:42:41 +0100 Subject: [PATCH 1/8] fix(export_file): fix some tests and use native_file if there is not input_file --- src/opengeodeweb_back/geode_functions.py | 12 +++-- .../routes/blueprint_routes.py | 28 +++------- tests/test_geode_functions.py | 4 +- tests/test_models_routes.py | 54 ++++++++++++++++--- 4 files changed, 66 insertions(+), 32 deletions(-) diff --git a/src/opengeodeweb_back/geode_functions.py b/src/opengeodeweb_back/geode_functions.py index afcd2e1c..4e0785ab 100644 --- a/src/opengeodeweb_back/geode_functions.py +++ b/src/opengeodeweb_back/geode_functions.py @@ -55,7 +55,8 @@ def geode_object_output_extensions( geode_object: GeodeObject, ) -> dict[GeodeObjectType, dict[str, bool]]: results: dict[GeodeObjectType, dict[str, bool]] = {} - for mixin_geode_object in geode_objects[geode_object.geode_object_type()].__mro__: + current_type = geode_object.geode_object_type() + for mixin_geode_object in geode_objects[current_type].__mro__: output_extensions_method = getattr( mixin_geode_object, "output_extensions", None ) @@ -66,11 +67,16 @@ def geode_object_output_extensions( continue object_output_extensions: dict[str, bool] = {} is_saveable_method = getattr(mixin_geode_object, "is_saveable") + target_type = None + if hasattr(mixin_geode_object, "geode_object_type"): + target_type = mixin_geode_object.geode_object_type() + if target_type and target_type != current_type: + continue for output_extension in output_extensions: bool_is_saveable = is_saveable_method( geode_object, f"test.{output_extension}" ) object_output_extensions[output_extension] = bool_is_saveable - if hasattr(mixin_geode_object, "geode_object_type"): - results[mixin_geode_object.geode_object_type()] = object_output_extensions + if target_type: + results[target_type] = object_output_extensions return results diff --git a/src/opengeodeweb_back/routes/blueprint_routes.py b/src/opengeodeweb_back/routes/blueprint_routes.py index 654c1116..545c96cf 100644 --- a/src/opengeodeweb_back/routes/blueprint_routes.py +++ b/src/opengeodeweb_back/routes/blueprint_routes.py @@ -29,7 +29,6 @@ routes = flask.Blueprint("routes", __name__, url_prefix="/opengeodeweb_back") - routes.register_blueprint( blueprint_models.routes, url_prefix=blueprint_models.routes.url_prefix, @@ -38,7 +37,6 @@ schemas_dict = get_schemas_dict(os.path.join(os.path.dirname(__file__), "schemas")) - @routes.route( schemas_dict["allowed_files"]["route"], methods=schemas_dict["allowed_files"]["methods"], @@ -51,7 +49,6 @@ def allowed_files() -> flask.Response: extensions.add(extension) return flask.make_response({"extensions": list(extensions)}, 200) - @routes.route( schemas_dict["upload_file"]["route"], methods=schemas_dict["upload_file"]["methods"], @@ -66,7 +63,6 @@ def upload_file() -> flask.Response: file.save(os.path.join(UPLOAD_FOLDER, filename)) return flask.make_response({"message": "File uploaded"}, 201) - @routes.route( schemas_dict["allowed_objects"]["route"], methods=schemas_dict["allowed_objects"]["methods"], @@ -92,7 +88,6 @@ def allowed_objects() -> flask.Response: } return flask.make_response({"allowed_objects": allowed_objects}, 200) - @routes.route( schemas_dict["missing_files"]["route"], methods=schemas_dict["missing_files"]["methods"], @@ -131,7 +126,6 @@ def missing_files() -> flask.Response: 200, ) - @routes.route( schemas_dict["geographic_coordinate_systems"]["route"], methods=schemas_dict["geographic_coordinate_systems"]["methods"], @@ -156,7 +150,6 @@ def crs_converter_geographic_coordinate_systems() -> flask.Response: crs_list.append(crs) return flask.make_response({"crs_list": crs_list}, 200) - @routes.route( schemas_dict["inspect_file"]["route"], methods=schemas_dict["inspect_file"]["methods"], @@ -174,7 +167,6 @@ def inspect_file() -> flask.Response: inspection_result = extract_inspector_result(inspection_data) return flask.make_response({"inspection_result": inspection_result}, 200) - def extract_inspector_result(inspection_data: Any) -> object: new_object = {} @@ -202,7 +194,6 @@ def extract_inspector_result(inspection_data: Any) -> object: new_object["issues"] = issues return new_object - @routes.route( schemas_dict["geode_objects_and_output_extensions"]["route"], methods=schemas_dict["geode_objects_and_output_extensions"]["methods"], @@ -224,7 +215,6 @@ def geode_objects_and_output_extensions() -> flask.Response: 200, ) - @routes.route( schemas_dict["save_viewable_file"]["route"], methods=schemas_dict["save_viewable_file"]["methods"], @@ -242,7 +232,6 @@ def save_viewable_file() -> flask.Response: 200, ) - @routes.route( schemas_dict["texture_coordinates"]["route"], methods=schemas_dict["texture_coordinates"]["methods"], @@ -258,7 +247,6 @@ def texture_coordinates() -> flask.Response: texture_coordinates = geode_object.texture_manager().texture_names() return flask.make_response({"texture_coordinates": texture_coordinates}, 200) - @routes.route( schemas_dict["vertex_attribute_names"]["route"], methods=schemas_dict["vertex_attribute_names"]["methods"], @@ -279,7 +267,6 @@ def vertex_attribute_names() -> flask.Response: 200, ) - @routes.route( schemas_dict["cell_attribute_names"]["route"], methods=schemas_dict["cell_attribute_names"]["methods"], @@ -300,7 +287,6 @@ def cell_attribute_names() -> flask.Response: 200, ) - @routes.route( schemas_dict["polygon_attribute_names"]["route"], methods=schemas_dict["polygon_attribute_names"]["methods"], @@ -321,7 +307,6 @@ def polygon_attribute_names() -> flask.Response: 200, ) - @routes.route( schemas_dict["polyhedron_attribute_names"]["route"], methods=schemas_dict["polyhedron_attribute_names"]["methods"], @@ -344,7 +329,6 @@ def polyhedron_attribute_names() -> flask.Response: 200, ) - @routes.route( schemas_dict["ping"]["route"], methods=schemas_dict["ping"]["methods"], @@ -354,14 +338,12 @@ def ping() -> flask.Response: flask.current_app.config.update(LAST_PING_TIME=time.time()) return flask.make_response({"message": "Flask server is running"}, 200) - @routes.route(schemas_dict["kill"]["route"], methods=schemas_dict["kill"]["methods"]) def kill() -> flask.Response: print("Manual server kill, shutting down...", flush=True) os._exit(0) return flask.make_response({"message": "Flask server is dead"}, 200) - @routes.route( schemas_dict["export_project"]["route"], methods=schemas_dict["export_project"]["methods"], @@ -381,6 +363,14 @@ def export_project() -> flask.Response: export_vease_path = os.path.join(project_folder, filename) with get_session() as session: + session.query(Data).filter( + (Data.input_file == None) | (Data.input_file == "") + ).update( + {Data.input_file: Data.native_file}, + synchronize_session=False + ) + session.commit() + rows = session.query(Data.id, Data.input_file, Data.additional_files).all() with zipfile.ZipFile( @@ -410,7 +400,6 @@ def export_project() -> flask.Response: return utils_functions.send_file(project_folder, [export_vease_path], filename) - @routes.route( schemas_dict["import_project"]["route"], methods=schemas_dict["import_project"]["methods"], @@ -427,7 +416,6 @@ def import_project() -> flask.Response: data_folder_path: str = flask.current_app.config["DATA_FOLDER_PATH"] - # 423 Locked bypass : remove stopped requests if connection.scoped_session_registry: connection.scoped_session_registry.remove() if connection.engine: diff --git a/tests/test_geode_functions.py b/tests/test_geode_functions.py index dbc8cb70..79d0a1e2 100644 --- a/tests/test_geode_functions.py +++ b/tests/test_geode_functions.py @@ -59,6 +59,6 @@ def test_input_output() -> None: geode_object, os.path.join(os.path.abspath(f"./output"), filename), ) - assert type(saved_files) is list + assert type(saved_files) is list for saved_file in saved_files: - os.remove(saved_file) + os.remove(saved_file) \ No newline at end of file diff --git a/tests/test_models_routes.py b/tests/test_models_routes.py index 379e5b16..4cc35c4f 100644 --- a/tests/test_models_routes.py +++ b/tests/test_models_routes.py @@ -14,7 +14,6 @@ base_dir = os.path.abspath(os.path.dirname(__file__)) data_dir = os.path.join(base_dir, "data") - def test_model_mesh_components(client: FlaskClient, test_id: str) -> None: route = "/opengeodeweb_back/models/vtm_component_indices" @@ -35,7 +34,6 @@ def test_model_mesh_components(client: FlaskClient, test_id: str) -> None: for uuid in uuid_dict.keys(): assert isinstance(uuid, str) - def test_extract_brep_uuids(client: FlaskClient, test_id: str) -> None: route = "/opengeodeweb_back/models/mesh_components" brep_filename = os.path.join(data_dir, "cube.og_brep") @@ -57,7 +55,6 @@ def test_extract_brep_uuids(client: FlaskClient, test_id: str) -> None: uuid_dict = response.get_json()["uuid_dict"] assert isinstance(uuid_dict, dict) - def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: route = "/opengeodeweb_back/export_project" snapshot = { @@ -69,6 +66,41 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: database_root_path = os.path.join(project_folder, "project.db") with open(database_root_path, "wb") as f: f.write(b"test_project_db") + + with get_session() as session: + session.query(Data).delete() + session.commit() + + data1 = Data( + id="test_data_1", + geode_object="BRep", + viewer_object="BRep", + input_file=None, + native_file="test_native.txt", + additional_files=[] + ) + data2 = Data( + id="test_data_2", + geode_object="Section", + viewer_object="Section", + input_file="test_input.txt", + native_file="test_native2.txt", + additional_files=[] + ) + session.add(data1) + session.add(data2) + session.commit() + + data1_dir = os.path.join(project_folder, "test_data_1") + os.makedirs(data1_dir, exist_ok=True) + with open(os.path.join(data1_dir, "test_native.txt"), "w") as f: + f.write("native file content") + + data2_dir = os.path.join(project_folder, "test_data_2") + os.makedirs(data2_dir, exist_ok=True) + with open(os.path.join(data2_dir, "test_input.txt"), "w") as f: + f.write("input file content") + response = client.post(route, json={"snapshot": snapshot, "filename": filename}) assert response.status_code == 200 assert response.headers.get("new-file-name") == filename @@ -77,18 +109,28 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: zip_bytes = response.get_data() tmp_zip_path = tmp_path / filename tmp_zip_path.write_bytes(zip_bytes) + with zipfile.ZipFile(tmp_zip_path, "r") as zip_file: names = zip_file.namelist() assert "snapshot.json" in names parsed = json.loads(zip_file.read("snapshot.json").decode("utf-8")) assert parsed == snapshot assert "project.db" in names + assert "test_data_1/test_native.txt" in names + assert "test_data_2/test_input.txt" in names + with get_session() as session: + data1_updated = session.query(Data).filter_by(id="test_data_1").first() + assert data1_updated.input_file == "test_native.txt" + + data2_updated = session.query(Data).filter_by(id="test_data_2").first() + assert data2_updated.input_file == "test_input.txt" + response.close() + export_path = os.path.join(project_folder, filename) if os.path.exists(export_path): os.remove(export_path) - def test_import_project_route(client: FlaskClient, tmp_path: Path) -> None: route = "/opengeodeweb_back/import_project" snapshot = { @@ -137,7 +179,6 @@ def test_import_project_route(client: FlaskClient, tmp_path: Path) -> None: client.application.config["DATA_FOLDER_PATH"] = original_data_folder - def test_save_viewable_workflow_from_file(client: FlaskClient) -> None: file = os.path.join(data_dir, "cube.og_brep") upload_resp = client.put( @@ -164,7 +205,6 @@ def test_save_viewable_workflow_from_file(client: FlaskClient) -> None: refreshed = Data.get(data_id) assert refreshed is not None - def test_save_viewable_workflow_from_object(client: FlaskClient) -> None: route = "/opengeodeweb_back/create/create_aoi" aoi_data = { @@ -184,4 +224,4 @@ def test_save_viewable_workflow_from_object(client: FlaskClient) -> None: data_id = response.get_json()["id"] assert isinstance(data_id, str) and len(data_id) > 0 assert response.get_json()["geode_object_type"] == "EdgedCurve3D" - assert response.get_json()["viewable_file"].endswith(".vtp") + assert response.get_json()["viewable_file"].endswith(".vtp") \ No newline at end of file From 8f6af11739e0aa1e8088c05875c70b63d60b25c0 Mon Sep 17 00:00:00 2001 From: SpliiT <106495600+SpliiT@users.noreply.github.com> Date: Fri, 12 Dec 2025 11:28:52 +0000 Subject: [PATCH 2/8] Apply prepare changes --- requirements.txt | 1 - .../routes/blueprint_routes.py | 25 +++++++++++++++---- tests/test_geode_functions.py | 4 +-- tests/test_models_routes.py | 12 ++++++--- 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/requirements.txt b/requirements.txt index 31057f2a..08d64bdf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -60,4 +60,3 @@ werkzeug==3.1.2 # flask # flask-cors -opengeodeweb-microservice==1.*,>=1.0.11rc1 diff --git a/src/opengeodeweb_back/routes/blueprint_routes.py b/src/opengeodeweb_back/routes/blueprint_routes.py index 545c96cf..97c04654 100644 --- a/src/opengeodeweb_back/routes/blueprint_routes.py +++ b/src/opengeodeweb_back/routes/blueprint_routes.py @@ -37,6 +37,7 @@ schemas_dict = get_schemas_dict(os.path.join(os.path.dirname(__file__), "schemas")) + @routes.route( schemas_dict["allowed_files"]["route"], methods=schemas_dict["allowed_files"]["methods"], @@ -49,6 +50,7 @@ def allowed_files() -> flask.Response: extensions.add(extension) return flask.make_response({"extensions": list(extensions)}, 200) + @routes.route( schemas_dict["upload_file"]["route"], methods=schemas_dict["upload_file"]["methods"], @@ -63,6 +65,7 @@ def upload_file() -> flask.Response: file.save(os.path.join(UPLOAD_FOLDER, filename)) return flask.make_response({"message": "File uploaded"}, 201) + @routes.route( schemas_dict["allowed_objects"]["route"], methods=schemas_dict["allowed_objects"]["methods"], @@ -88,6 +91,7 @@ def allowed_objects() -> flask.Response: } return flask.make_response({"allowed_objects": allowed_objects}, 200) + @routes.route( schemas_dict["missing_files"]["route"], methods=schemas_dict["missing_files"]["methods"], @@ -126,6 +130,7 @@ def missing_files() -> flask.Response: 200, ) + @routes.route( schemas_dict["geographic_coordinate_systems"]["route"], methods=schemas_dict["geographic_coordinate_systems"]["methods"], @@ -150,6 +155,7 @@ def crs_converter_geographic_coordinate_systems() -> flask.Response: crs_list.append(crs) return flask.make_response({"crs_list": crs_list}, 200) + @routes.route( schemas_dict["inspect_file"]["route"], methods=schemas_dict["inspect_file"]["methods"], @@ -167,6 +173,7 @@ def inspect_file() -> flask.Response: inspection_result = extract_inspector_result(inspection_data) return flask.make_response({"inspection_result": inspection_result}, 200) + def extract_inspector_result(inspection_data: Any) -> object: new_object = {} @@ -194,6 +201,7 @@ def extract_inspector_result(inspection_data: Any) -> object: new_object["issues"] = issues return new_object + @routes.route( schemas_dict["geode_objects_and_output_extensions"]["route"], methods=schemas_dict["geode_objects_and_output_extensions"]["methods"], @@ -215,6 +223,7 @@ def geode_objects_and_output_extensions() -> flask.Response: 200, ) + @routes.route( schemas_dict["save_viewable_file"]["route"], methods=schemas_dict["save_viewable_file"]["methods"], @@ -232,6 +241,7 @@ def save_viewable_file() -> flask.Response: 200, ) + @routes.route( schemas_dict["texture_coordinates"]["route"], methods=schemas_dict["texture_coordinates"]["methods"], @@ -247,6 +257,7 @@ def texture_coordinates() -> flask.Response: texture_coordinates = geode_object.texture_manager().texture_names() return flask.make_response({"texture_coordinates": texture_coordinates}, 200) + @routes.route( schemas_dict["vertex_attribute_names"]["route"], methods=schemas_dict["vertex_attribute_names"]["methods"], @@ -267,6 +278,7 @@ def vertex_attribute_names() -> flask.Response: 200, ) + @routes.route( schemas_dict["cell_attribute_names"]["route"], methods=schemas_dict["cell_attribute_names"]["methods"], @@ -287,6 +299,7 @@ def cell_attribute_names() -> flask.Response: 200, ) + @routes.route( schemas_dict["polygon_attribute_names"]["route"], methods=schemas_dict["polygon_attribute_names"]["methods"], @@ -307,6 +320,7 @@ def polygon_attribute_names() -> flask.Response: 200, ) + @routes.route( schemas_dict["polyhedron_attribute_names"]["route"], methods=schemas_dict["polyhedron_attribute_names"]["methods"], @@ -329,6 +343,7 @@ def polyhedron_attribute_names() -> flask.Response: 200, ) + @routes.route( schemas_dict["ping"]["route"], methods=schemas_dict["ping"]["methods"], @@ -338,12 +353,14 @@ def ping() -> flask.Response: flask.current_app.config.update(LAST_PING_TIME=time.time()) return flask.make_response({"message": "Flask server is running"}, 200) + @routes.route(schemas_dict["kill"]["route"], methods=schemas_dict["kill"]["methods"]) def kill() -> flask.Response: print("Manual server kill, shutting down...", flush=True) os._exit(0) return flask.make_response({"message": "Flask server is dead"}, 200) + @routes.route( schemas_dict["export_project"]["route"], methods=schemas_dict["export_project"]["methods"], @@ -365,12 +382,9 @@ def export_project() -> flask.Response: with get_session() as session: session.query(Data).filter( (Data.input_file == None) | (Data.input_file == "") - ).update( - {Data.input_file: Data.native_file}, - synchronize_session=False - ) + ).update({Data.input_file: Data.native_file}, synchronize_session=False) session.commit() - + rows = session.query(Data.id, Data.input_file, Data.additional_files).all() with zipfile.ZipFile( @@ -400,6 +414,7 @@ def export_project() -> flask.Response: return utils_functions.send_file(project_folder, [export_vease_path], filename) + @routes.route( schemas_dict["import_project"]["route"], methods=schemas_dict["import_project"]["methods"], diff --git a/tests/test_geode_functions.py b/tests/test_geode_functions.py index 79d0a1e2..dbc8cb70 100644 --- a/tests/test_geode_functions.py +++ b/tests/test_geode_functions.py @@ -59,6 +59,6 @@ def test_input_output() -> None: geode_object, os.path.join(os.path.abspath(f"./output"), filename), ) - assert type(saved_files) is list + assert type(saved_files) is list for saved_file in saved_files: - os.remove(saved_file) \ No newline at end of file + os.remove(saved_file) diff --git a/tests/test_models_routes.py b/tests/test_models_routes.py index 4cc35c4f..30f04a3b 100644 --- a/tests/test_models_routes.py +++ b/tests/test_models_routes.py @@ -14,6 +14,7 @@ base_dir = os.path.abspath(os.path.dirname(__file__)) data_dir = os.path.join(base_dir, "data") + def test_model_mesh_components(client: FlaskClient, test_id: str) -> None: route = "/opengeodeweb_back/models/vtm_component_indices" @@ -34,6 +35,7 @@ def test_model_mesh_components(client: FlaskClient, test_id: str) -> None: for uuid in uuid_dict.keys(): assert isinstance(uuid, str) + def test_extract_brep_uuids(client: FlaskClient, test_id: str) -> None: route = "/opengeodeweb_back/models/mesh_components" brep_filename = os.path.join(data_dir, "cube.og_brep") @@ -55,6 +57,7 @@ def test_extract_brep_uuids(client: FlaskClient, test_id: str) -> None: uuid_dict = response.get_json()["uuid_dict"] assert isinstance(uuid_dict, dict) + def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: route = "/opengeodeweb_back/export_project" snapshot = { @@ -77,7 +80,7 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: viewer_object="BRep", input_file=None, native_file="test_native.txt", - additional_files=[] + additional_files=[], ) data2 = Data( id="test_data_2", @@ -85,7 +88,7 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: viewer_object="Section", input_file="test_input.txt", native_file="test_native2.txt", - additional_files=[] + additional_files=[], ) session.add(data1) session.add(data2) @@ -131,6 +134,7 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: if os.path.exists(export_path): os.remove(export_path) + def test_import_project_route(client: FlaskClient, tmp_path: Path) -> None: route = "/opengeodeweb_back/import_project" snapshot = { @@ -179,6 +183,7 @@ def test_import_project_route(client: FlaskClient, tmp_path: Path) -> None: client.application.config["DATA_FOLDER_PATH"] = original_data_folder + def test_save_viewable_workflow_from_file(client: FlaskClient) -> None: file = os.path.join(data_dir, "cube.og_brep") upload_resp = client.put( @@ -205,6 +210,7 @@ def test_save_viewable_workflow_from_file(client: FlaskClient) -> None: refreshed = Data.get(data_id) assert refreshed is not None + def test_save_viewable_workflow_from_object(client: FlaskClient) -> None: route = "/opengeodeweb_back/create/create_aoi" aoi_data = { @@ -224,4 +230,4 @@ def test_save_viewable_workflow_from_object(client: FlaskClient) -> None: data_id = response.get_json()["id"] assert isinstance(data_id, str) and len(data_id) > 0 assert response.get_json()["geode_object_type"] == "EdgedCurve3D" - assert response.get_json()["viewable_file"].endswith(".vtp") \ No newline at end of file + assert response.get_json()["viewable_file"].endswith(".vtp") From 39ca09a7d51f168d4d5c0688daca1a77c3fbd0b2 Mon Sep 17 00:00:00 2001 From: SpliiT Date: Fri, 12 Dec 2025 14:29:51 +0100 Subject: [PATCH 3/8] rechange some tests & functions --- src/opengeodeweb_back/geode_functions.py | 14 +++------- src/opengeodeweb_back/utils_functions.py | 7 +++-- tests/test_utils_functions.py | 33 +++++++++++++++++------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/opengeodeweb_back/geode_functions.py b/src/opengeodeweb_back/geode_functions.py index 4e0785ab..c11d8029 100644 --- a/src/opengeodeweb_back/geode_functions.py +++ b/src/opengeodeweb_back/geode_functions.py @@ -55,8 +55,7 @@ def geode_object_output_extensions( geode_object: GeodeObject, ) -> dict[GeodeObjectType, dict[str, bool]]: results: dict[GeodeObjectType, dict[str, bool]] = {} - current_type = geode_object.geode_object_type() - for mixin_geode_object in geode_objects[current_type].__mro__: + for mixin_geode_object in geode_objects[geode_object.geode_object_type()].__mro__: output_extensions_method = getattr( mixin_geode_object, "output_extensions", None ) @@ -67,16 +66,11 @@ def geode_object_output_extensions( continue object_output_extensions: dict[str, bool] = {} is_saveable_method = getattr(mixin_geode_object, "is_saveable") - target_type = None - if hasattr(mixin_geode_object, "geode_object_type"): - target_type = mixin_geode_object.geode_object_type() - if target_type and target_type != current_type: - continue for output_extension in output_extensions: bool_is_saveable = is_saveable_method( geode_object, f"test.{output_extension}" ) object_output_extensions[output_extension] = bool_is_saveable - if target_type: - results[target_type] = object_output_extensions - return results + if hasattr(mixin_geode_object, "geode_object_type"): + results[mixin_geode_object.geode_object_type()] = object_output_extensions + return results \ No newline at end of file diff --git a/src/opengeodeweb_back/utils_functions.py b/src/opengeodeweb_back/utils_functions.py index 75c99bf0..fecda5f1 100644 --- a/src/opengeodeweb_back/utils_functions.py +++ b/src/opengeodeweb_back/utils_functions.py @@ -212,6 +212,10 @@ def save_all_viewables_and_return_info( data.native_file = os.path.basename(native_files[0]) data.viewable_file = os.path.basename(viewable_path) data.light_viewable_file = os.path.basename(light_path) + + if not data.input_file: + data.input_file = data.native_file + assert data.native_file is not None assert data.viewable_file is not None assert data.light_viewable_file is not None @@ -223,11 +227,10 @@ def save_all_viewables_and_return_info( "viewer_type": data.viewer_object, "binary_light_viewable": binary_light_viewable.decode("utf-8"), "geode_object_type": data.geode_object, - "input_file": data.input_file or "", + "input_file": data.input_file or "", "additional_files": data.additional_files or [], } - def generate_native_viewable_and_light_viewable_from_object( geode_object: GeodeObject, ) -> dict[str, str | list[str]]: diff --git a/tests/test_utils_functions.py b/tests/test_utils_functions.py index 905217b1..34b204cb 100644 --- a/tests/test_utils_functions.py +++ b/tests/test_utils_functions.py @@ -183,16 +183,29 @@ def test_generate_native_viewable_and_light_viewable_from_object( ) ) - assert isinstance(result, dict) - assert isinstance(result["native_file"], str) - assert result["native_file"].startswith("native.") - assert isinstance(result["viewable_file"], str) - assert result["viewable_file"].endswith(".vtm") - assert isinstance(result["id"], str) - assert re.match(r"[0-9a-f]{32}", result["id"]) - assert isinstance(result["viewer_type"], str) - assert isinstance(result["binary_light_viewable"], str) - assert result["input_file"] == "" + assert isinstance(result, dict) + assert isinstance(result["native_file"], str) + assert result["native_file"].startswith("native.") + assert isinstance(result["viewable_file"], str) + assert result["viewable_file"].endswith(".vtm") + assert isinstance(result["id"], str) + assert re.match(r"[0-9a-f]{32}", result["id"]) + assert isinstance(result["viewer_type"], str) + assert isinstance(result["binary_light_viewable"], str) + assert result["binary_light_viewable"].startswith('') + + assert result["input_file"] == result["native_file"] + + data = Data.get(result["id"]) + assert data is not None + assert data.input_file == data.native_file + assert data.light_viewable_file is not None + assert data.light_viewable_file.endswith('.vtp') + + data_path = os.path.join(app.config["DATA_FOLDER_PATH"], result["id"]) + assert os.path.exists(os.path.join(data_path, result["native_file"])) + assert os.path.exists(os.path.join(data_path, result["viewable_file"])) + assert os.path.exists(os.path.join(data_path, data.light_viewable_file)) def test_generate_native_viewable_and_light_viewable_from_file( From 56a5a0d32b1806ee210ee2bcdd507e5c99f21081 Mon Sep 17 00:00:00 2001 From: SpliiT <106495600+SpliiT@users.noreply.github.com> Date: Fri, 12 Dec 2025 13:30:32 +0000 Subject: [PATCH 4/8] Apply prepare changes --- src/opengeodeweb_back/geode_functions.py | 2 +- src/opengeodeweb_back/utils_functions.py | 7 ++++--- tests/test_utils_functions.py | 8 ++++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/opengeodeweb_back/geode_functions.py b/src/opengeodeweb_back/geode_functions.py index c11d8029..afcd2e1c 100644 --- a/src/opengeodeweb_back/geode_functions.py +++ b/src/opengeodeweb_back/geode_functions.py @@ -73,4 +73,4 @@ def geode_object_output_extensions( object_output_extensions[output_extension] = bool_is_saveable if hasattr(mixin_geode_object, "geode_object_type"): results[mixin_geode_object.geode_object_type()] = object_output_extensions - return results \ No newline at end of file + return results diff --git a/src/opengeodeweb_back/utils_functions.py b/src/opengeodeweb_back/utils_functions.py index fecda5f1..1264690d 100644 --- a/src/opengeodeweb_back/utils_functions.py +++ b/src/opengeodeweb_back/utils_functions.py @@ -212,10 +212,10 @@ def save_all_viewables_and_return_info( data.native_file = os.path.basename(native_files[0]) data.viewable_file = os.path.basename(viewable_path) data.light_viewable_file = os.path.basename(light_path) - + if not data.input_file: data.input_file = data.native_file - + assert data.native_file is not None assert data.viewable_file is not None assert data.light_viewable_file is not None @@ -227,10 +227,11 @@ def save_all_viewables_and_return_info( "viewer_type": data.viewer_object, "binary_light_viewable": binary_light_viewable.decode("utf-8"), "geode_object_type": data.geode_object, - "input_file": data.input_file or "", + "input_file": data.input_file or "", "additional_files": data.additional_files or [], } + def generate_native_viewable_and_light_viewable_from_object( geode_object: GeodeObject, ) -> dict[str, str | list[str]]: diff --git a/tests/test_utils_functions.py b/tests/test_utils_functions.py index 34b204cb..5da9bbd5 100644 --- a/tests/test_utils_functions.py +++ b/tests/test_utils_functions.py @@ -193,15 +193,15 @@ def test_generate_native_viewable_and_light_viewable_from_object( assert isinstance(result["viewer_type"], str) assert isinstance(result["binary_light_viewable"], str) assert result["binary_light_viewable"].startswith('') - + assert result["input_file"] == result["native_file"] - + data = Data.get(result["id"]) assert data is not None assert data.input_file == data.native_file assert data.light_viewable_file is not None - assert data.light_viewable_file.endswith('.vtp') - + assert data.light_viewable_file.endswith(".vtp") + data_path = os.path.join(app.config["DATA_FOLDER_PATH"], result["id"]) assert os.path.exists(os.path.join(data_path, result["native_file"])) assert os.path.exists(os.path.join(data_path, result["viewable_file"])) From b05f561ad076c630f00ea86599d0f56f8aee6317 Mon Sep 17 00:00:00 2001 From: SpliiT Date: Fri, 12 Dec 2025 14:33:01 +0100 Subject: [PATCH 5/8] go back old version --- src/opengeodeweb_back/routes/blueprint_routes.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/opengeodeweb_back/routes/blueprint_routes.py b/src/opengeodeweb_back/routes/blueprint_routes.py index 97c04654..90450481 100644 --- a/src/opengeodeweb_back/routes/blueprint_routes.py +++ b/src/opengeodeweb_back/routes/blueprint_routes.py @@ -380,11 +380,6 @@ def export_project() -> flask.Response: export_vease_path = os.path.join(project_folder, filename) with get_session() as session: - session.query(Data).filter( - (Data.input_file == None) | (Data.input_file == "") - ).update({Data.input_file: Data.native_file}, synchronize_session=False) - session.commit() - rows = session.query(Data.id, Data.input_file, Data.additional_files).all() with zipfile.ZipFile( From 7a5f4699f4e07472efadf8664c01caf0ef361956 Mon Sep 17 00:00:00 2001 From: SpliiT Date: Fri, 12 Dec 2025 14:35:09 +0100 Subject: [PATCH 6/8] go back old version --- src/opengeodeweb_back/routes/blueprint_routes.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/opengeodeweb_back/routes/blueprint_routes.py b/src/opengeodeweb_back/routes/blueprint_routes.py index 90450481..71323162 100644 --- a/src/opengeodeweb_back/routes/blueprint_routes.py +++ b/src/opengeodeweb_back/routes/blueprint_routes.py @@ -29,6 +29,7 @@ routes = flask.Blueprint("routes", __name__, url_prefix="/opengeodeweb_back") + routes.register_blueprint( blueprint_models.routes, url_prefix=blueprint_models.routes.url_prefix, @@ -426,6 +427,7 @@ def import_project() -> flask.Response: data_folder_path: str = flask.current_app.config["DATA_FOLDER_PATH"] + # 423 Locked bypass : remove stopped requests if connection.scoped_session_registry: connection.scoped_session_registry.remove() if connection.engine: @@ -499,4 +501,4 @@ def import_project() -> flask.Response: snapshot = flask.json.loads(raw) except KeyError: snapshot = {} - return flask.make_response({"snapshot": snapshot}, 200) + return flask.make_response({"snapshot": snapshot}, 200) \ No newline at end of file From cb04e64bddd4f2fcc27dabe81749df04f02a83d6 Mon Sep 17 00:00:00 2001 From: SpliiT <106495600+SpliiT@users.noreply.github.com> Date: Fri, 12 Dec 2025 13:35:49 +0000 Subject: [PATCH 7/8] Apply prepare changes --- src/opengeodeweb_back/routes/blueprint_routes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengeodeweb_back/routes/blueprint_routes.py b/src/opengeodeweb_back/routes/blueprint_routes.py index 71323162..654c1116 100644 --- a/src/opengeodeweb_back/routes/blueprint_routes.py +++ b/src/opengeodeweb_back/routes/blueprint_routes.py @@ -501,4 +501,4 @@ def import_project() -> flask.Response: snapshot = flask.json.loads(raw) except KeyError: snapshot = {} - return flask.make_response({"snapshot": snapshot}, 200) \ No newline at end of file + return flask.make_response({"snapshot": snapshot}, 200) From 03741e78a6721345de97d989d2041527cf8bcb67 Mon Sep 17 00:00:00 2001 From: SpliiT Date: Fri, 12 Dec 2025 14:42:53 +0100 Subject: [PATCH 8/8] add input_file field --- tests/test_models_routes.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/test_models_routes.py b/tests/test_models_routes.py index 30f04a3b..c31ae710 100644 --- a/tests/test_models_routes.py +++ b/tests/test_models_routes.py @@ -78,7 +78,7 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: id="test_data_1", geode_object="BRep", viewer_object="BRep", - input_file=None, + input_file="test_native.txt", native_file="test_native.txt", additional_files=[], ) @@ -121,12 +121,6 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None: assert "project.db" in names assert "test_data_1/test_native.txt" in names assert "test_data_2/test_input.txt" in names - with get_session() as session: - data1_updated = session.query(Data).filter_by(id="test_data_1").first() - assert data1_updated.input_file == "test_native.txt" - - data2_updated = session.query(Data).filter_by(id="test_data_2").first() - assert data2_updated.input_file == "test_input.txt" response.close()