diff --git a/requirements.txt b/requirements.txt index b13f74df..b058eea8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.10 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile requirements.in @@ -14,18 +14,18 @@ blinker==1.9.0 # via flask click==8.1.8 # via flask -flask[async]==3.1.0 +flask[async]==3.1.1 # via # -r requirements.in # flask-cors flask-cors==5.0.1 # via -r requirements.in -geode-background==9.2.4 +geode-background==9.2.6 # via # geode-explicit # geode-implicit # geode-simplex -geode-common==33.8.1 +geode-common==33.8.4 # via # -r requirements.in # geode-background @@ -35,22 +35,22 @@ geode-common==33.8.1 # geode-numerics # geode-simplex # geode-viewables -geode-conversion==6.2.13 +geode-conversion==6.3.0 # via # geode-explicit # geode-implicit -geode-explicit==6.1.39 +geode-explicit==6.2.0 # via # -r requirements.in # geode-implicit -geode-implicit==3.7.10 +geode-implicit==3.9.1 # via -r requirements.in -geode-numerics==6.0.6 +geode-numerics==6.2.0 # via # -r requirements.in # geode-implicit # geode-simplex -geode-simplex==9.3.2 +geode-simplex==9.4.0 # via # -r requirements.in # geode-implicit @@ -66,9 +66,10 @@ jsonschema-specifications==2025.4.1 # via jsonschema markupsafe==3.0.2 # via + # flask # jinja2 # werkzeug -opengeode-core==15.18.0 +opengeode-core==15.19.1 # via # -r requirements.in # geode-background @@ -83,17 +84,17 @@ opengeode-core==15.18.0 # opengeode-geosciencesio # opengeode-inspector # opengeode-io -opengeode-geosciences==8.4.7 +opengeode-geosciences==8.4.8 # via # -r requirements.in # geode-implicit # geode-viewables # opengeode-geosciencesio -opengeode-geosciencesio==5.3.9 +opengeode-geosciencesio==5.3.10 # via # -r requirements.in # geode-implicit -opengeode-inspector==6.4.1 +opengeode-inspector==6.5.0 # via # -r requirements.in # geode-explicit @@ -109,14 +110,12 @@ referencing==0.36.2 # via # jsonschema # jsonschema-specifications -rpds-py==0.24.0 +rpds-py==0.25.0 # via # jsonschema # referencing typing-extensions==4.13.2 - # via - # asgiref - # referencing + # via referencing werkzeug==3.1.3 # via # -r requirements.in diff --git a/src/opengeodeweb_back/geode_functions.py b/src/opengeodeweb_back/geode_functions.py index 957847b8..1e17aa82 100644 --- a/src/opengeodeweb_back/geode_functions.py +++ b/src/opengeodeweb_back/geode_functions.py @@ -101,6 +101,12 @@ def save_viewable(geode_object: str, data, folder_absolute_path: str, id: str): ) +def save_light_viewable(geode_object: str, data, folder_absolute_path: str, id: str): + return geode_object_value(geode_object)["save_light_viewable"]( + data, os.path.join(folder_absolute_path, id) + ) + + def geode_object_input_extensions(geode_object: str): geode_object_input_list_creators = input_factory(geode_object).list_creators() geode_object_input_list_creators.sort() diff --git a/src/opengeodeweb_back/geode_objects.py b/src/opengeodeweb_back/geode_objects.py index 6912c2f5..ecda47a0 100644 --- a/src/opengeodeweb_back/geode_objects.py +++ b/src/opengeodeweb_back/geode_objects.py @@ -40,6 +40,7 @@ def geode_objects_dict(): "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_brep, + "save_light_viewable": g_v.save_light_viewable_brep, "inspector": og_inspector.inspect_brep, }, "CrossSection": { @@ -62,6 +63,7 @@ def geode_objects_dict(): "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_cross_section, + "save_light_viewable": g_v.save_light_viewable_cross_section, "inspector": og_inspector.inspect_section, }, "EdgedCurve2D": { @@ -84,6 +86,7 @@ def geode_objects_dict(): "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_edged_curve2D, + "save_light_viewable": g_v.save_light_viewable_edged_curve2D, "inspector": og_inspector.inspect_edged_curve2D, }, "EdgedCurve3D": { @@ -106,6 +109,7 @@ def geode_objects_dict(): "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_edged_curve3D, + "save_light_viewable": g_v.save_light_viewable_edged_curve3D, "inspector": og_inspector.inspect_edged_curve3D, }, "Graph": { @@ -142,6 +146,7 @@ def geode_objects_dict(): "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_hybrid_solid3D, + "save_light_viewable": g_v.save_light_viewable_hybrid_solid3D, "inspector": og_inspector.inspect_solid3D, }, "ImplicitCrossSection": { @@ -164,6 +169,7 @@ def geode_objects_dict(): "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_implicit_cross_section, + "save_light_viewable": g_v.save_light_viewable_implicit_cross_section, "inspector": og_inspector.inspect_section, }, "ImplicitStructuralModel": { @@ -186,6 +192,7 @@ def geode_objects_dict(): "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_implicit_structural_model, + "save_light_viewable": g_v.save_light_viewable_implicit_structural_model, "inspector": og_inspector.inspect_brep, }, "LightRegularGrid2D": { @@ -201,7 +208,8 @@ def geode_objects_dict(): "elements": [points, polygons], "is_3D": False, "is_viewable": True, - "save_viewable": g_v.save_viewable_light_regular_grid2D, + "save_viewable": g_v.save_light_viewable_light_regular_grid2D, + "save_light_viewable": g_v.save_light_viewable_light_regular_grid2D, }, "LightRegularGrid3D": { "class": og.LightRegularGrid3D, @@ -217,6 +225,7 @@ def geode_objects_dict(): "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_light_regular_grid3D, + "save_light_viewable": g_v.save_light_viewable_light_regular_grid3D, }, "PointSet2D": { "class": og.PointSet2D, @@ -238,6 +247,7 @@ def geode_objects_dict(): "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_point_set2D, + "save_light_viewable": g_v.save_light_viewable_point_set2D, "inspector": og_inspector.inspect_point_set2D, }, "PointSet3D": { @@ -260,6 +270,7 @@ def geode_objects_dict(): "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_point_set3D, + "save_light_viewable": g_v.save_light_viewable_point_set3D, "inspector": og_inspector.inspect_point_set3D, }, "PolygonalSurface2D": { @@ -282,6 +293,7 @@ def geode_objects_dict(): "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_polygonal_surface2D, + "save_light_viewable": g_v.save_light_viewable_polygonal_surface2D, "inspector": og_inspector.inspect_surface2D, }, "PolygonalSurface3D": { @@ -304,6 +316,7 @@ def geode_objects_dict(): "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_polygonal_surface3D, + "save_light_viewable": g_v.save_light_viewable_polygonal_surface3D, "inspector": og_inspector.inspect_surface3D, }, "PolyhedralSolid3D": { @@ -326,6 +339,7 @@ def geode_objects_dict(): "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_polyhedral_solid3D, + "save_light_viewable": g_v.save_light_viewable_polyhedral_solid3D, "inspector": og_inspector.inspect_solid3D, }, "RasterImage2D": { @@ -376,6 +390,7 @@ def geode_objects_dict(): "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_regular_grid2D, + "save_light_viewable": g_v.save_light_viewable_regular_grid2D, }, "RegularGrid3D": { "class": og.RegularGrid3D, @@ -397,6 +412,7 @@ def geode_objects_dict(): "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_regular_grid3D, + "save_light_viewable": g_v.save_light_viewable_regular_grid3D, }, "Section": { "class": og.Section, @@ -417,6 +433,7 @@ def geode_objects_dict(): "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_section, + "save_light_viewable": g_v.save_light_viewable_section, "inspector": og_inspector.inspect_section, }, "StructuralModel": { @@ -439,6 +456,7 @@ def geode_objects_dict(): "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_structural_model, + "save_light_viewable": g_v.save_light_viewable_structural_model, "inspector": og_inspector.inspect_brep, }, "TetrahedralSolid3D": { @@ -461,6 +479,7 @@ def geode_objects_dict(): "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_tetrahedral_solid3D, + "save_light_viewable": g_v.save_light_viewable_tetrahedral_solid3D, "inspector": og_inspector.inspect_solid3D, }, "TriangulatedSurface2D": { @@ -483,6 +502,7 @@ def geode_objects_dict(): "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_triangulated_surface2D, + "save_light_viewable": g_v.save_light_viewable_triangulated_surface2D, "inspector": og_inspector.inspect_surface2D, }, "TriangulatedSurface3D": { @@ -505,6 +525,7 @@ def geode_objects_dict(): "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_triangulated_surface3D, + "save_light_viewable": g_v.save_light_viewable_triangulated_surface3D, "inspector": og_inspector.inspect_surface3D, }, "VertexSet": { diff --git a/src/opengeodeweb_back/routes/blueprint_routes.py b/src/opengeodeweb_back/routes/blueprint_routes.py index b825cde7..9daf75aa 100644 --- a/src/opengeodeweb_back/routes/blueprint_routes.py +++ b/src/opengeodeweb_back/routes/blueprint_routes.py @@ -260,6 +260,18 @@ def save_viewable_file(): saved_viewable_file_path = geode_functions.save_viewable( flask.request.json["input_geode_object"], data, DATA_FOLDER_PATH, generated_id ) + + saved_light_viewable_file_path = geode_functions.save_light_viewable( + flask.request.json["input_geode_object"], + data, + DATA_FOLDER_PATH, + "light_" + generated_id, + ) + + f = open(saved_light_viewable_file_path, "rb") + binary_light_viewable = f.read() + f.close() + geode_functions.save( flask.request.json["input_geode_object"], data, @@ -280,6 +292,7 @@ def save_viewable_file(): "viewable_file_name": viewable_file_name, "id": generated_id, "object_type": object_type, + "binary_light_viewable": str(binary_light_viewable, "utf-8"), }, 200, ) diff --git a/tests/test_geode_functions.py b/tests/test_geode_functions.py index fe7a9320..70ca4494 100644 --- a/tests/test_geode_functions.py +++ b/tests/test_geode_functions.py @@ -87,8 +87,8 @@ def test_load(): if geode_functions.is_loadable(geode_object, file_absolute_path): data = geode_functions.load(geode_object, file_absolute_path) data_name = data.name() + uu_id = str(uuid.uuid4()).replace("-", "") if "save_viewable" in value: - uu_id = str(uuid.uuid4()).replace("-", "") viewable_file_path = geode_functions.save_viewable( geode_object, data, @@ -96,6 +96,15 @@ def test_load(): data_name, ) os.remove(viewable_file_path) + + if "save_light_viewable" in value: + light_viewable_file_path = geode_functions.save_light_viewable( + geode_object, + data, + os.path.abspath(f"./output"), + data_name, + ) + os.remove(light_viewable_file_path) geode_objects_and_output_extensions = ( geode_functions.geode_objects_output_extensions(geode_object, data) ) diff --git a/tests/test_routes.py b/tests/test_routes.py index bd44c2da..ae41b17a 100644 --- a/tests/test_routes.py +++ b/tests/test_routes.py @@ -44,10 +44,10 @@ def get_full_data(): test_utils.test_route_wrong_params(client, route, get_full_data) -def test_upload_file(client): +def test_upload_file(client, filename="corbi.og_brep"): response = client.put( f"/upload_file", - data={"file": FileStorage(open("./tests/corbi.og_brep", "rb"))}, + data={"file": FileStorage(open(f"./tests/{filename}", "rb"))}, ) assert response.status_code == 201 @@ -139,6 +139,8 @@ def get_full_data(): def test_save_viewable_file(client): + + test_upload_file(client, filename="corbi.og_brep") route = f"/save_viewable_file" def get_full_data(): @@ -161,6 +163,8 @@ def get_full_data(): object_type = response.json["object_type"] assert type(object_type) is str assert object_type in ["model", "mesh"] + binary_light_viewable = response.json["binary_light_viewable"] + assert type(binary_light_viewable) is str # Test all params test_utils.test_route_wrong_params(client, route, get_full_data)