OpenGeodeWeb-Back 6.2.0rc2__tar.gz → 6.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. {opengeodeweb_back-6.2.0rc2/src/OpenGeodeWeb_Back.egg-info → opengeodeweb_back-6.3.0}/PKG-INFO +2 -2
  2. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/pyproject.toml +1 -1
  3. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/requirements.txt +1 -1
  4. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0/src/OpenGeodeWeb_Back.egg-info}/PKG-INFO +2 -2
  5. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt +2 -0
  6. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/OpenGeodeWeb_Back.egg-info/requires.txt +1 -1
  7. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/blueprint_routes.py +55 -19
  8. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/__init__.py +1 -0
  9. opengeodeweb_back-6.3.0/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.json +17 -0
  10. opengeodeweb_back-6.3.0/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.py +10 -0
  11. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/utils_functions.py +3 -35
  12. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/tests/test_models_routes.py +8 -12
  13. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/tests/test_routes.py +45 -6
  14. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/tests/test_utils_functions.py +2 -16
  15. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/LICENSE +0 -0
  16. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/README.md +0 -0
  17. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/setup.cfg +0 -0
  18. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/OpenGeodeWeb_Back.egg-info/dependency_links.txt +0 -0
  19. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/OpenGeodeWeb_Back.egg-info/entry_points.txt +0 -0
  20. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/OpenGeodeWeb_Back.egg-info/top_level.txt +0 -0
  21. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/__init__.py +0 -0
  22. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/app.py +0 -0
  23. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/app_config.py +0 -0
  24. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_functions.py +0 -0
  25. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/__init__.py +0 -0
  26. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_brep.py +0 -0
  27. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_cross_section.py +0 -0
  28. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_edged_curve2d.py +0 -0
  29. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_edged_curve3d.py +0 -0
  30. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_graph.py +0 -0
  31. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_grid2d.py +0 -0
  32. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_grid3d.py +0 -0
  33. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_hybrid_solid3d.py +0 -0
  34. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_implicit_cross_section.py +0 -0
  35. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_implicit_structural_model.py +0 -0
  36. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid2d.py +0 -0
  37. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid3d.py +0 -0
  38. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_mesh.py +0 -0
  39. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_model.py +0 -0
  40. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_object.py +0 -0
  41. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_point_set2d.py +0 -0
  42. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_point_set3d.py +0 -0
  43. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface2d.py +0 -0
  44. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface3d.py +0 -0
  45. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_polyhedral_solid3d.py +0 -0
  46. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_raster_image2d.py +0 -0
  47. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py +0 -0
  48. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_regular_grid2d.py +0 -0
  49. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_regular_grid3d.py +0 -0
  50. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_section.py +0 -0
  51. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_solid_mesh3d.py +0 -0
  52. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_structural_model.py +0 -0
  53. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py +0 -0
  54. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_surface_mesh3d.py +0 -0
  55. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_tetrahedral_solid3d.py +0 -0
  56. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface2d.py +0 -0
  57. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface3d.py +0 -0
  58. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/geode_vertex_set.py +0 -0
  59. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/geode_objects/types.py +0 -0
  60. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/py.typed +0 -0
  61. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/create/blueprint_create.py +0 -0
  62. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/create/schemas/__init__.py +0 -0
  63. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/create/schemas/point.json +0 -0
  64. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/create/schemas/point.py +0 -0
  65. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/models/blueprint_models.py +0 -0
  66. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/models/schemas/__init__.py +0 -0
  67. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/models/schemas/model_components.json +0 -0
  68. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/models/schemas/model_components.py +0 -0
  69. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/allowed_files.json +0 -0
  70. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/allowed_files.py +0 -0
  71. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/allowed_objects.json +0 -0
  72. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/allowed_objects.py +0 -0
  73. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.json +0 -0
  74. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.py +0 -0
  75. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.json +0 -0
  76. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.py +0 -0
  77. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/export_project.json +0 -0
  78. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/export_project.py +0 -0
  79. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json +0 -0
  80. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.py +0 -0
  81. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json +0 -0
  82. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.py +0 -0
  83. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/import_extension.json +0 -0
  84. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/import_extension.py +0 -0
  85. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/import_project.json +0 -0
  86. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/import_project.py +0 -0
  87. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/inspect_file.json +0 -0
  88. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/inspect_file.py +0 -0
  89. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/kill.json +0 -0
  90. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/kill.py +0 -0
  91. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/missing_files.json +0 -0
  92. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/missing_files.py +0 -0
  93. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/ping.json +0 -0
  94. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/ping.py +0 -0
  95. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.json +0 -0
  96. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.py +0 -0
  97. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.json +0 -0
  98. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.py +0 -0
  99. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/save_viewable_file.json +0 -0
  100. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/save_viewable_file.py +0 -0
  101. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/texture_coordinates.json +0 -0
  102. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/texture_coordinates.py +0 -0
  103. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/upload_file.json +0 -0
  104. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/upload_file.py +0 -0
  105. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.json +0 -0
  106. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.py +0 -0
  107. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/src/opengeodeweb_back/test_utils.py +0 -0
  108. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/tests/test_create_routes.py +0 -0
  109. {opengeodeweb_back-6.2.0rc2 → opengeodeweb_back-6.3.0}/tests/test_geode_functions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 6.2.0rc2
3
+ Version: 6.3.0
4
4
  Summary: OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem
5
5
  Author-email: Geode-solutions <team-web@geode-solutions.com>
6
6
  Project-URL: Homepage, https://github.com/Geode-solutions/OpenGeodeWeb-Back
@@ -27,7 +27,7 @@ Requires-Dist: opengeode-geosciencesio==5.8.10
27
27
  Requires-Dist: opengeode-inspector==6.8.17
28
28
  Requires-Dist: opengeode-io==7.4.8
29
29
  Requires-Dist: werkzeug==3.1.2
30
- Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.14
30
+ Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.15
31
31
  Dynamic: license-file
32
32
 
33
33
  <h1 align="center">OpenGeodeWeb-Back<sup><i>by Geode-solutions</i></sup></h1>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "OpenGeodeWeb-Back"
7
- version = "6.2.0-rc.2"
7
+ version = "6.3.0"
8
8
  dynamic = ["dependencies"]
9
9
  authors = [{ name = "Geode-solutions", email = "team-web@geode-solutions.com" }]
10
10
  description = "OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem"
@@ -60,4 +60,4 @@ werkzeug==3.1.2
60
60
  # flask
61
61
  # flask-cors
62
62
 
63
- opengeodeweb-microservice==1.*,>=1.0.14
63
+ opengeodeweb-microservice==1.*,>=1.0.15
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 6.2.0rc2
3
+ Version: 6.3.0
4
4
  Summary: OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem
5
5
  Author-email: Geode-solutions <team-web@geode-solutions.com>
6
6
  Project-URL: Homepage, https://github.com/Geode-solutions/OpenGeodeWeb-Back
@@ -27,7 +27,7 @@ Requires-Dist: opengeode-geosciencesio==5.8.10
27
27
  Requires-Dist: opengeode-inspector==6.8.17
28
28
  Requires-Dist: opengeode-io==7.4.8
29
29
  Requires-Dist: werkzeug==3.1.2
30
- Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.14
30
+ Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.15
31
31
  Dynamic: license-file
32
32
 
33
33
  <h1 align="center">OpenGeodeWeb-Back<sup><i>by Geode-solutions</i></sup></h1>
@@ -70,6 +70,8 @@ src/opengeodeweb_back/routes/schemas/edge_attribute_names.json
70
70
  src/opengeodeweb_back/routes/schemas/edge_attribute_names.py
71
71
  src/opengeodeweb_back/routes/schemas/export_project.json
72
72
  src/opengeodeweb_back/routes/schemas/export_project.py
73
+ src/opengeodeweb_back/routes/schemas/geode_object_inheritance.json
74
+ src/opengeodeweb_back/routes/schemas/geode_object_inheritance.py
73
75
  src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json
74
76
  src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.py
75
77
  src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json
@@ -14,4 +14,4 @@ opengeode-geosciencesio==5.8.10
14
14
  opengeode-inspector==6.8.17
15
15
  opengeode-io==7.4.8
16
16
  werkzeug==3.1.2
17
- opengeodeweb-microservice==1.*,>=1.0.14
17
+ opengeodeweb-microservice==1.*,>=1.0.15
@@ -426,7 +426,7 @@ def export_project() -> flask.Response:
426
426
  export_vease_path = os.path.join(project_folder, filename)
427
427
 
428
428
  with get_session() as session:
429
- rows = session.query(Data.id, Data.input_file, Data.additional_files).all()
429
+ rows = session.query(Data.id, Data.native_file).all()
430
430
 
431
431
  with zipfile.ZipFile(
432
432
  export_vease_path, "w", compression=zipfile.ZIP_DEFLATED
@@ -435,21 +435,12 @@ def export_project() -> flask.Response:
435
435
  if os.path.isfile(database_root_path):
436
436
  zip_file.write(database_root_path, "project.db")
437
437
 
438
- for data_id, input_file, additional_files in rows:
438
+ for data_id, native_file in rows:
439
439
  base_dir = os.path.join(project_folder, data_id)
440
440
 
441
- input_path = os.path.join(base_dir, str(input_file))
442
- if os.path.isfile(input_path):
443
- zip_file.write(input_path, os.path.join(data_id, str(input_file)))
444
-
445
- for relative_path in (
446
- additional_files if isinstance(additional_files, list) else []
447
- ):
448
- additional_path = os.path.join(base_dir, relative_path)
449
- if os.path.isfile(additional_path):
450
- zip_file.write(
451
- additional_path, os.path.join(data_id, relative_path)
452
- )
441
+ native_path = os.path.join(base_dir, str(native_file))
442
+ if os.path.isfile(native_path):
443
+ zip_file.write(native_path, os.path.join(data_id, str(native_file)))
453
444
 
454
445
  zip_file.writestr("snapshot.json", flask.json.dumps(params.snapshot))
455
446
 
@@ -524,17 +515,17 @@ def import_project() -> flask.Response:
524
515
  if os.path.isfile(vpath):
525
516
  continue
526
517
 
527
- input_file = str(data.input_file or "")
528
- if not input_file:
518
+ native_file = str(data.native_file or "")
519
+ if not native_file:
529
520
  continue
530
521
 
531
- input_full = geode_functions.data_file_path(data.id, input_file)
532
- if not os.path.isfile(input_full):
522
+ native_full = geode_functions.data_file_path(data.id, native_file)
523
+ if not os.path.isfile(native_full):
533
524
  continue
534
525
 
535
526
  geode_object = geode_functions.geode_object_from_string(
536
527
  data.geode_object
537
- ).load(input_full)
528
+ ).load(native_full)
538
529
  utils_functions.save_all_viewables_and_return_info(
539
530
  geode_object, data, data_path
540
531
  )
@@ -617,3 +608,48 @@ def import_extension() -> flask.Response:
617
608
  },
618
609
  200,
619
610
  )
611
+
612
+
613
+ @routes.route(
614
+ schemas_dict["geode_object_inheritance"]["route"],
615
+ methods=schemas_dict["geode_object_inheritance"]["methods"],
616
+ )
617
+ def geode_object_inheritance() -> flask.Response:
618
+ json_data = utils_functions.validate_request(
619
+ flask.request, schemas_dict["geode_object_inheritance"]
620
+ )
621
+ params = schemas.GeodeObjectInheritance.from_dict(json_data)
622
+ geode_object_type = params.geode_object_type
623
+ target_class = geode_functions.geode_object_from_string(geode_object_type)
624
+
625
+ def get_all_bases(geode_class: type) -> set[type]:
626
+ bases = set()
627
+ for base_class in geode_class.__bases__:
628
+ if base_class is not object:
629
+ bases.add(base_class)
630
+ bases.update(get_all_bases(base_class))
631
+ return bases
632
+
633
+ def get_all_subclasses(geode_class: type) -> set[type]:
634
+ subclasses = set()
635
+ for subclass_class in geode_class.__subclasses__():
636
+ subclasses.add(subclass_class)
637
+ subclasses.update(get_all_subclasses(subclass_class))
638
+ return subclasses
639
+
640
+ # Extract all related Geode classes (parents and children)
641
+ base_classes = get_all_bases(target_class)
642
+ subclass_classes = get_all_subclasses(target_class)
643
+
644
+ # Filter GeodeObjectType to only include registered related objects, excluding target
645
+ parents = []
646
+ children = []
647
+ for geode_object_type_str, geode_class in geode_objects.items():
648
+ if geode_class == target_class:
649
+ continue
650
+ if geode_class in base_classes:
651
+ parents.append(geode_object_type_str)
652
+ if geode_class in subclass_classes:
653
+ children.append(geode_object_type_str)
654
+
655
+ return flask.make_response({"parents": parents, "children": children}, 200)
@@ -12,6 +12,7 @@ from .import_project import *
12
12
  from .import_extension import *
13
13
  from .geographic_coordinate_systems import *
14
14
  from .geode_objects_and_output_extensions import *
15
+ from .geode_object_inheritance import *
15
16
  from .export_project import *
16
17
  from .edge_attribute_names import *
17
18
  from .cell_attribute_names import *
@@ -0,0 +1,17 @@
1
+ {
2
+ "route": "/geode_object_inheritance",
3
+ "methods": [
4
+ "POST"
5
+ ],
6
+ "type": "object",
7
+ "properties": {
8
+ "geode_object_type": {
9
+ "type": "string",
10
+ "minLength": 1
11
+ }
12
+ },
13
+ "required": [
14
+ "geode_object_type"
15
+ ],
16
+ "additionalProperties": false
17
+ }
@@ -0,0 +1,10 @@
1
+ from dataclasses_json import DataClassJsonMixin
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class GeodeObjectInheritance(DataClassJsonMixin):
7
+ def __post_init__(self) -> None:
8
+ print(self, flush=True)
9
+
10
+ geode_object_type: str
@@ -212,9 +212,6 @@ def save_all_viewables_and_return_info(
212
212
  data.viewable_file = os.path.basename(viewable_path)
213
213
  data.light_viewable_file = os.path.basename(light_path)
214
214
 
215
- if not data.input_file:
216
- data.input_file = data.native_file
217
-
218
215
  assert data.native_file is not None
219
216
  assert data.viewable_file is not None
220
217
  assert data.light_viewable_file is not None
@@ -226,8 +223,6 @@ def save_all_viewables_and_return_info(
226
223
  "viewer_type": data.viewer_object,
227
224
  "binary_light_viewable": binary_light_viewable.decode("utf-8"),
228
225
  "geode_object_type": data.geode_object,
229
- "input_file": data.input_file or "",
230
- "additional_files": data.additional_files or [],
231
226
  }
232
227
 
233
228
 
@@ -251,36 +246,9 @@ def generate_native_viewable_and_light_viewable_from_file(
251
246
  geode_object=geode_object_type,
252
247
  viewer_object=generic_geode_object.viewer_type(),
253
248
  viewer_elements_type=generic_geode_object.viewer_elements_type(),
254
- input_file=input_file,
255
249
  )
256
-
257
250
  data_path = create_data_folder_from_id(data.id)
258
-
259
251
  full_input_filename = geode_functions.upload_file_path(input_file)
260
- copied_full_path = os.path.join(
261
- data_path, werkzeug.utils.secure_filename(input_file)
262
- )
263
- shutil.copy2(full_input_filename, copied_full_path)
264
-
265
- additional_files_copied: list[str] = []
266
- additional = generic_geode_object.additional_files(full_input_filename)
267
- for additional_file in additional.mandatory_files + additional.optional_files:
268
- if additional_file.is_missing:
269
- continue
270
- source_path = os.path.join(
271
- os.path.dirname(full_input_filename), additional_file.filename
272
- )
273
- if not os.path.exists(source_path):
274
- continue
275
- dest_path = os.path.join(data_path, additional_file.filename)
276
- os.makedirs(os.path.dirname(dest_path), exist_ok=True)
277
- shutil.copy2(source_path, dest_path)
278
- additional_files_copied.append(additional_file.filename)
279
-
280
- geode_object = generic_geode_object.load(copied_full_path)
281
- data.additional_files = additional_files_copied
282
- return save_all_viewables_and_return_info(
283
- geode_object,
284
- data,
285
- data_path,
286
- )
252
+ geode_object = generic_geode_object.load(full_input_filename)
253
+ geode_object.builder().set_name(input_file)
254
+ return save_all_viewables_and_return_info(geode_object, data, data_path)
@@ -77,18 +77,14 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None:
77
77
  geode_object="BRep",
78
78
  viewer_object="BRep",
79
79
  viewer_elements_type="default",
80
- input_file="test_native.txt",
81
- native_file="test_native.txt",
82
- additional_files=[],
80
+ native_file="native.txt",
83
81
  )
84
82
  data2 = Data(
85
83
  id="test_data_2",
86
84
  geode_object="Section",
87
85
  viewer_object="Section",
88
86
  viewer_elements_type="default",
89
- input_file="test_input.txt",
90
- native_file="test_native2.txt",
91
- additional_files=[],
87
+ native_file="native.txt",
92
88
  )
93
89
  session.add(data1)
94
90
  session.add(data2)
@@ -96,13 +92,13 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None:
96
92
 
97
93
  data1_dir = os.path.join(project_folder, "test_data_1")
98
94
  os.makedirs(data1_dir, exist_ok=True)
99
- with open(os.path.join(data1_dir, "test_native.txt"), "w") as f:
95
+ with open(os.path.join(data1_dir, "native.txt"), "w") as f:
100
96
  f.write("native file content")
101
97
 
102
98
  data2_dir = os.path.join(project_folder, "test_data_2")
103
99
  os.makedirs(data2_dir, exist_ok=True)
104
- with open(os.path.join(data2_dir, "test_input.txt"), "w") as f:
105
- f.write("input file content")
100
+ with open(os.path.join(data2_dir, "native.txt"), "w") as f:
101
+ f.write("native file content")
106
102
 
107
103
  response = client.post(route, json={"snapshot": snapshot, "filename": filename})
108
104
  assert response.status_code == 200
@@ -119,8 +115,8 @@ def test_export_project_route(client: FlaskClient, tmp_path: Path) -> None:
119
115
  parsed = json.loads(zip_file.read("snapshot.json").decode("utf-8"))
120
116
  assert parsed == snapshot
121
117
  assert "project.db" in names
122
- assert "test_data_1/test_native.txt" in names
123
- assert "test_data_2/test_input.txt" in names
118
+ assert "test_data_1/native.txt" in names
119
+ assert "test_data_2/native.txt" in names
124
120
 
125
121
  response.close()
126
122
 
@@ -147,7 +143,7 @@ def test_import_project_route(client: FlaskClient, tmp_path: Path) -> None:
147
143
  conn = sqlite3.connect(str(temp_db))
148
144
  conn.execute(
149
145
  "CREATE TABLE datas (id TEXT PRIMARY KEY, geode_object TEXT, viewer_object TEXT, viewer_elements_type TEXT, native_file TEXT, "
150
- "viewable_file TEXT, light_viewable_file TEXT, input_file TEXT, additional_files TEXT)"
146
+ "viewable_file TEXT, light_viewable_file TEXT)"
151
147
  )
152
148
  conn.commit()
153
149
  conn.close()
@@ -205,7 +205,6 @@ def test_texture_coordinates(client: FlaskClient, test_id: str) -> None:
205
205
  geode_object=GeodePolygonalSurface3D.geode_object_type(),
206
206
  viewer_object=GeodePolygonalSurface3D.viewer_type(),
207
207
  viewer_elements_type=GeodePolygonalSurface3D.viewer_elements_type(),
208
- input_file=file,
209
208
  )
210
209
  data.native_file = file
211
210
  session = get_session()
@@ -234,7 +233,6 @@ def test_vertex_attribute_names(client: FlaskClient, test_id: str) -> None:
234
233
  geode_object=GeodePolygonalSurface3D.geode_object_type(),
235
234
  viewer_object=GeodePolygonalSurface3D.viewer_type(),
236
235
  viewer_elements_type=GeodePolygonalSurface3D.viewer_elements_type(),
237
- input_file=file,
238
236
  )
239
237
  data.native_file = file
240
238
  session = get_session()
@@ -263,7 +261,6 @@ def test_cell_attribute_names(client: FlaskClient, test_id: str) -> None:
263
261
  geode_object=GeodeRegularGrid2D.geode_object_type(),
264
262
  viewer_object=GeodeRegularGrid2D.viewer_type(),
265
263
  viewer_elements_type=GeodeRegularGrid2D.viewer_elements_type(),
266
- input_file=file,
267
264
  )
268
265
  data.native_file = file
269
266
  session = get_session()
@@ -292,7 +289,6 @@ def test_polygon_attribute_names(client: FlaskClient, test_id: str) -> None:
292
289
  geode_object=GeodePolygonalSurface3D.geode_object_type(),
293
290
  viewer_object=GeodePolygonalSurface3D.viewer_type(),
294
291
  viewer_elements_type=GeodePolygonalSurface3D.viewer_elements_type(),
295
- input_file=file,
296
292
  )
297
293
  data.native_file = file
298
294
  session = get_session()
@@ -321,7 +317,6 @@ def test_polyhedron_attribute_names(client: FlaskClient, test_id: str) -> None:
321
317
  geode_object=GeodePolyhedralSolid3D.geode_object_type(),
322
318
  viewer_object=GeodePolyhedralSolid3D.viewer_type(),
323
319
  viewer_elements_type=GeodePolyhedralSolid3D.viewer_elements_type(),
324
- input_file=file,
325
320
  )
326
321
  data.native_file = file
327
322
  session = get_session()
@@ -354,7 +349,6 @@ def test_edge_attribute_names(client: FlaskClient, test_id: str) -> None:
354
349
  geode_object=GeodeEdgedCurve3D.geode_object_type(),
355
350
  viewer_object=GeodeEdgedCurve3D.viewer_type(),
356
351
  viewer_elements_type=GeodeEdgedCurve3D.viewer_elements_type(),
357
- input_file=file,
358
352
  )
359
353
  data.native_file = file
360
354
  session = get_session()
@@ -385,3 +379,48 @@ def test_database_uri_path(client: FlaskClient) -> None:
385
379
  assert app.config["SQLALCHEMY_DATABASE_URI"] == expected_uri
386
380
 
387
381
  assert os.path.exists(expected_db_path)
382
+
383
+
384
+ def test_geode_object_inheritance(client: FlaskClient) -> None:
385
+ route = "/opengeodeweb_back/geode_object_inheritance"
386
+ # Test BRep
387
+ response = client.post(route, json={"geode_object_type": "BRep"})
388
+ assert response.status_code == 200
389
+ json_data = response.get_json()
390
+ parents = json_data["parents"]
391
+ children = json_data["children"]
392
+ assert "BRep" not in parents
393
+ assert "BRep" not in children
394
+ # Descendants
395
+ assert "StructuralModel" in children
396
+ assert "ImplicitStructuralModel" in children
397
+
398
+ # Test CrossSection
399
+ response = client.post(route, json={"geode_object_type": "CrossSection"})
400
+ assert response.status_code == 200
401
+ json_data = response.get_json()
402
+ parents = json_data["parents"]
403
+ children = json_data["children"]
404
+ assert "CrossSection" not in parents
405
+ assert "CrossSection" not in children
406
+ # Parent
407
+ assert "Section" in parents
408
+ # Descendant
409
+ assert "ImplicitCrossSection" in children
410
+
411
+ # Test PolyhedralSolid3D
412
+ response = client.post(route, json={"geode_object_type": "PolyhedralSolid3D"})
413
+ assert response.status_code == 200
414
+ json_data = response.get_json()
415
+ parents = json_data["parents"]
416
+ children = json_data["children"]
417
+ assert "PolyhedralSolid3D" not in parents
418
+ assert "PolyhedralSolid3D" not in children
419
+ # Parent
420
+ assert "VertexSet" in parents
421
+
422
+ # Test all params
423
+ def get_full_data() -> test_utils.JsonData:
424
+ return {"geode_object_type": "BRep"}
425
+
426
+ test_utils.test_route_wrong_params(client, route, get_full_data)
@@ -105,15 +105,11 @@ def test_save_all_viewables_and_return_info(client: FlaskClient) -> None:
105
105
  assert os.path.exists(expected_db_path)
106
106
 
107
107
  geode_object = GeodeBRep.load(os.path.join(data_dir, "test.og_brep"))
108
- input_file = "test.og_brep"
109
- additional_files = ["additional_file.txt"]
110
108
 
111
109
  data_entry = Data.create(
112
110
  geode_object=geode_object.geode_object_type(),
113
111
  viewer_object=geode_object.viewer_type(),
114
112
  viewer_elements_type=geode_object.viewer_elements_type(),
115
- input_file=input_file,
116
- additional_files=additional_files,
117
113
  )
118
114
  data_path = utils_functions.create_data_folder_from_id(data_entry.id)
119
115
 
@@ -124,7 +120,7 @@ def test_save_all_viewables_and_return_info(client: FlaskClient) -> None:
124
120
  assert isinstance(result, dict)
125
121
  native_file = result["native_file"]
126
122
  assert isinstance(native_file, str)
127
- assert native_file.startswith("native.")
123
+ assert native_file == "native.og_brep"
128
124
  viewable_file = result["viewable_file"]
129
125
  assert isinstance(viewable_file, str)
130
126
  assert viewable_file.endswith(".vtm")
@@ -134,15 +130,12 @@ def test_save_all_viewables_and_return_info(client: FlaskClient) -> None:
134
130
  assert isinstance(result["viewer_type"], str)
135
131
  assert isinstance(result["binary_light_viewable"], str)
136
132
  assert result["geode_object_type"] == geode_object.geode_object_type()
137
- assert result["input_file"] == input_file
138
133
 
139
134
  db_entry = Data.get(result["id"])
140
135
  assert db_entry is not None
141
136
  assert db_entry.native_file == result["native_file"]
142
137
  assert db_entry.viewable_file == result["viewable_file"]
143
138
  assert db_entry.geode_object == geode_object.geode_object_type()
144
- assert db_entry.input_file == input_file
145
- assert db_entry.additional_files == additional_files
146
139
 
147
140
  expected_data_path = os.path.join(app.config["DATA_FOLDER_PATH"], result["id"])
148
141
  assert os.path.exists(expected_data_path)
@@ -152,13 +145,10 @@ def test_save_all_viewables_commits_to_db(client: FlaskClient) -> None:
152
145
  app = client.application
153
146
  with app.app_context():
154
147
  geode_object = GeodeBRep.load(os.path.join(data_dir, "test.og_brep"))
155
- input_file = "test.og_brep"
156
148
  data_entry = Data.create(
157
149
  geode_object=geode_object.geode_object_type(),
158
150
  viewer_object=geode_object.viewer_type(),
159
151
  viewer_elements_type=geode_object.viewer_elements_type(),
160
- input_file=input_file,
161
- additional_files=[],
162
152
  )
163
153
  data_path = utils_functions.create_data_folder_from_id(data_entry.id)
164
154
 
@@ -196,11 +186,8 @@ def test_generate_native_viewable_and_light_viewable_from_object(
196
186
  assert isinstance(result["binary_light_viewable"], str)
197
187
  assert result["binary_light_viewable"].startswith('<?xml version="1.0"?>')
198
188
 
199
- assert result["input_file"] == result["native_file"]
200
-
201
189
  data = Data.get(result["id"])
202
190
  assert data is not None
203
- assert data.input_file == data.native_file
204
191
  assert data.light_viewable_file is not None
205
192
  assert data.light_viewable_file.endswith(".vtp")
206
193
 
@@ -221,14 +208,13 @@ def test_generate_native_viewable_and_light_viewable_from_file(
221
208
 
222
209
  assert isinstance(result, dict)
223
210
  assert isinstance(result["native_file"], str)
224
- assert result["native_file"].startswith("native.")
211
+ assert result["native_file"] == "native.og_brep"
225
212
  assert isinstance(result["viewable_file"], str)
226
213
  assert result["viewable_file"].endswith(".vtm")
227
214
  assert isinstance(result["id"], str)
228
215
  assert re.match(r"[0-9a-f]{32}", result["id"])
229
216
  assert isinstance(result["viewer_type"], str)
230
217
  assert isinstance(result["binary_light_viewable"], str)
231
- assert isinstance(result["input_file"], str)
232
218
 
233
219
 
234
220
  def test_send_file_multiple_returns_zip(client: FlaskClient, tmp_path: Path) -> None: