OpenGeodeWeb-Back 6.17.0rc2__tar.gz → 6.17.0rc3__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 (176) hide show
  1. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/PKG-INFO +1 -1
  2. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/pyproject.toml +1 -1
  3. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/OpenGeodeWeb_Back.egg-info/PKG-INFO +1 -1
  4. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt +4 -0
  5. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/blueprint_routes.py +20 -0
  6. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/create/blueprint_create.py +22 -0
  7. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/create/schemas/__init__.py +1 -0
  8. opengeodeweb_back-6.17.0rc3/src/opengeodeweb_back/routes/create/schemas/horizon_stack.json +192 -0
  9. opengeodeweb_back-6.17.0rc3/src/opengeodeweb_back/routes/create/schemas/horizon_stack.py +82 -0
  10. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/__init__.py +1 -0
  11. opengeodeweb_back-6.17.0rc3/src/opengeodeweb_back/routes/schemas/horizon_stack_info.json +70 -0
  12. opengeodeweb_back-6.17.0rc3/src/opengeodeweb_back/routes/schemas/horizon_stack_info.py +50 -0
  13. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/tests/test_create_routes.py +72 -0
  14. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/LICENSE +0 -0
  15. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/README.md +0 -0
  16. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/requirements.txt +0 -0
  17. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/setup.cfg +0 -0
  18. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/OpenGeodeWeb_Back.egg-info/dependency_links.txt +0 -0
  19. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/OpenGeodeWeb_Back.egg-info/entry_points.txt +0 -0
  20. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/OpenGeodeWeb_Back.egg-info/requires.txt +0 -0
  21. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/OpenGeodeWeb_Back.egg-info/top_level.txt +0 -0
  22. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/__init__.py +0 -0
  23. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/app.py +0 -0
  24. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/app_config.py +0 -0
  25. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/basemap/__init__.py +0 -0
  26. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/basemap/basemap_mesh.py +0 -0
  27. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/basemap/basemap_providers.py +0 -0
  28. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/basemap/basemap_tiles.py +0 -0
  29. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/crs/__init__.py +0 -0
  30. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/crs/crs_alignment.py +0 -0
  31. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/crs/crs_assignment.py +0 -0
  32. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/crs/crs_functions.py +0 -0
  33. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_functions.py +0 -0
  34. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/__init__.py +0 -0
  35. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/crs_coordinates.py +0 -0
  36. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_brep.py +0 -0
  37. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_cross_section.py +0 -0
  38. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_edged_curve2d.py +0 -0
  39. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_edged_curve3d.py +0 -0
  40. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_graph.py +0 -0
  41. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_grid2d.py +0 -0
  42. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_grid3d.py +0 -0
  43. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_horizon_stack3d.py +0 -0
  44. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_hybrid_solid3d.py +0 -0
  45. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_implicit_cross_section.py +0 -0
  46. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_implicit_structural_model.py +0 -0
  47. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid2d.py +0 -0
  48. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid3d.py +0 -0
  49. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_mesh.py +0 -0
  50. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_model.py +0 -0
  51. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_object.py +0 -0
  52. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_point_set2d.py +0 -0
  53. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_point_set3d.py +0 -0
  54. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface2d.py +0 -0
  55. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface3d.py +0 -0
  56. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_polyhedral_solid3d.py +0 -0
  57. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_raster_image2d.py +0 -0
  58. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py +0 -0
  59. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_regular_grid2d.py +0 -0
  60. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_regular_grid3d.py +0 -0
  61. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_section.py +0 -0
  62. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_solid_mesh3d.py +0 -0
  63. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_structural_model.py +0 -0
  64. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py +0 -0
  65. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_surface_mesh3d.py +0 -0
  66. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_tetrahedral_solid3d.py +0 -0
  67. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface2d.py +0 -0
  68. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface3d.py +0 -0
  69. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/geode_objects/geode_vertex_set.py +0 -0
  70. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/py.typed +0 -0
  71. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/__init__.py +0 -0
  72. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/basemap/__init__.py +0 -0
  73. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/basemap/blueprint_basemap.py +0 -0
  74. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/basemap/schemas/__init__.py +0 -0
  75. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/basemap/schemas/build.json +0 -0
  76. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/basemap/schemas/build.py +0 -0
  77. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/basemap/schemas/delete.json +0 -0
  78. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/basemap/schemas/delete.py +0 -0
  79. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/create/__init__.py +0 -0
  80. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/create/schemas/edged_curve.json +0 -0
  81. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/create/schemas/edged_curve.py +0 -0
  82. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/create/schemas/point_set.json +0 -0
  83. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/create/schemas/point_set.py +0 -0
  84. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/create/schemas/polygonal_surface.json +0 -0
  85. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/create/schemas/polygonal_surface.py +0 -0
  86. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/crs/__init__.py +0 -0
  87. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/crs/blueprint_crs.py +0 -0
  88. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/crs/schemas/__init__.py +0 -0
  89. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/crs/schemas/active.json +0 -0
  90. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/crs/schemas/active.py +0 -0
  91. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/crs/schemas/align.json +0 -0
  92. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/crs/schemas/align.py +0 -0
  93. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/crs/schemas/assign_geographic.json +0 -0
  94. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/crs/schemas/assign_geographic.py +0 -0
  95. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/crs/schemas/convert_geographic.json +0 -0
  96. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/crs/schemas/convert_geographic.py +0 -0
  97. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/crs/schemas/geographic_list.json +0 -0
  98. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/crs/schemas/geographic_list.py +0 -0
  99. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/allowed_files.json +0 -0
  100. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/allowed_files.py +0 -0
  101. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/allowed_objects.json +0 -0
  102. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/allowed_objects.py +0 -0
  103. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/apply_time_series.json +0 -0
  104. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/apply_time_series.py +0 -0
  105. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.json +0 -0
  106. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.py +0 -0
  107. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/cell_attribute_range.json +0 -0
  108. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/cell_attribute_range.py +0 -0
  109. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/data_missing_files.json +0 -0
  110. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/data_missing_files.py +0 -0
  111. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.json +0 -0
  112. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.py +0 -0
  113. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/edge_attribute_range.json +0 -0
  114. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/edge_attribute_range.py +0 -0
  115. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/export_project.json +0 -0
  116. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/export_project.py +0 -0
  117. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.json +0 -0
  118. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.py +0 -0
  119. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json +0 -0
  120. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.py +0 -0
  121. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/import_project.json +0 -0
  122. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/import_project.py +0 -0
  123. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/kill.json +0 -0
  124. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/kill.py +0 -0
  125. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_names.json +0 -0
  126. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_names.py +0 -0
  127. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_range.json +0 -0
  128. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_range.py +0 -0
  129. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_names.json +0 -0
  130. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_names.py +0 -0
  131. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_range.json +0 -0
  132. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_range.py +0 -0
  133. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_names.json +0 -0
  134. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_names.py +0 -0
  135. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_range.json +0 -0
  136. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_range.py +0 -0
  137. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_names.json +0 -0
  138. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_names.py +0 -0
  139. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_range.json +0 -0
  140. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_range.py +0 -0
  141. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/ping.json +0 -0
  142. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/ping.py +0 -0
  143. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.json +0 -0
  144. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.py +0 -0
  145. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/polygon_attribute_range.json +0 -0
  146. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/polygon_attribute_range.py +0 -0
  147. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.json +0 -0
  148. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.py +0 -0
  149. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_range.json +0 -0
  150. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_range.py +0 -0
  151. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/save_viewable_file.json +0 -0
  152. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/save_viewable_file.py +0 -0
  153. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/texture_coordinates.json +0 -0
  154. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/texture_coordinates.py +0 -0
  155. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/time_series_allowed_objects.json +0 -0
  156. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/time_series_allowed_objects.py +0 -0
  157. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/time_series_missing_files.json +0 -0
  158. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/time_series_missing_files.py +0 -0
  159. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/upload_file.json +0 -0
  160. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/upload_file.py +0 -0
  161. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/validate.json +0 -0
  162. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/validate.py +0 -0
  163. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.json +0 -0
  164. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.py +0 -0
  165. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/vertex_attribute_range.json +0 -0
  166. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/routes/schemas/vertex_attribute_range.py +0 -0
  167. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/test_utils.py +0 -0
  168. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/typed_route.py +0 -0
  169. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/src/opengeodeweb_back/utils_functions.py +0 -0
  170. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/tests/test_basemap.py +0 -0
  171. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/tests/test_crs_routes.py +0 -0
  172. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/tests/test_events.py +0 -0
  173. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/tests/test_geode_functions.py +0 -0
  174. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/tests/test_routes.py +0 -0
  175. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/tests/test_typed_routes.py +0 -0
  176. {opengeodeweb_back-6.17.0rc2 → opengeodeweb_back-6.17.0rc3}/tests/test_utils_functions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 6.17.0rc2
3
+ Version: 6.17.0rc3
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "OpenGeodeWeb-Back"
7
- version = "6.17.0-rc.2"
7
+ version = "6.17.0-rc.3"
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"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 6.17.0rc2
3
+ Version: 6.17.0rc3
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
@@ -74,6 +74,8 @@ src/opengeodeweb_back/routes/create/blueprint_create.py
74
74
  src/opengeodeweb_back/routes/create/schemas/__init__.py
75
75
  src/opengeodeweb_back/routes/create/schemas/edged_curve.json
76
76
  src/opengeodeweb_back/routes/create/schemas/edged_curve.py
77
+ src/opengeodeweb_back/routes/create/schemas/horizon_stack.json
78
+ src/opengeodeweb_back/routes/create/schemas/horizon_stack.py
77
79
  src/opengeodeweb_back/routes/create/schemas/point_set.json
78
80
  src/opengeodeweb_back/routes/create/schemas/point_set.py
79
81
  src/opengeodeweb_back/routes/create/schemas/polygonal_surface.json
@@ -114,6 +116,8 @@ src/opengeodeweb_back/routes/schemas/geode_object_inheritance.json
114
116
  src/opengeodeweb_back/routes/schemas/geode_object_inheritance.py
115
117
  src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json
116
118
  src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.py
119
+ src/opengeodeweb_back/routes/schemas/horizon_stack_info.json
120
+ src/opengeodeweb_back/routes/schemas/horizon_stack_info.py
117
121
  src/opengeodeweb_back/routes/schemas/import_project.json
118
122
  src/opengeodeweb_back/routes/schemas/import_project.py
119
123
  src/opengeodeweb_back/routes/schemas/kill.json
@@ -35,6 +35,7 @@ from opengeodeweb_back.geode_objects.geode_brep import GeodeBRep
35
35
  from opengeodeweb_back.geode_objects.geode_graph import GeodeGraph
36
36
  from opengeodeweb_back.geode_objects.geode_grid2d import GeodeGrid2D
37
37
  from opengeodeweb_back.geode_objects.geode_grid3d import GeodeGrid3D
38
+ from opengeodeweb_back.geode_objects.geode_horizon_stack3d import GeodeHorizonStack3D
38
39
  from opengeodeweb_back.geode_objects.geode_mesh import GeodeMesh
39
40
  from opengeodeweb_back.geode_objects.geode_model import GeodeModel
40
41
  from opengeodeweb_back.geode_objects.geode_solid_mesh3d import GeodeSolidMesh3D
@@ -772,6 +773,25 @@ def model_component_polyhedron_attribute_range(
772
773
  )
773
774
 
774
775
 
776
+ @typed_route(routes, schemas.horizon_stack_info_route)
777
+ def horizon_stack_info(params: schemas.HorizonStackInfo) -> schemas.HorizonStackInfoResponse:
778
+ """Horizons and stratigraphic units of a horizon stack, top to bottom."""
779
+ geode_object = geode_functions.load_geode_object(params.id)
780
+ if not isinstance(geode_object, GeodeHorizonStack3D):
781
+ flask.abort(400, f"{params.id} is not a HorizonStack3D")
782
+ stack = geode_object.horizon_stack
783
+ return schemas.HorizonStackInfoResponse(
784
+ horizons=[
785
+ schemas.horizon_stack_info.Horizon(id=horizon.id().string(), name=horizon.name() or "")
786
+ for horizon in stack.top_to_bottom_horizons()
787
+ ],
788
+ units=[
789
+ schemas.horizon_stack_info.Unit(id=unit.id().string(), name=unit.name() or "")
790
+ for unit in stack.top_to_bottom_units()
791
+ ],
792
+ )
793
+
794
+
775
795
  @typed_route(routes, schemas.ping_route)
776
796
  def ping(_params: schemas.Ping) -> schemas.PingResponse:
777
797
  flask.current_app.config.update(LAST_PING_TIME=time.time())
@@ -3,10 +3,12 @@
3
3
  # Third party imports
4
4
  import flask
5
5
  import opengeode
6
+ import opengeode_geosciences
6
7
 
7
8
  # Local application imports
8
9
  from opengeodeweb_back import utils_functions
9
10
  from opengeodeweb_back.geode_objects.geode_edged_curve3d import GeodeEdgedCurve3D
11
+ from opengeodeweb_back.geode_objects.geode_horizon_stack3d import GeodeHorizonStack3D
10
12
  from opengeodeweb_back.geode_objects.geode_point_set3d import GeodePointSet3D
11
13
  from opengeodeweb_back.geode_objects.geode_polygonal_surface3d import (
12
14
  GeodePolygonalSurface3D,
@@ -65,3 +67,23 @@ def polygonal_surface(
65
67
  return schemas.PolygonalSurfaceResponse.from_dict(
66
68
  utils_functions.generate_files_from_object(polygonal_surface_obj)
67
69
  )
70
+
71
+
72
+ @typed_route(routes, schemas.horizon_stack_route)
73
+ def horizon_stack(params: schemas.HorizonStack) -> schemas.HorizonStackResponse:
74
+ """Endpoint to create a horizon stack from its horizon and unit names, top to bottom."""
75
+ if len(params.unit_names) not in (0, len(params.horizons) + 1):
76
+ flask.abort(
77
+ 400,
78
+ f"Expected {len(params.horizons) + 1} unit names for {len(params.horizons)} horizons,"
79
+ f" got {len(params.unit_names)}",
80
+ )
81
+ horizon_stack_obj = GeodeHorizonStack3D(
82
+ opengeode_geosciences.horizons_stack_from_top_to_bottom_names_3d(
83
+ params.horizons, params.unit_names
84
+ )
85
+ )
86
+ horizon_stack_obj.builder().set_name(params.name)
87
+ return schemas.HorizonStackResponse.from_dict(
88
+ utils_functions.generate_files_from_object(horizon_stack_obj)
89
+ )
@@ -1,3 +1,4 @@
1
1
  from .polygonal_surface import *
2
2
  from .point_set import *
3
+ from .horizon_stack import *
3
4
  from .edged_curve import *
@@ -0,0 +1,192 @@
1
+ {
2
+ "route": "/horizon_stack",
3
+ "methods": [
4
+ "POST"
5
+ ],
6
+ "type": "object",
7
+ "properties": {
8
+ "name": {
9
+ "type": "string",
10
+ "minLength": 1
11
+ },
12
+ "horizons": {
13
+ "type": "array",
14
+ "items": {
15
+ "type": "string",
16
+ "minLength": 1
17
+ },
18
+ "minItems": 1,
19
+ "uniqueItems": true
20
+ },
21
+ "unit_names": {
22
+ "type": "array",
23
+ "items": {
24
+ "type": "string"
25
+ }
26
+ }
27
+ },
28
+ "required": [
29
+ "name",
30
+ "horizons",
31
+ "unit_names"
32
+ ],
33
+ "additionalProperties": false,
34
+ "response": {
35
+ "type": "object",
36
+ "properties": {
37
+ "native_file": {
38
+ "type": "string"
39
+ },
40
+ "id": {
41
+ "type": "string",
42
+ "minLength": 32,
43
+ "maxLength": 32
44
+ },
45
+ "name": {
46
+ "type": "string"
47
+ },
48
+ "viewer_type": {
49
+ "type": "string"
50
+ },
51
+ "is_viewable": {
52
+ "type": "boolean"
53
+ },
54
+ "geode_object_type": {
55
+ "type": "string"
56
+ },
57
+ "viewable_file": {
58
+ "type": "string"
59
+ },
60
+ "binary_light_viewable": {
61
+ "type": "string"
62
+ },
63
+ "nb_vertices": {
64
+ "type": "integer"
65
+ },
66
+ "mesh_components": {
67
+ "type": "array",
68
+ "items": {
69
+ "type": "object",
70
+ "properties": {
71
+ "viewer_id": {
72
+ "type": "integer"
73
+ },
74
+ "geode_id": {
75
+ "type": "string",
76
+ "minLength": 36,
77
+ "maxLength": 36
78
+ },
79
+ "name": {
80
+ "type": "string"
81
+ },
82
+ "type": {
83
+ "type": "string"
84
+ },
85
+ "boundaries": {
86
+ "type": "array",
87
+ "items": {
88
+ "type": "string",
89
+ "minLength": 36,
90
+ "maxLength": 36
91
+ }
92
+ },
93
+ "internals": {
94
+ "type": "array",
95
+ "items": {
96
+ "type": "string",
97
+ "minLength": 36,
98
+ "maxLength": 36
99
+ }
100
+ },
101
+ "is_active": {
102
+ "type": "boolean"
103
+ }
104
+ },
105
+ "required": [
106
+ "viewer_id",
107
+ "geode_id",
108
+ "name",
109
+ "type",
110
+ "boundaries",
111
+ "internals",
112
+ "is_active"
113
+ ],
114
+ "additionalProperties": false
115
+ }
116
+ },
117
+ "collection_components": {
118
+ "type": "array",
119
+ "items": {
120
+ "type": "object",
121
+ "properties": {
122
+ "geode_id": {
123
+ "type": "string",
124
+ "minLength": 36,
125
+ "maxLength": 36
126
+ },
127
+ "name": {
128
+ "type": "string"
129
+ },
130
+ "type": {
131
+ "type": "string"
132
+ },
133
+ "items": {
134
+ "type": "array",
135
+ "items": {
136
+ "type": "string",
137
+ "minLength": 36,
138
+ "maxLength": 36
139
+ }
140
+ },
141
+ "is_active": {
142
+ "type": "boolean"
143
+ }
144
+ },
145
+ "required": [
146
+ "geode_id",
147
+ "name",
148
+ "type",
149
+ "items",
150
+ "is_active"
151
+ ],
152
+ "additionalProperties": false
153
+ }
154
+ },
155
+ "geode_id": {
156
+ "type": "string",
157
+ "minLength": 36,
158
+ "maxLength": 36
159
+ },
160
+ "crs": {
161
+ "type": "object",
162
+ "properties": {
163
+ "authority": {
164
+ "type": "string"
165
+ },
166
+ "code": {
167
+ "type": "string"
168
+ },
169
+ "name": {
170
+ "type": "string"
171
+ }
172
+ },
173
+ "required": [
174
+ "authority",
175
+ "code",
176
+ "name"
177
+ ],
178
+ "additionalProperties": false
179
+ }
180
+ },
181
+ "required": [
182
+ "native_file",
183
+ "id",
184
+ "name",
185
+ "viewer_type",
186
+ "is_viewable",
187
+ "geode_object_type",
188
+ "geode_id"
189
+ ],
190
+ "additionalProperties": false
191
+ }
192
+ }
@@ -0,0 +1,82 @@
1
+ from pathlib import Path
2
+ from opengeodeweb_microservice.schemas import Route, load_schema
3
+ from typing import List, Optional
4
+ from dataclasses_json import DataClassJsonMixin
5
+ from opengeodeweb_microservice.schemas import print_dataclass
6
+ from dataclasses import dataclass
7
+ from typing import List
8
+
9
+
10
+ @dataclass
11
+ class HorizonStack(DataClassJsonMixin):
12
+ def __post_init__(self) -> None:
13
+ print_dataclass(self)
14
+
15
+ horizons: List[str]
16
+ name: str
17
+ unit_names: List[str]
18
+
19
+
20
+ @dataclass
21
+ class CollectionComponent(DataClassJsonMixin):
22
+ def __post_init__(self) -> None:
23
+ print_dataclass(self)
24
+
25
+ geode_id: str
26
+ is_active: bool
27
+ items: List[str]
28
+ name: str
29
+ type: str
30
+
31
+
32
+ @dataclass
33
+ class CRS(DataClassJsonMixin):
34
+ def __post_init__(self) -> None:
35
+ print_dataclass(self)
36
+
37
+ authority: str
38
+ code: str
39
+ name: str
40
+
41
+
42
+ @dataclass
43
+ class MeshComponent(DataClassJsonMixin):
44
+ def __post_init__(self) -> None:
45
+ print_dataclass(self)
46
+
47
+ boundaries: List[str]
48
+ geode_id: str
49
+ internals: List[str]
50
+ is_active: bool
51
+ name: str
52
+ type: str
53
+ viewer_id: int
54
+
55
+
56
+ @dataclass
57
+ class HorizonStackResponse(DataClassJsonMixin):
58
+ def __post_init__(self) -> None:
59
+ print_dataclass(self)
60
+
61
+ geode_id: str
62
+ geode_object_type: str
63
+ id: str
64
+ is_viewable: bool
65
+ name: str
66
+ native_file: str
67
+ viewer_type: str
68
+ binary_light_viewable: Optional[str] = None
69
+ collection_components: Optional[List[CollectionComponent]] = None
70
+ crs: Optional[CRS] = None
71
+ mesh_components: Optional[List[MeshComponent]] = None
72
+ nb_vertices: Optional[int] = None
73
+ viewable_file: Optional[str] = None
74
+
75
+
76
+ horizon_stack_route = Route(
77
+ schema=load_schema(Path(__file__)),
78
+ params=HorizonStack,
79
+ response=HorizonStackResponse,
80
+ )
81
+
82
+ __all__ = ["HorizonStack", "HorizonStackResponse", "horizon_stack_route"]
@@ -21,6 +21,7 @@ from .model_component_edge_attribute_range import *
21
21
  from .model_component_edge_attribute_names import *
22
22
  from .kill import *
23
23
  from .import_project import *
24
+ from .horizon_stack_info import *
24
25
  from .geode_objects_and_output_extensions import *
25
26
  from .geode_object_inheritance import *
26
27
  from .export_project import *
@@ -0,0 +1,70 @@
1
+ {
2
+ "route": "/horizon_stack_info",
3
+ "methods": [
4
+ "POST"
5
+ ],
6
+ "type": "object",
7
+ "properties": {
8
+ "id": {
9
+ "type": "string",
10
+ "minLength": 32,
11
+ "maxLength": 32
12
+ }
13
+ },
14
+ "required": [
15
+ "id"
16
+ ],
17
+ "additionalProperties": false,
18
+ "response": {
19
+ "type": "object",
20
+ "properties": {
21
+ "horizons": {
22
+ "type": "array",
23
+ "items": {
24
+ "type": "object",
25
+ "properties": {
26
+ "id": {
27
+ "type": "string",
28
+ "minLength": 36,
29
+ "maxLength": 36
30
+ },
31
+ "name": {
32
+ "type": "string"
33
+ }
34
+ },
35
+ "required": [
36
+ "id",
37
+ "name"
38
+ ],
39
+ "additionalProperties": false
40
+ }
41
+ },
42
+ "units": {
43
+ "type": "array",
44
+ "items": {
45
+ "type": "object",
46
+ "properties": {
47
+ "id": {
48
+ "type": "string",
49
+ "minLength": 36,
50
+ "maxLength": 36
51
+ },
52
+ "name": {
53
+ "type": "string"
54
+ }
55
+ },
56
+ "required": [
57
+ "id",
58
+ "name"
59
+ ],
60
+ "additionalProperties": false
61
+ }
62
+ }
63
+ },
64
+ "required": [
65
+ "horizons",
66
+ "units"
67
+ ],
68
+ "additionalProperties": false
69
+ }
70
+ }
@@ -0,0 +1,50 @@
1
+ from pathlib import Path
2
+ from opengeodeweb_microservice.schemas import Route, load_schema
3
+ from typing import List
4
+ from dataclasses_json import DataClassJsonMixin
5
+ from opengeodeweb_microservice.schemas import print_dataclass
6
+ from dataclasses import dataclass
7
+
8
+
9
+ @dataclass
10
+ class HorizonStackInfo(DataClassJsonMixin):
11
+ def __post_init__(self) -> None:
12
+ print_dataclass(self)
13
+
14
+ id: str
15
+
16
+
17
+ @dataclass
18
+ class Horizon(DataClassJsonMixin):
19
+ def __post_init__(self) -> None:
20
+ print_dataclass(self)
21
+
22
+ id: str
23
+ name: str
24
+
25
+
26
+ @dataclass
27
+ class Unit(DataClassJsonMixin):
28
+ def __post_init__(self) -> None:
29
+ print_dataclass(self)
30
+
31
+ id: str
32
+ name: str
33
+
34
+
35
+ @dataclass
36
+ class HorizonStackInfoResponse(DataClassJsonMixin):
37
+ def __post_init__(self) -> None:
38
+ print_dataclass(self)
39
+
40
+ horizons: List[Horizon]
41
+ units: List[Unit]
42
+
43
+
44
+ horizon_stack_info_route = Route(
45
+ schema=load_schema(Path(__file__)),
46
+ params=HorizonStackInfo,
47
+ response=HorizonStackInfoResponse,
48
+ )
49
+
50
+ __all__ = ["HorizonStackInfo", "HorizonStackInfoResponse", "horizon_stack_info_route"]
@@ -152,3 +152,75 @@ def test_create_polygonal_surface(client: FlaskClient, surface_data: test_utils.
152
152
 
153
153
  # Test with missing parameters
154
154
  test_utils.test_route_wrong_params(client, route, lambda: copy.deepcopy(surface_data))
155
+
156
+
157
+ @pytest.fixture
158
+ def horizon_stack_data() -> test_utils.JsonData:
159
+ return {
160
+ "name": "test_horizon_stack",
161
+ "horizons": ["Top", "Middle", "Bottom"],
162
+ "unit_names": ["Above", "Upper", "Lower", "Below"],
163
+ }
164
+
165
+
166
+ def test_create_horizon_stack(client: FlaskClient, horizon_stack_data: test_utils.JsonData) -> None:
167
+ """Test the creation of a horizon stack from scratch, then read it back top to bottom."""
168
+ route: str = "/opengeodeweb_back/create/horizon_stack"
169
+
170
+ response = client.post(route, json=horizon_stack_data)
171
+ assert response.status_code == 200
172
+
173
+ response_data = response.get_json()
174
+ assert response_data["name"] == horizon_stack_data["name"]
175
+ assert response_data["geode_object_type"] == "HorizonStack3D"
176
+ assert response_data["is_viewable"] is False
177
+
178
+ info = client.post("/opengeodeweb_back/horizon_stack_info", json={"id": response_data["id"]})
179
+ assert info.status_code == 200
180
+ info_data = info.get_json()
181
+ assert [horizon["name"] for horizon in info_data["horizons"]] == horizon_stack_data["horizons"]
182
+ assert [unit["name"] for unit in info_data["units"]] == horizon_stack_data["unit_names"]
183
+
184
+ test_utils.test_route_wrong_params(client, route, lambda: copy.deepcopy(horizon_stack_data))
185
+
186
+
187
+ def test_create_horizon_stack_without_unit_names(client: FlaskClient) -> None:
188
+ """Unit names are optional: an empty list creates unnamed units."""
189
+ route: str = "/opengeodeweb_back/create/horizon_stack"
190
+ response = client.post(route, json={"name": "stack", "horizons": ["H1"], "unit_names": []})
191
+ assert response.status_code == 200
192
+
193
+ info = client.post(
194
+ "/opengeodeweb_back/horizon_stack_info", json={"id": response.get_json()["id"]}
195
+ )
196
+ assert info.status_code == 200
197
+ assert len(info.get_json()["units"]) == 2
198
+
199
+
200
+ def test_create_horizon_stack_wrong_unit_count(client: FlaskClient) -> None:
201
+ """There must be one more unit than horizons."""
202
+ route: str = "/opengeodeweb_back/create/horizon_stack"
203
+ response = client.post(
204
+ route, json={"name": "stack", "horizons": ["H1", "H2"], "unit_names": ["U1", "U2"]}
205
+ )
206
+ assert response.status_code == 400
207
+
208
+
209
+ def test_create_horizon_stack_duplicate_horizons(client: FlaskClient) -> None:
210
+ """Horizon names must be unique."""
211
+ route: str = "/opengeodeweb_back/create/horizon_stack"
212
+ response = client.post(
213
+ route, json={"name": "stack", "horizons": ["H1", "H1"], "unit_names": []}
214
+ )
215
+ assert response.status_code == 400
216
+
217
+
218
+ def test_horizon_stack_info_wrong_type(
219
+ client: FlaskClient, point_data: test_utils.JsonData
220
+ ) -> None:
221
+ """Reading the horizon stack of another object is a client error."""
222
+ point_set = client.post("/opengeodeweb_back/create/point_set", json=point_data)
223
+ info = client.post(
224
+ "/opengeodeweb_back/horizon_stack_info", json={"id": point_set.get_json()["id"]}
225
+ )
226
+ assert info.status_code == 400