OpenGeodeWeb-Back 6.11.0__tar.gz → 6.12.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 (115) hide show
  1. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/PKG-INFO +9 -9
  2. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/pyproject.toml +1 -1
  3. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/requirements.txt +8 -8
  4. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/OpenGeodeWeb_Back.egg-info/PKG-INFO +9 -9
  5. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt +1 -0
  6. opengeodeweb_back-6.12.0/src/OpenGeodeWeb_Back.egg-info/requires.txt +18 -0
  7. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/app.py +39 -0
  8. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/__init__.py +2 -0
  9. opengeodeweb_back-6.12.0/src/opengeodeweb_back/geode_objects/geode_horizon_stack3d.py +103 -0
  10. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/blueprint_routes.py +76 -58
  11. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/create/blueprint_create.py +3 -9
  12. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_names.json +8 -4
  13. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_names.py +2 -1
  14. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_names.json +8 -4
  15. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_names.py +2 -1
  16. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_names.json +8 -4
  17. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_names.py +2 -1
  18. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_names.json +8 -4
  19. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_names.py +2 -1
  20. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/utils_functions.py +55 -38
  21. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/tests/test_routes.py +8 -12
  22. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/tests/test_utils_functions.py +6 -10
  23. opengeodeweb_back-6.11.0/src/OpenGeodeWeb_Back.egg-info/requires.txt +0 -18
  24. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/LICENSE +0 -0
  25. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/README.md +0 -0
  26. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/setup.cfg +0 -0
  27. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/OpenGeodeWeb_Back.egg-info/dependency_links.txt +0 -0
  28. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/OpenGeodeWeb_Back.egg-info/entry_points.txt +0 -0
  29. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/OpenGeodeWeb_Back.egg-info/top_level.txt +0 -0
  30. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/__init__.py +0 -0
  31. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/app_config.py +0 -0
  32. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_functions.py +0 -0
  33. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_brep.py +0 -0
  34. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_cross_section.py +0 -0
  35. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_edged_curve2d.py +0 -0
  36. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_edged_curve3d.py +0 -0
  37. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_graph.py +0 -0
  38. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_grid2d.py +0 -0
  39. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_grid3d.py +0 -0
  40. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_hybrid_solid3d.py +0 -0
  41. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_implicit_cross_section.py +0 -0
  42. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_implicit_structural_model.py +0 -0
  43. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid2d.py +0 -0
  44. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid3d.py +0 -0
  45. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_mesh.py +0 -0
  46. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_model.py +0 -0
  47. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_object.py +0 -0
  48. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_point_set2d.py +0 -0
  49. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_point_set3d.py +0 -0
  50. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface2d.py +0 -0
  51. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface3d.py +0 -0
  52. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_polyhedral_solid3d.py +0 -0
  53. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_raster_image2d.py +0 -0
  54. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py +0 -0
  55. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_regular_grid2d.py +0 -0
  56. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_regular_grid3d.py +0 -0
  57. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_section.py +0 -0
  58. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_solid_mesh3d.py +0 -0
  59. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_structural_model.py +0 -0
  60. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py +0 -0
  61. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_surface_mesh3d.py +0 -0
  62. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_tetrahedral_solid3d.py +0 -0
  63. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface2d.py +0 -0
  64. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface3d.py +0 -0
  65. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/geode_objects/geode_vertex_set.py +0 -0
  66. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/py.typed +0 -0
  67. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/create/schemas/__init__.py +0 -0
  68. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/create/schemas/edged_curve.json +0 -0
  69. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/create/schemas/edged_curve.py +0 -0
  70. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/create/schemas/point_set.json +0 -0
  71. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/create/schemas/point_set.py +0 -0
  72. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/create/schemas/polygonal_surface.json +0 -0
  73. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/create/schemas/polygonal_surface.py +0 -0
  74. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/__init__.py +0 -0
  75. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/allowed_files.json +0 -0
  76. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/allowed_files.py +0 -0
  77. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/allowed_objects.json +0 -0
  78. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/allowed_objects.py +0 -0
  79. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.json +0 -0
  80. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.py +0 -0
  81. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.json +0 -0
  82. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.py +0 -0
  83. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/export_project.json +0 -0
  84. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/export_project.py +0 -0
  85. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.json +0 -0
  86. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.py +0 -0
  87. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json +0 -0
  88. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.py +0 -0
  89. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json +0 -0
  90. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.py +0 -0
  91. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/import_project.json +0 -0
  92. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/import_project.py +0 -0
  93. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/kill.json +0 -0
  94. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/kill.py +0 -0
  95. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/missing_files.json +0 -0
  96. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/missing_files.py +0 -0
  97. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/ping.json +0 -0
  98. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/ping.py +0 -0
  99. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.json +0 -0
  100. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.py +0 -0
  101. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.json +0 -0
  102. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.py +0 -0
  103. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/save_viewable_file.json +0 -0
  104. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/save_viewable_file.py +0 -0
  105. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/texture_coordinates.json +0 -0
  106. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/texture_coordinates.py +0 -0
  107. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/upload_file.json +0 -0
  108. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/upload_file.py +0 -0
  109. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/validate.json +0 -0
  110. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/validate.py +0 -0
  111. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.json +0 -0
  112. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.py +0 -0
  113. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/src/opengeodeweb_back/test_utils.py +0 -0
  114. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.0}/tests/test_create_routes.py +0 -0
  115. {opengeodeweb_back-6.11.0 → opengeodeweb_back-6.12.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.11.0
3
+ Version: 6.12.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
@@ -16,19 +16,19 @@ Requires-Dist: blinker>=1
16
16
  Requires-Dist: click>=8
17
17
  Requires-Dist: flask[async]>=3
18
18
  Requires-Dist: flask-cors==6.0.2
19
- Requires-Dist: geode-common==33.24.2
20
- Requires-Dist: geode-viewables==3.4.0
19
+ Requires-Dist: geode-common==33.25.4
20
+ Requires-Dist: geode-viewables==3.4.1
21
21
  Requires-Dist: itsdangerous>=2
22
22
  Requires-Dist: jinja2>=3
23
23
  Requires-Dist: markupsafe>=3
24
- Requires-Dist: opengeode-core==17.3.7
25
- Requires-Dist: opengeode-geosciences==9.6.0
24
+ Requires-Dist: opengeode-core==17.4.5
25
+ Requires-Dist: opengeode-geosciences==9.6.1
26
26
  Requires-Dist: opengeode-geosciencesio==5.9.0
27
- Requires-Dist: opengeode-inspector==6.11.6
28
- Requires-Dist: opengeode-inspector-geosciences==1.1.0
29
- Requires-Dist: opengeode-io==7.7.0
27
+ Requires-Dist: opengeode-inspector==6.11.8
28
+ Requires-Dist: opengeode-inspector-geosciences==1.1.1
29
+ Requires-Dist: opengeode-io==7.7.2
30
30
  Requires-Dist: werkzeug==3.1.8
31
- Requires-Dist: opengeodeweb-microservice==1.*,>=1.1.4
31
+ Requires-Dist: opengeodeweb-microservice==1.*,>=1.2.0
32
32
  Dynamic: license-file
33
33
 
34
34
  <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.11.0"
7
+ version = "6.12.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"
@@ -16,11 +16,11 @@ flask[async]>=3
16
16
  # flask-cors
17
17
  flask-cors==6.0.2
18
18
  # via -r requirements.in
19
- geode-common==33.24.2
19
+ geode-common==33.25.4
20
20
  # via
21
21
  # -r requirements.in
22
22
  # geode-viewables
23
- geode-viewables==3.4.0
23
+ geode-viewables==3.4.1
24
24
  # via -r requirements.in
25
25
  itsdangerous>=2
26
26
  # via flask
@@ -31,7 +31,7 @@ markupsafe>=3
31
31
  # flask
32
32
  # jinja2
33
33
  # werkzeug
34
- opengeode-core==17.3.7
34
+ opengeode-core==17.4.5
35
35
  # via
36
36
  # -r requirements.in
37
37
  # geode-common
@@ -41,7 +41,7 @@ opengeode-core==17.3.7
41
41
  # opengeode-inspector
42
42
  # opengeode-inspector-geosciences
43
43
  # opengeode-io
44
- opengeode-geosciences==9.6.0
44
+ opengeode-geosciences==9.6.1
45
45
  # via
46
46
  # -r requirements.in
47
47
  # geode-viewables
@@ -49,13 +49,13 @@ opengeode-geosciences==9.6.0
49
49
  # opengeode-inspector-geosciences
50
50
  opengeode-geosciencesio==5.9.0
51
51
  # via -r requirements.in
52
- opengeode-inspector==6.11.6
52
+ opengeode-inspector==6.11.8
53
53
  # via
54
54
  # -r requirements.in
55
55
  # opengeode-inspector-geosciences
56
- opengeode-inspector-geosciences==1.1.0
56
+ opengeode-inspector-geosciences==1.1.1
57
57
  # via -r requirements.in
58
- opengeode-io==7.7.0
58
+ opengeode-io==7.7.2
59
59
  # via
60
60
  # -r requirements.in
61
61
  # geode-viewables
@@ -66,4 +66,4 @@ werkzeug==3.1.8
66
66
  # flask
67
67
  # flask-cors
68
68
 
69
- opengeodeweb-microservice==1.*,>=1.1.4
69
+ opengeodeweb-microservice==1.*,>=1.2.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 6.11.0
3
+ Version: 6.12.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
@@ -16,19 +16,19 @@ Requires-Dist: blinker>=1
16
16
  Requires-Dist: click>=8
17
17
  Requires-Dist: flask[async]>=3
18
18
  Requires-Dist: flask-cors==6.0.2
19
- Requires-Dist: geode-common==33.24.2
20
- Requires-Dist: geode-viewables==3.4.0
19
+ Requires-Dist: geode-common==33.25.4
20
+ Requires-Dist: geode-viewables==3.4.1
21
21
  Requires-Dist: itsdangerous>=2
22
22
  Requires-Dist: jinja2>=3
23
23
  Requires-Dist: markupsafe>=3
24
- Requires-Dist: opengeode-core==17.3.7
25
- Requires-Dist: opengeode-geosciences==9.6.0
24
+ Requires-Dist: opengeode-core==17.4.5
25
+ Requires-Dist: opengeode-geosciences==9.6.1
26
26
  Requires-Dist: opengeode-geosciencesio==5.9.0
27
- Requires-Dist: opengeode-inspector==6.11.6
28
- Requires-Dist: opengeode-inspector-geosciences==1.1.0
29
- Requires-Dist: opengeode-io==7.7.0
27
+ Requires-Dist: opengeode-inspector==6.11.8
28
+ Requires-Dist: opengeode-inspector-geosciences==1.1.1
29
+ Requires-Dist: opengeode-io==7.7.2
30
30
  Requires-Dist: werkzeug==3.1.8
31
- Requires-Dist: opengeodeweb-microservice==1.*,>=1.1.4
31
+ Requires-Dist: opengeodeweb-microservice==1.*,>=1.2.0
32
32
  Dynamic: license-file
33
33
 
34
34
  <h1 align="center">OpenGeodeWeb-Back<sup><i>by Geode-solutions</i></sup></h1>
@@ -23,6 +23,7 @@ src/opengeodeweb_back/geode_objects/geode_edged_curve3d.py
23
23
  src/opengeodeweb_back/geode_objects/geode_graph.py
24
24
  src/opengeodeweb_back/geode_objects/geode_grid2d.py
25
25
  src/opengeodeweb_back/geode_objects/geode_grid3d.py
26
+ src/opengeodeweb_back/geode_objects/geode_horizon_stack3d.py
26
27
  src/opengeodeweb_back/geode_objects/geode_hybrid_solid3d.py
27
28
  src/opengeodeweb_back/geode_objects/geode_implicit_cross_section.py
28
29
  src/opengeodeweb_back/geode_objects/geode_implicit_structural_model.py
@@ -0,0 +1,18 @@
1
+ asgiref>=3
2
+ blinker>=1
3
+ click>=8
4
+ flask[async]>=3
5
+ flask-cors==6.0.2
6
+ geode-common==33.25.4
7
+ geode-viewables==3.4.1
8
+ itsdangerous>=2
9
+ jinja2>=3
10
+ markupsafe>=3
11
+ opengeode-core==17.4.5
12
+ opengeode-geosciences==9.6.1
13
+ opengeode-geosciencesio==5.9.0
14
+ opengeode-inspector==6.11.8
15
+ opengeode-inspector-geosciences==1.1.1
16
+ opengeode-io==7.7.2
17
+ werkzeug==3.1.8
18
+ opengeodeweb-microservice==1.*,>=1.2.0
@@ -14,6 +14,11 @@ from opengeodeweb_back.routes import blueprint_routes
14
14
  from opengeodeweb_back.routes.create import blueprint_create
15
15
  from opengeodeweb_microservice.database import connection
16
16
 
17
+ import queue
18
+ import threading
19
+ import json
20
+ from typing import Any, Dict, Generator, Tuple
21
+
17
22
 
18
23
  def create_app(name: str) -> flask.Flask:
19
24
  app = flask.Flask(name)
@@ -29,6 +34,36 @@ def create_app(name: str) -> flask.Flask:
29
34
  utils_functions.before_request(flask.current_app)
30
35
  return None
31
36
 
37
+ def wants_event_stream() -> bool:
38
+ accept = flask.request.headers.get("Accept", "")
39
+ return "text/event-stream" in accept
40
+
41
+ _event_queue: queue.Queue[tuple[str, dict[str, Any]]] = queue.Queue()
42
+ _lock = threading.Lock()
43
+
44
+ def publish_event(event: str, data: dict[str, Any]) -> None:
45
+ _event_queue.put((event, data))
46
+
47
+ def stream_events() -> Generator[str, None, None]:
48
+ while True:
49
+ event, data = _event_queue.get()
50
+ yield f"event: {event}\ndata: {json.dumps(data)}\n\n"
51
+
52
+ @app.after_request
53
+ def after_request(response: flask.Response) -> flask.Response:
54
+ endpoint = flask.request.endpoint
55
+ if endpoint == "events" or endpoint == None:
56
+ return response
57
+
58
+ if wants_event_stream():
59
+ payload: dict[str, Any]
60
+ try:
61
+ payload = response.get_json()
62
+ except Exception:
63
+ payload = {"status": response.status_code}
64
+ publish_event(endpoint, payload)
65
+ return response
66
+
32
67
  @app.teardown_request
33
68
  def teardown_request(exception: BaseException | None) -> None:
34
69
  utils_functions.teardown_request(flask.current_app, exception)
@@ -42,6 +77,10 @@ def create_app(name: str) -> flask.Flask:
42
77
  print("\033[91mError:\033[0m \033[91m" + str(exception) + "\033[0m", flush=True)
43
78
  return flask.make_response({"description": str(exception)}, 500)
44
79
 
80
+ @app.route("/events")
81
+ def events() -> flask.Response:
82
+ return flask.Response(stream_events(), mimetype="text/event-stream")
83
+
45
84
  @app.route(
46
85
  "/error",
47
86
  methods=["POST"],
@@ -31,6 +31,7 @@ from .geode_structural_model import GeodeStructuralModel
31
31
  from .geode_cross_section import GeodeCrossSection
32
32
  from .geode_implicit_structural_model import GeodeImplicitStructuralModel
33
33
  from .geode_implicit_cross_section import GeodeImplicitCrossSection
34
+ from .geode_horizon_stack3d import GeodeHorizonStack3D
34
35
 
35
36
  geode_objects: dict[GeodeObjectType, type[GeodeObject]] = {
36
37
  "VertexSet": GeodeVertexSet,
@@ -58,4 +59,5 @@ geode_objects: dict[GeodeObjectType, type[GeodeObject]] = {
58
59
  "CrossSection": GeodeCrossSection,
59
60
  "ImplicitStructuralModel": GeodeImplicitStructuralModel,
60
61
  "ImplicitCrossSection": GeodeImplicitCrossSection,
62
+ "HorizonStack3D": GeodeHorizonStack3D,
61
63
  }
@@ -0,0 +1,103 @@
1
+ # Standard library imports
2
+ from __future__ import annotations
3
+ from typing import Any
4
+
5
+ # Third party imports
6
+ import opengeode as og
7
+ import opengeode_geosciences as og_geosciences
8
+ from opengeodeweb_microservice.database.data_types import GeodeModelType
9
+
10
+ # Local application imports
11
+ from .geode_model import GeodeModel, ComponentRegistry
12
+
13
+
14
+ class GeodeHorizonStack3D(GeodeModel):
15
+ horizon_stack: og_geosciences.HorizonsStack3D
16
+
17
+ def __init__(
18
+ self, horizon_stack: og_geosciences.HorizonsStack3D | None = None
19
+ ) -> None:
20
+ self.horizon_stack = (
21
+ horizon_stack
22
+ if horizon_stack is not None
23
+ else og_geosciences.HorizonsStack3D()
24
+ )
25
+ super().__init__(self.horizon_stack)
26
+
27
+ @classmethod
28
+ def geode_object_type(cls) -> GeodeModelType:
29
+ return "HorizonStack3D"
30
+
31
+ def native_extension(self) -> str:
32
+ return self.horizon_stack.native_extension()
33
+
34
+ @classmethod
35
+ def is_3D(cls) -> bool:
36
+ return True
37
+
38
+ @classmethod
39
+ def is_viewable(cls) -> bool:
40
+ return False
41
+
42
+ def builder(self) -> og_geosciences.HorizonsStackBuilder3D:
43
+ return og_geosciences.HorizonsStackBuilder3D(self.horizon_stack)
44
+
45
+ @classmethod
46
+ def load(cls, filename: str) -> GeodeHorizonStack3D:
47
+ return GeodeHorizonStack3D(og_geosciences.load_horizons_stack3D(filename))
48
+
49
+ @classmethod
50
+ def additional_files(cls, filename: str) -> og.AdditionalFiles:
51
+ return og_geosciences.horizons_stack_additional_files3D(filename)
52
+
53
+ @classmethod
54
+ def is_loadable(cls, filename: str) -> og.Percentage:
55
+ return og_geosciences.is_horizons_stack_loadable3D(filename)
56
+
57
+ @classmethod
58
+ def input_extensions(cls) -> list[str]:
59
+ return og_geosciences.HorizonsStackInputFactory3D.list_creators()
60
+
61
+ @classmethod
62
+ def output_extensions(cls) -> list[str]:
63
+ return og_geosciences.HorizonsStackOutputFactory3D.list_creators()
64
+
65
+ @classmethod
66
+ def object_priority(cls, filename: str) -> int:
67
+ return og_geosciences.horizons_stack_object_priority3D(filename)
68
+
69
+ def is_saveable(self, filename: str) -> bool:
70
+ return og_geosciences.is_horizons_stack_saveable3D(self.horizon_stack, filename)
71
+
72
+ def save(self, filename: str) -> list[str]:
73
+ return og_geosciences.save_horizons_stack3D(self.horizon_stack, filename)
74
+
75
+ def save_viewable(self, filename_without_extension: str) -> str:
76
+ return ""
77
+
78
+ def save_light_viewable(self, filename_without_extension: str) -> str:
79
+ return ""
80
+
81
+ def mesh_components(self) -> ComponentRegistry:
82
+ return {}
83
+
84
+ def collection_components(self) -> ComponentRegistry:
85
+ return {}
86
+
87
+ def boundaries(self, id: og.uuid) -> list[og.ComponentID]:
88
+ return []
89
+
90
+ def internals(self, id: og.uuid) -> list[og.ComponentID]:
91
+ return []
92
+
93
+ def items(self, id: og.uuid) -> list[og.ComponentID]:
94
+ return []
95
+
96
+ def component(self, id: og.uuid) -> og.Component3D:
97
+ raise NotImplementedError("HorizonStack3D has no mesh components")
98
+
99
+ def inspect(self) -> Any:
100
+ return None
101
+
102
+ def validate(self) -> Any:
103
+ return None
@@ -1,10 +1,10 @@
1
1
  # Standard library imports
2
+ from opengeodeweb_back.geode_objects.geode_solid_mesh3d import GeodeSolidMesh3D
2
3
  import os
3
4
  import time
4
5
  import shutil
5
6
  import math
6
7
  from threading import Timer
7
- from typing import Any, Union, get_args
8
8
 
9
9
  # Third party imports
10
10
  import flask
@@ -31,9 +31,8 @@ from opengeodeweb_back.geode_objects.geode_grid2d import GeodeGrid2D
31
31
  from opengeodeweb_back.geode_objects.geode_grid3d import GeodeGrid3D
32
32
  from opengeodeweb_back.geode_objects.geode_surface_mesh2d import GeodeSurfaceMesh2D
33
33
  from opengeodeweb_back.geode_objects.geode_surface_mesh3d import GeodeSurfaceMesh3D
34
- from opengeodeweb_back.geode_objects.geode_solid_mesh3d import GeodeSolidMesh3D
35
34
 
36
- ComponentMesh = Union[
35
+ ComponentMesh = (
37
36
  og.Corner2D,
38
37
  og.Corner3D,
39
38
  og.Line2D,
@@ -41,7 +40,10 @@ ComponentMesh = Union[
41
40
  og.Surface2D,
42
41
  og.Surface3D,
43
42
  og.Block3D,
44
- ]
43
+ )
44
+ ComponentLine = (og.Line2D, og.Line3D)
45
+ ComponentSurface = (og.Surface2D, og.Surface3D)
46
+ ComponentBlock = og.Block3D
45
47
 
46
48
  routes = flask.Blueprint("routes", __name__, url_prefix="/opengeodeweb_back")
47
49
 
@@ -226,7 +228,7 @@ def save_viewable_file() -> flask.Response:
226
228
  )
227
229
  params = schemas.SaveViewableFile.from_dict(json_data)
228
230
  return flask.make_response(
229
- utils_functions.generate_native_viewable_and_light_viewable_from_file(
231
+ utils_functions.generate_files_from_file(
230
232
  geode_object_type=geode_object_type(params.geode_object_type),
231
233
  input_file=params.filename,
232
234
  ),
@@ -250,45 +252,55 @@ def texture_coordinates() -> flask.Response:
250
252
  return flask.make_response({"texture_coordinates": texture_coordinates}, 200)
251
253
 
252
254
 
255
+ def extract_valid_attribute_values(
256
+ attribute_manager: og.AttributeManager,
257
+ attribute_name: str,
258
+ item_index: int,
259
+ ) -> list[float]:
260
+ component_attribute = attribute_manager.find_generic_attribute(attribute_name)
261
+ if not component_attribute.is_genericable():
262
+ return []
263
+ valid_values: list[float] = []
264
+ for index in range(attribute_manager.nb_elements()):
265
+ value = component_attribute.generic_item_value(index, item_index)
266
+ if value is not None and not math.isnan(value):
267
+ valid_values.append(value)
268
+ return valid_values
269
+
270
+
253
271
  def attributes_metadata(
254
- manager: og.AttributeManager,
272
+ manager: og.AttributeManager | list[og.AttributeManager],
255
273
  ) -> list[dict[str, str | int | float | list[float]]]:
274
+ attribute_managers = manager if isinstance(manager, list) else [manager]
256
275
  attributes: list[dict[str, str | int | float | list[float]]] = []
257
- nb_elements = manager.nb_elements()
258
- for name in manager.attribute_names():
259
- attribute = manager.find_generic_attribute(name)
276
+ first_manager = attribute_managers[0]
277
+ for name in first_manager.attribute_names():
278
+ attribute = first_manager.find_generic_attribute(name)
260
279
  nb_items = 1
261
- min_value, max_value = -1.0, -1.0
262
280
  min_values, max_values = [-1.0], [-1.0]
263
281
  if attribute.is_genericable():
264
282
  nb_items = attribute.nb_items()
265
283
  min_values, max_values = [], []
266
- for item in range(nb_items):
267
- values = [
268
- attribute.generic_item_value(idx, item)
269
- for idx in range(nb_elements)
270
- ]
271
- valid = [
272
- value
273
- for value in values
274
- if value is not None and not math.isnan(value)
275
- ]
276
- min_values.append(min(valid) if valid else -1.0)
277
- max_values.append(max(valid) if valid else -1.0)
278
- min_value, max_value = min_values[0], max_values[0]
279
-
284
+ for item_index in range(nb_items):
285
+ valid_values: list[float] = []
286
+ for attribute_manager in attribute_managers:
287
+ valid_values.extend(
288
+ extract_valid_attribute_values(
289
+ attribute_manager, name, item_index
290
+ )
291
+ )
292
+ min_values.append(min(valid_values) if valid_values else -1.0)
293
+ max_values.append(max(valid_values) if valid_values else -1.0)
280
294
  attributes.append(
281
295
  {
282
296
  "attribute_name": name,
283
297
  "nb_items": nb_items,
284
- "min_value": min_value,
285
- "max_value": max_value,
298
+ "min_value": min_values[0],
299
+ "max_value": max_values[0],
286
300
  "min_values": min_values,
287
301
  "max_values": max_values,
288
302
  }
289
303
  )
290
- print(f"[ATTRIBUTES] Number of items: {nb_items}")
291
- print(f"[ATTRIBUTES] Attributes: {attributes}")
292
304
  return attributes
293
305
 
294
306
 
@@ -399,13 +411,16 @@ def model_component_vertex_attribute_names() -> flask.Response:
399
411
  geode_object = geode_functions.load_geode_object(params.id)
400
412
  if not isinstance(geode_object, GeodeModel):
401
413
  flask.abort(400, f"{params.id} is not a GeodeModel")
402
- component = geode_object.component(og.uuid(params.component_id))
403
- if not isinstance(component, get_args(ComponentMesh)):
404
- flask.abort(400, f"{params.component_id} is not a valid ComponentMesh")
405
- mesh = component.mesh()
406
- attribute_manager = mesh.vertex_attribute_manager()
414
+ managers = [
415
+ component.mesh().vertex_attribute_manager()
416
+ for component_id in params.component_ids
417
+ if isinstance(
418
+ (component := geode_object.component(og.uuid(component_id))),
419
+ ComponentMesh,
420
+ )
421
+ ]
407
422
  return flask.make_response(
408
- {"attributes": attributes_metadata(attribute_manager)},
423
+ {"attributes": attributes_metadata(managers)},
409
424
  200,
410
425
  )
411
426
 
@@ -422,15 +437,16 @@ def model_component_edge_attribute_names() -> flask.Response:
422
437
  geode_object = geode_functions.load_geode_object(params.id)
423
438
  if not isinstance(geode_object, GeodeModel):
424
439
  flask.abort(400, f"{params.id} is not a GeodeModel")
425
- component = geode_object.component(og.uuid(params.component_id))
426
- if not isinstance(component, get_args(ComponentMesh)):
427
- flask.abort(400, f"{params.component_id} is not a valid ComponentMesh")
428
- mesh = component.mesh()
429
- if not hasattr(mesh, "edge_attribute_manager"):
430
- flask.abort(400, "Component does not have edges")
431
- attribute_manager = mesh.edge_attribute_manager()
440
+ managers = [
441
+ component.mesh().edge_attribute_manager()
442
+ for component_id in params.component_ids
443
+ if isinstance(
444
+ (component := geode_object.component(og.uuid(component_id))),
445
+ ComponentLine,
446
+ )
447
+ ]
432
448
  return flask.make_response(
433
- {"attributes": attributes_metadata(attribute_manager)},
449
+ {"attributes": attributes_metadata(managers)},
434
450
  200,
435
451
  )
436
452
 
@@ -447,15 +463,16 @@ def model_component_polygon_attribute_names() -> flask.Response:
447
463
  geode_object = geode_functions.load_geode_object(params.id)
448
464
  if not isinstance(geode_object, GeodeModel):
449
465
  flask.abort(400, f"{params.id} is not a GeodeModel")
450
- component = geode_object.component(og.uuid(params.component_id))
451
- if not isinstance(component, get_args(ComponentMesh)):
452
- flask.abort(400, f"{params.component_id} is not a valid ComponentMesh")
453
- mesh = component.mesh()
454
- if not hasattr(mesh, "polygon_attribute_manager"):
455
- flask.abort(400, "Component does not have polygons")
456
- attribute_manager = mesh.polygon_attribute_manager()
466
+ managers = [
467
+ component.mesh().polygon_attribute_manager()
468
+ for component_id in params.component_ids
469
+ if isinstance(
470
+ (component := geode_object.component(og.uuid(component_id))),
471
+ ComponentSurface,
472
+ )
473
+ ]
457
474
  return flask.make_response(
458
- {"attributes": attributes_metadata(attribute_manager)},
475
+ {"attributes": attributes_metadata(managers)},
459
476
  200,
460
477
  )
461
478
 
@@ -472,15 +489,16 @@ def model_component_polyhedron_attribute_names() -> flask.Response:
472
489
  geode_object = geode_functions.load_geode_object(params.id)
473
490
  if not isinstance(geode_object, GeodeModel):
474
491
  flask.abort(400, f"{params.id} is not a GeodeModel")
475
- component = geode_object.component(og.uuid(params.component_id))
476
- if not isinstance(component, get_args(ComponentMesh)):
477
- flask.abort(400, f"{params.component_id} is not a valid ComponentMesh")
478
- mesh = component.mesh()
479
- if not hasattr(mesh, "polyhedron_attribute_manager"):
480
- flask.abort(400, "Component does not have polyhedra")
481
- attribute_manager = mesh.polyhedron_attribute_manager()
492
+ managers = [
493
+ component.mesh().polyhedron_attribute_manager()
494
+ for component_id in params.component_ids
495
+ if isinstance(
496
+ (component := geode_object.component(og.uuid(component_id))),
497
+ ComponentBlock,
498
+ )
499
+ ]
482
500
  return flask.make_response(
483
- {"attributes": attributes_metadata(attribute_manager)},
501
+ {"attributes": attributes_metadata(managers)},
484
502
  200,
485
503
  )
486
504
 
@@ -35,9 +35,7 @@ def point_set() -> flask.Response:
35
35
  for point in params.points:
36
36
  builder.create_point(opengeode.Point3D([point.x, point.y, point.z]))
37
37
 
38
- result = utils_functions.generate_native_viewable_and_light_viewable_from_object(
39
- pointset
40
- )
38
+ result = utils_functions.generate_files_from_object(pointset)
41
39
  return flask.make_response(result, 200)
42
40
 
43
41
 
@@ -61,9 +59,7 @@ def edged_curve() -> flask.Response:
61
59
  for edge in params.edges:
62
60
  builder.create_edge_with_vertices(edge[0], edge[1])
63
61
 
64
- result = utils_functions.generate_native_viewable_and_light_viewable_from_object(
65
- edged_curve_obj
66
- )
62
+ result = utils_functions.generate_files_from_object(edged_curve_obj)
67
63
  return flask.make_response(result, 200)
68
64
 
69
65
 
@@ -89,7 +85,5 @@ def polygonal_surface() -> flask.Response:
89
85
 
90
86
  builder.compute_polygon_adjacencies()
91
87
 
92
- result = utils_functions.generate_native_viewable_and_light_viewable_from_object(
93
- polygonal_surface_obj
94
- )
88
+ result = utils_functions.generate_files_from_object(polygonal_surface_obj)
95
89
  return flask.make_response(result, 200)
@@ -7,11 +7,15 @@
7
7
  "type": "string",
8
8
  "minLength": 1
9
9
  },
10
- "component_id": {
11
- "type": "string",
12
- "minLength": 1
10
+ "component_ids": {
11
+ "type": "array",
12
+ "items": {
13
+ "type": "string",
14
+ "minLength": 1
15
+ },
16
+ "minItems": 1
13
17
  }
14
18
  },
15
- "required": ["id", "component_id"],
19
+ "required": ["id", "component_ids"],
16
20
  "additionalProperties": false
17
21
  }
@@ -1,5 +1,6 @@
1
1
  from dataclasses_json import DataClassJsonMixin
2
2
  from dataclasses import dataclass
3
+ from typing import List
3
4
 
4
5
 
5
6
  @dataclass
@@ -7,5 +8,5 @@ class ModelComponentEdgeAttributeNames(DataClassJsonMixin):
7
8
  def __post_init__(self) -> None:
8
9
  print(self, flush=True)
9
10
 
10
- component_id: str
11
+ component_ids: List[str]
11
12
  id: str
@@ -7,11 +7,15 @@
7
7
  "type": "string",
8
8
  "minLength": 1
9
9
  },
10
- "component_id": {
11
- "type": "string",
12
- "minLength": 1
10
+ "component_ids": {
11
+ "type": "array",
12
+ "items": {
13
+ "type": "string",
14
+ "minLength": 1
15
+ },
16
+ "minItems": 1
13
17
  }
14
18
  },
15
- "required": ["id", "component_id"],
19
+ "required": ["id", "component_ids"],
16
20
  "additionalProperties": false
17
21
  }
@@ -1,5 +1,6 @@
1
1
  from dataclasses_json import DataClassJsonMixin
2
2
  from dataclasses import dataclass
3
+ from typing import List
3
4
 
4
5
 
5
6
  @dataclass
@@ -7,5 +8,5 @@ class ModelComponentPolygonAttributeNames(DataClassJsonMixin):
7
8
  def __post_init__(self) -> None:
8
9
  print(self, flush=True)
9
10
 
10
- component_id: str
11
+ component_ids: List[str]
11
12
  id: str