OpenGeodeWeb-Back 5.11.0rc1__tar.gz → 5.11.2__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.

Potentially problematic release.


This version of OpenGeodeWeb-Back might be problematic. Click here for more details.

Files changed (70) hide show
  1. {opengeodeweb_back-5.11.0rc1/src/OpenGeodeWeb_Back.egg-info → opengeodeweb_back-5.11.2}/PKG-INFO +2 -2
  2. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/pyproject.toml +1 -1
  3. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/requirements.txt +1 -1
  4. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2/src/OpenGeodeWeb_Back.egg-info}/PKG-INFO +2 -2
  5. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt +21 -0
  6. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/OpenGeodeWeb_Back.egg-info/requires.txt +1 -1
  7. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/geode_functions.py +2 -2
  8. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/blueprint_routes.py +270 -0
  9. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/create/blueprint_create.py +71 -0
  10. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/create/schemas/__init__.py +2 -0
  11. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/create/schemas/create_aoi.py +19 -0
  12. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/create/schemas/create_point.py +10 -0
  13. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/models/blueprint_models.py +49 -0
  14. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/models/schemas/__init__.py +2 -0
  15. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/models/schemas/mesh_components.py +7 -0
  16. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/models/schemas/vtm_component_indices.py +7 -0
  17. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/__init__.py +14 -0
  18. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/allowed_files.py +8 -0
  19. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/allowed_objects.py +9 -0
  20. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.py +8 -0
  21. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.py +7 -0
  22. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/inspect_file.py +8 -0
  23. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/kill.py +7 -0
  24. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/missing_files.py +8 -0
  25. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/ping.py +7 -0
  26. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.py +7 -0
  27. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.py +7 -0
  28. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/save_viewable_file.py +8 -0
  29. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/texture_coordinates.py +7 -0
  30. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/upload_file.py +8 -0
  31. opengeodeweb_back-5.11.2/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.py +7 -0
  32. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/utils_functions.py +2 -4
  33. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/tests/test_create_routes.py +1 -1
  34. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/tests/test_models_routes.py +5 -9
  35. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/tests/test_routes.py +18 -14
  36. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/tests/test_utils_functions.py +14 -6
  37. opengeodeweb_back-5.11.0rc1/src/opengeodeweb_back/routes/blueprint_routes.py +0 -359
  38. opengeodeweb_back-5.11.0rc1/src/opengeodeweb_back/routes/create/blueprint_create.py +0 -117
  39. opengeodeweb_back-5.11.0rc1/src/opengeodeweb_back/routes/models/blueprint_models.py +0 -54
  40. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/LICENSE +0 -0
  41. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/README.md +0 -0
  42. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/setup.cfg +0 -0
  43. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/OpenGeodeWeb_Back.egg-info/dependency_links.txt +0 -0
  44. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/OpenGeodeWeb_Back.egg-info/entry_points.txt +0 -0
  45. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/OpenGeodeWeb_Back.egg-info/top_level.txt +0 -0
  46. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/__init__.py +0 -0
  47. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/app.py +0 -0
  48. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/app_config.py +0 -0
  49. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/geode_objects.py +0 -0
  50. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/py.typed +0 -0
  51. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/create/schemas/create_aoi.json +0 -0
  52. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/create/schemas/create_point.json +0 -0
  53. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/models/schemas/mesh_components.json +0 -0
  54. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/models/schemas/vtm_component_indices.json +0 -0
  55. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/allowed_files.json +0 -0
  56. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/allowed_objects.json +0 -0
  57. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json +0 -0
  58. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json +0 -0
  59. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/inspect_file.json +0 -0
  60. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/kill.json +0 -0
  61. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/missing_files.json +0 -0
  62. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/ping.json +0 -0
  63. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.json +0 -0
  64. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.json +0 -0
  65. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/save_viewable_file.json +0 -0
  66. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/texture_coordinates.json +0 -0
  67. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/upload_file.json +0 -0
  68. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.json +0 -0
  69. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/src/opengeodeweb_back/test_utils.py +0 -0
  70. {opengeodeweb_back-5.11.0rc1 → opengeodeweb_back-5.11.2}/tests/test_geode_functions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 5.11.0rc1
3
+ Version: 5.11.2
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.1
27
27
  Requires-Dist: opengeode-inspector==6.8.2
28
28
  Requires-Dist: opengeode-io==7.4.2
29
29
  Requires-Dist: werkzeug==3.1.2
30
- Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.5
30
+ Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.7rc1
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 = "5.11.0-rc.1"
7
+ version = "5.11.2"
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.5
63
+ opengeodeweb-microservice==1.*,>=1.0.7rc1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 5.11.0rc1
3
+ Version: 5.11.2
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.1
27
27
  Requires-Dist: opengeode-inspector==6.8.2
28
28
  Requires-Dist: opengeode-io==7.4.2
29
29
  Requires-Dist: werkzeug==3.1.2
30
- Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.5
30
+ Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.7rc1
31
31
  Dynamic: license-file
32
32
 
33
33
  <h1 align="center">OpenGeodeWeb-Back<sup><i>by Geode-solutions</i></sup></h1>
@@ -18,25 +18,46 @@ src/opengeodeweb_back/test_utils.py
18
18
  src/opengeodeweb_back/utils_functions.py
19
19
  src/opengeodeweb_back/routes/blueprint_routes.py
20
20
  src/opengeodeweb_back/routes/create/blueprint_create.py
21
+ src/opengeodeweb_back/routes/create/schemas/__init__.py
21
22
  src/opengeodeweb_back/routes/create/schemas/create_aoi.json
23
+ src/opengeodeweb_back/routes/create/schemas/create_aoi.py
22
24
  src/opengeodeweb_back/routes/create/schemas/create_point.json
25
+ src/opengeodeweb_back/routes/create/schemas/create_point.py
23
26
  src/opengeodeweb_back/routes/models/blueprint_models.py
27
+ src/opengeodeweb_back/routes/models/schemas/__init__.py
24
28
  src/opengeodeweb_back/routes/models/schemas/mesh_components.json
29
+ src/opengeodeweb_back/routes/models/schemas/mesh_components.py
25
30
  src/opengeodeweb_back/routes/models/schemas/vtm_component_indices.json
31
+ src/opengeodeweb_back/routes/models/schemas/vtm_component_indices.py
32
+ src/opengeodeweb_back/routes/schemas/__init__.py
26
33
  src/opengeodeweb_back/routes/schemas/allowed_files.json
34
+ src/opengeodeweb_back/routes/schemas/allowed_files.py
27
35
  src/opengeodeweb_back/routes/schemas/allowed_objects.json
36
+ src/opengeodeweb_back/routes/schemas/allowed_objects.py
28
37
  src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json
38
+ src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.py
29
39
  src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json
40
+ src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.py
30
41
  src/opengeodeweb_back/routes/schemas/inspect_file.json
42
+ src/opengeodeweb_back/routes/schemas/inspect_file.py
31
43
  src/opengeodeweb_back/routes/schemas/kill.json
44
+ src/opengeodeweb_back/routes/schemas/kill.py
32
45
  src/opengeodeweb_back/routes/schemas/missing_files.json
46
+ src/opengeodeweb_back/routes/schemas/missing_files.py
33
47
  src/opengeodeweb_back/routes/schemas/ping.json
48
+ src/opengeodeweb_back/routes/schemas/ping.py
34
49
  src/opengeodeweb_back/routes/schemas/polygon_attribute_names.json
50
+ src/opengeodeweb_back/routes/schemas/polygon_attribute_names.py
35
51
  src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.json
52
+ src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.py
36
53
  src/opengeodeweb_back/routes/schemas/save_viewable_file.json
54
+ src/opengeodeweb_back/routes/schemas/save_viewable_file.py
37
55
  src/opengeodeweb_back/routes/schemas/texture_coordinates.json
56
+ src/opengeodeweb_back/routes/schemas/texture_coordinates.py
38
57
  src/opengeodeweb_back/routes/schemas/upload_file.json
58
+ src/opengeodeweb_back/routes/schemas/upload_file.py
39
59
  src/opengeodeweb_back/routes/schemas/vertex_attribute_names.json
60
+ src/opengeodeweb_back/routes/schemas/vertex_attribute_names.py
40
61
  tests/test_create_routes.py
41
62
  tests/test_geode_functions.py
42
63
  tests/test_models_routes.py
@@ -14,4 +14,4 @@ opengeode-geosciencesio==5.8.1
14
14
  opengeode-inspector==6.8.2
15
15
  opengeode-io==7.4.2
16
16
  werkzeug==3.1.2
17
- opengeodeweb-microservice==1.*,>=1.0.5
17
+ opengeodeweb-microservice==1.*,>=1.0.7rc1
@@ -175,7 +175,7 @@ def filter_geode_objects(key: str = None):
175
175
  return geode_objects_filtered_list
176
176
 
177
177
 
178
- def list_input_extensions(key: str = None):
178
+ def list_input_extensions(key: str | None = None) -> list[str]:
179
179
  extensions_list = []
180
180
  geode_objects_filtered_list = filter_geode_objects(key)
181
181
  for geode_object in geode_objects_filtered_list:
@@ -192,7 +192,7 @@ def has_creator(geode_object: str, extension: str):
192
192
 
193
193
  def list_geode_objects(
194
194
  file_absolute_path: str,
195
- key: str = None,
195
+ key: str | None = None,
196
196
  ):
197
197
  return_dict = {}
198
198
  file_extension = utils_functions.extension_from_filename(
@@ -0,0 +1,270 @@
1
+ # Standard library imports
2
+ import os
3
+ import time
4
+
5
+ # Third party imports
6
+ import flask
7
+ import werkzeug
8
+ from opengeodeweb_microservice.schemas import get_schemas_dict
9
+
10
+ # Local application imports
11
+ from opengeodeweb_back import geode_functions, utils_functions
12
+ from .models import blueprint_models
13
+ from . import schemas
14
+
15
+ routes = flask.Blueprint("routes", __name__, url_prefix="/opengeodeweb_back")
16
+
17
+
18
+ routes.register_blueprint(
19
+ blueprint_models.routes,
20
+ url_prefix=blueprint_models.routes.url_prefix,
21
+ name=blueprint_models.routes.name,
22
+ )
23
+
24
+ schemas_dict = get_schemas_dict(os.path.join(os.path.dirname(__file__), "schemas"))
25
+
26
+
27
+ @routes.route(
28
+ schemas_dict["allowed_files"]["route"],
29
+ methods=schemas_dict["allowed_files"]["methods"],
30
+ )
31
+ def allowed_files() -> flask.Response:
32
+ utils_functions.validate_request(flask.request, schemas_dict["allowed_files"])
33
+ params = schemas.AllowedFiles.from_dict(flask.request.get_json())
34
+ extensions = geode_functions.list_input_extensions(params.supported_feature)
35
+ return flask.make_response({"extensions": extensions}, 200)
36
+
37
+
38
+ @routes.route(
39
+ schemas_dict["upload_file"]["route"],
40
+ methods=schemas_dict["upload_file"]["methods"],
41
+ )
42
+ def upload_file() -> flask.Response:
43
+ if flask.request.method == "OPTIONS":
44
+ return flask.make_response({}, 200)
45
+
46
+ UPLOAD_FOLDER = flask.current_app.config["UPLOAD_FOLDER"]
47
+ if not os.path.exists(UPLOAD_FOLDER):
48
+ os.makedirs(UPLOAD_FOLDER, exist_ok=True)
49
+
50
+ file = flask.request.files["file"]
51
+ filename = werkzeug.utils.secure_filename(os.path.basename(file.filename))
52
+ file.save(os.path.join(UPLOAD_FOLDER, filename))
53
+ return flask.make_response({"message": "File uploaded"}, 201)
54
+
55
+
56
+ @routes.route(
57
+ schemas_dict["allowed_objects"]["route"],
58
+ methods=schemas_dict["allowed_objects"]["methods"],
59
+ )
60
+ def allowed_objects() -> flask.Response:
61
+ if flask.request.method == "OPTIONS":
62
+ return flask.make_response({}, 200)
63
+
64
+ utils_functions.validate_request(flask.request, schemas_dict["allowed_objects"])
65
+ params = schemas.AllowedObjects.from_dict(flask.request.get_json())
66
+ file_absolute_path = geode_functions.upload_file_path(params.filename)
67
+ allowed_objects = geode_functions.list_geode_objects(
68
+ file_absolute_path, params.supported_feature
69
+ )
70
+ return flask.make_response({"allowed_objects": allowed_objects}, 200)
71
+
72
+
73
+ @routes.route(
74
+ schemas_dict["missing_files"]["route"],
75
+ methods=schemas_dict["missing_files"]["methods"],
76
+ )
77
+ def missing_files() -> flask.Response:
78
+ utils_functions.validate_request(flask.request, schemas_dict["missing_files"])
79
+ params = schemas.MissingFiles.from_dict(flask.request.get_json())
80
+ file_path = geode_functions.upload_file_path(params.filename)
81
+
82
+ additional_files = geode_functions.additional_files(
83
+ params.input_geode_object,
84
+ file_path,
85
+ )
86
+
87
+ has_missing_files = any(
88
+ file.is_missing
89
+ for file in additional_files.mandatory_files + additional_files.optional_files
90
+ )
91
+
92
+ mandatory_files = [
93
+ os.path.basename(file.filename)
94
+ for file in additional_files.mandatory_files
95
+ if file.is_missing
96
+ ]
97
+ additional_files = [
98
+ os.path.basename(file.filename)
99
+ for file in additional_files.optional_files
100
+ if file.is_missing
101
+ ]
102
+
103
+ return flask.make_response(
104
+ {
105
+ "has_missing_files": has_missing_files,
106
+ "mandatory_files": mandatory_files,
107
+ "additional_files": additional_files,
108
+ },
109
+ 200,
110
+ )
111
+
112
+
113
+ @routes.route(
114
+ schemas_dict["geographic_coordinate_systems"]["route"],
115
+ methods=schemas_dict["geographic_coordinate_systems"]["methods"],
116
+ )
117
+ def crs_converter_geographic_coordinate_systems() -> flask.Response:
118
+ utils_functions.validate_request(
119
+ flask.request, schemas_dict["geographic_coordinate_systems"]
120
+ )
121
+ params = schemas.GeographicCoordinateSystems.from_dict(flask.request.get_json())
122
+ infos = geode_functions.geographic_coordinate_systems(params.input_geode_object)
123
+ crs_list = []
124
+ for info in infos:
125
+ crs = {}
126
+ crs["name"] = info.name
127
+ crs["code"] = info.code
128
+ crs["authority"] = info.authority
129
+ crs_list.append(crs)
130
+
131
+ return flask.make_response({"crs_list": crs_list}, 200)
132
+
133
+
134
+ @routes.route(
135
+ schemas_dict["inspect_file"]["route"],
136
+ methods=schemas_dict["inspect_file"]["methods"],
137
+ )
138
+ def inspect_file() -> flask.Response:
139
+ utils_functions.validate_request(flask.request, schemas_dict["inspect_file"])
140
+ params = schemas.InspectFile.from_dict(flask.request.get_json())
141
+ file_path = geode_functions.upload_file_path(params.filename)
142
+ data = geode_functions.load(params.input_geode_object, file_path)
143
+ class_inspector = geode_functions.inspect(params.input_geode_object, data)
144
+ inspection_result = geode_functions.get_inspector_children(class_inspector)
145
+ return flask.make_response({"inspection_result": inspection_result}, 200)
146
+
147
+
148
+ @routes.route(
149
+ schemas_dict["geode_objects_and_output_extensions"]["route"],
150
+ methods=schemas_dict["geode_objects_and_output_extensions"]["methods"],
151
+ )
152
+ def geode_objects_and_output_extensions() -> flask.Response:
153
+ utils_functions.validate_request(
154
+ flask.request, schemas_dict["geode_objects_and_output_extensions"]
155
+ )
156
+ params = schemas.GeodeObjectsAndOutputExtensions.from_dict(flask.request.get_json())
157
+ file_path = geode_functions.upload_file_path(params.filename)
158
+ data = geode_functions.load(
159
+ params.input_geode_object,
160
+ file_path,
161
+ )
162
+ geode_objects_and_output_extensions = (
163
+ geode_functions.geode_objects_output_extensions(params.input_geode_object, data)
164
+ )
165
+ return flask.make_response(
166
+ {"geode_objects_and_output_extensions": geode_objects_and_output_extensions},
167
+ 200,
168
+ )
169
+
170
+
171
+ @routes.route(
172
+ schemas_dict["save_viewable_file"]["route"],
173
+ methods=schemas_dict["save_viewable_file"]["methods"],
174
+ )
175
+ def save_viewable_file() -> flask.Response:
176
+ utils_functions.validate_request(flask.request, schemas_dict["save_viewable_file"])
177
+ params = schemas.SaveViewableFile.from_dict(flask.request.get_json())
178
+ return flask.make_response(
179
+ utils_functions.generate_native_viewable_and_light_viewable_from_file(
180
+ geode_object=params.input_geode_object,
181
+ input_filename=params.filename,
182
+ ),
183
+ 200,
184
+ )
185
+
186
+
187
+ @routes.route(
188
+ schemas_dict["texture_coordinates"]["route"],
189
+ methods=schemas_dict["texture_coordinates"]["methods"],
190
+ )
191
+ def texture_coordinates() -> flask.Response:
192
+ utils_functions.validate_request(flask.request, schemas_dict["texture_coordinates"])
193
+ params = schemas.TextureCoordinates.from_dict(flask.request.get_json())
194
+ data = geode_functions.load_data(params.id)
195
+ texture_coordinates = data.texture_manager().texture_names()
196
+ return flask.make_response({"texture_coordinates": texture_coordinates}, 200)
197
+
198
+
199
+ @routes.route(
200
+ schemas_dict["vertex_attribute_names"]["route"],
201
+ methods=schemas_dict["vertex_attribute_names"]["methods"],
202
+ )
203
+ def vertex_attribute_names() -> flask.Response:
204
+ utils_functions.validate_request(
205
+ flask.request, schemas_dict["vertex_attribute_names"]
206
+ )
207
+ params = schemas.VertexAttributeNames.from_dict(flask.request.get_json())
208
+ data = geode_functions.load_data(params.id)
209
+ vertex_attribute_names = data.vertex_attribute_manager().attribute_names()
210
+ return flask.make_response(
211
+ {
212
+ "vertex_attribute_names": vertex_attribute_names,
213
+ },
214
+ 200,
215
+ )
216
+
217
+
218
+ @routes.route(
219
+ schemas_dict["polygon_attribute_names"]["route"],
220
+ methods=schemas_dict["polygon_attribute_names"]["methods"],
221
+ )
222
+ def polygon_attribute_names() -> flask.Response:
223
+ utils_functions.validate_request(
224
+ flask.request, schemas_dict["polygon_attribute_names"]
225
+ )
226
+ params = schemas.PolygonAttributeNames.from_dict(flask.request.get_json())
227
+ data = geode_functions.load_data(params.id)
228
+ polygon_attribute_names = data.polygon_attribute_manager().attribute_names()
229
+ return flask.make_response(
230
+ {
231
+ "polygon_attribute_names": polygon_attribute_names,
232
+ },
233
+ 200,
234
+ )
235
+
236
+
237
+ @routes.route(
238
+ schemas_dict["polyhedron_attribute_names"]["route"],
239
+ methods=schemas_dict["polyhedron_attribute_names"]["methods"],
240
+ )
241
+ def polyhedron_attribute_names() -> flask.Response:
242
+ utils_functions.validate_request(
243
+ flask.request, schemas_dict["polyhedron_attribute_names"]
244
+ )
245
+ params = schemas.PolyhedronAttributeNames.from_dict(flask.request.get_json())
246
+ data = geode_functions.load_data(params.id)
247
+ polyhedron_attribute_names = data.polyhedron_attribute_manager().attribute_names()
248
+ return flask.make_response(
249
+ {
250
+ "polyhedron_attribute_names": polyhedron_attribute_names,
251
+ },
252
+ 200,
253
+ )
254
+
255
+
256
+ @routes.route(
257
+ schemas_dict["ping"]["route"],
258
+ methods=schemas_dict["ping"]["methods"],
259
+ )
260
+ def ping() -> flask.Response:
261
+ utils_functions.validate_request(flask.request, schemas_dict["ping"])
262
+ flask.current_app.config.update(LAST_PING_TIME=time.time())
263
+ return flask.make_response({"message": "Flask server is running"}, 200)
264
+
265
+
266
+ @routes.route(schemas_dict["kill"]["route"], methods=schemas_dict["kill"]["methods"])
267
+ def kill() -> flask.Response:
268
+ print("Manual server kill, shutting down...", flush=True)
269
+ os._exit(0)
270
+ return flask.make_response({"message": "Flask server is dead"}, 200)
@@ -0,0 +1,71 @@
1
+ # Standard library imports
2
+ import os
3
+
4
+ # Third party imports
5
+ import flask
6
+ import opengeode
7
+ from opengeodeweb_microservice.schemas import get_schemas_dict
8
+
9
+ # Local application imports
10
+ from opengeodeweb_back import geode_functions, utils_functions
11
+ from . import schemas
12
+
13
+ routes = flask.Blueprint("create", __name__, url_prefix="/create")
14
+ schemas_dict = get_schemas_dict(os.path.join(os.path.dirname(__file__), "schemas"))
15
+
16
+
17
+ @routes.route(
18
+ schemas_dict["create_point"]["route"],
19
+ methods=schemas_dict["create_point"]["methods"],
20
+ )
21
+ def create_point() -> flask.Response:
22
+ """Endpoint to create a single point in 3D space."""
23
+ print(f"create_point : {flask.request=}", flush=True)
24
+ utils_functions.validate_request(flask.request, schemas_dict["create_point"])
25
+ params = schemas.CreatePoint.from_dict(flask.request.get_json())
26
+
27
+ # Create the point
28
+ pointset = geode_functions.geode_object_class("PointSet3D").create()
29
+ builder = geode_functions.create_builder("PointSet3D", pointset)
30
+ builder.set_name(params.name)
31
+ builder.create_point(opengeode.Point3D([params.x, params.y, params.z]))
32
+
33
+ # Save and get info
34
+ result = utils_functions.generate_native_viewable_and_light_viewable_from_object(
35
+ geode_object="PointSet3D",
36
+ data=pointset,
37
+ )
38
+ return flask.make_response(result, 200)
39
+
40
+
41
+ @routes.route(
42
+ schemas_dict["create_aoi"]["route"], methods=schemas_dict["create_aoi"]["methods"]
43
+ )
44
+ def create_aoi() -> flask.Response:
45
+ """Endpoint to create an Area of Interest (AOI) as an EdgedCurve3D."""
46
+ print(f"create_aoi : {flask.request=}", flush=True)
47
+ utils_functions.validate_request(flask.request, schemas_dict["create_aoi"])
48
+ params = schemas.CreateAoi.from_dict(flask.request.get_json())
49
+
50
+ # Create the edged curve
51
+ edged_curve = geode_functions.geode_object_class("EdgedCurve3D").create()
52
+ builder = geode_functions.create_builder("EdgedCurve3D", edged_curve)
53
+ builder.set_name(params.name)
54
+
55
+ # Create vertices first
56
+ for point in params.points:
57
+ pp = opengeode.Point3D([point.x, point.y, params.z])
58
+ builder.create_point(opengeode.Point3D([point.x, point.y, params.z]))
59
+
60
+ # Create edges between consecutive vertices and close the loop
61
+ num_vertices = len(params.points)
62
+ for i in range(num_vertices):
63
+ next_i = (i + 1) % num_vertices
64
+ builder.create_edge_with_vertices(i, next_i)
65
+
66
+ # Save and get info
67
+ result = utils_functions.generate_native_viewable_and_light_viewable_from_object(
68
+ geode_object="EdgedCurve3D",
69
+ data=edged_curve,
70
+ )
71
+ return flask.make_response(result, 200)
@@ -0,0 +1,2 @@
1
+ from .create_point import *
2
+ from .create_aoi import *
@@ -0,0 +1,19 @@
1
+ from dataclasses_json import DataClassJsonMixin
2
+ from dataclasses import dataclass
3
+ from typing import List, Optional
4
+
5
+
6
+ @dataclass
7
+ class Point(DataClassJsonMixin):
8
+ x: float
9
+ y: float
10
+
11
+
12
+ @dataclass
13
+ class CreateAoi(DataClassJsonMixin):
14
+ name: str
15
+ """Name of the AOI"""
16
+
17
+ points: List[Point]
18
+ z: float
19
+ id: Optional[str] = None
@@ -0,0 +1,10 @@
1
+ from dataclasses_json import DataClassJsonMixin
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class CreatePoint(DataClassJsonMixin):
7
+ name: str
8
+ x: float
9
+ y: float
10
+ z: float
@@ -0,0 +1,49 @@
1
+ import os
2
+ import xml.etree.ElementTree as ET
3
+ import flask
4
+ from opengeodeweb_microservice.schemas import get_schemas_dict
5
+
6
+ from opengeodeweb_back import geode_functions, utils_functions
7
+ from . import schemas
8
+
9
+ routes = flask.Blueprint("models", __name__, url_prefix="/models")
10
+ schemas_dict = get_schemas_dict(os.path.join(os.path.dirname(__file__), "schemas"))
11
+
12
+
13
+ @routes.route(
14
+ schemas_dict["vtm_component_indices"]["route"],
15
+ methods=schemas_dict["vtm_component_indices"]["methods"],
16
+ )
17
+ def uuid_to_flat_index() -> flask.Response:
18
+ utils_functions.validate_request(
19
+ flask.request, schemas_dict["vtm_component_indices"]
20
+ )
21
+ params = schemas.VtmComponentIndices.from_dict(flask.request.get_json())
22
+ vtm_file_path = geode_functions.data_file_path(params.id, "viewable.vtm")
23
+ tree = ET.parse(vtm_file_path)
24
+ root = tree.find("vtkMultiBlockDataSet")
25
+ if root is None:
26
+ raise Exception("Failed to read viewable file")
27
+ uuid_to_flat_index = {}
28
+ current_index = 0
29
+ for elem in root.iter():
30
+ if "uuid" in elem.attrib and elem.tag == "DataSet":
31
+ uuid_to_flat_index[elem.attrib["uuid"]] = current_index
32
+ current_index += 1
33
+ return flask.make_response({"uuid_to_flat_index": uuid_to_flat_index}, 200)
34
+
35
+
36
+ @routes.route(
37
+ schemas_dict["mesh_components"]["route"],
38
+ methods=schemas_dict["mesh_components"]["methods"],
39
+ )
40
+ def extract_uuids_endpoint() -> flask.Response:
41
+ utils_functions.validate_request(flask.request, schemas_dict["mesh_components"])
42
+ params = schemas.MeshComponents.from_dict(flask.request.get_json())
43
+ model = geode_functions.load_data(params.id)
44
+ mesh_components = model.mesh_components()
45
+ uuid_dict = {}
46
+ for mesh_component, ids in mesh_components.items():
47
+ component_name = mesh_component.get()
48
+ uuid_dict[component_name] = [id.string() for id in ids]
49
+ return flask.make_response({"uuid_dict": uuid_dict}, 200)
@@ -0,0 +1,2 @@
1
+ from .vtm_component_indices import *
2
+ from .mesh_components import *
@@ -0,0 +1,7 @@
1
+ from dataclasses_json import DataClassJsonMixin
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class MeshComponents(DataClassJsonMixin):
7
+ id: str
@@ -0,0 +1,7 @@
1
+ from dataclasses_json import DataClassJsonMixin
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class VtmComponentIndices(DataClassJsonMixin):
7
+ id: str
@@ -0,0 +1,14 @@
1
+ from .vertex_attribute_names import *
2
+ from .upload_file import *
3
+ from .texture_coordinates import *
4
+ from .save_viewable_file import *
5
+ from .polyhedron_attribute_names import *
6
+ from .polygon_attribute_names import *
7
+ from .ping import *
8
+ from .missing_files import *
9
+ from .kill import *
10
+ from .inspect_file import *
11
+ from .geographic_coordinate_systems import *
12
+ from .geode_objects_and_output_extensions import *
13
+ from .allowed_objects import *
14
+ from .allowed_files import *
@@ -0,0 +1,8 @@
1
+ from dataclasses_json import DataClassJsonMixin
2
+ from dataclasses import dataclass
3
+ from typing import Optional
4
+
5
+
6
+ @dataclass
7
+ class AllowedFiles(DataClassJsonMixin):
8
+ supported_feature: Optional[str] = None
@@ -0,0 +1,9 @@
1
+ from dataclasses_json import DataClassJsonMixin
2
+ from dataclasses import dataclass
3
+ from typing import Optional
4
+
5
+
6
+ @dataclass
7
+ class AllowedObjects(DataClassJsonMixin):
8
+ filename: str
9
+ supported_feature: Optional[str] = None
@@ -0,0 +1,8 @@
1
+ from dataclasses_json import DataClassJsonMixin
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class GeodeObjectsAndOutputExtensions(DataClassJsonMixin):
7
+ filename: str
8
+ input_geode_object: str
@@ -0,0 +1,7 @@
1
+ from dataclasses_json import DataClassJsonMixin
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class GeographicCoordinateSystems(DataClassJsonMixin):
7
+ input_geode_object: str
@@ -0,0 +1,8 @@
1
+ from dataclasses_json import DataClassJsonMixin
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class InspectFile(DataClassJsonMixin):
7
+ filename: str
8
+ input_geode_object: str
@@ -0,0 +1,7 @@
1
+ from dataclasses_json import DataClassJsonMixin
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class Kill(DataClassJsonMixin):
7
+ pass
@@ -0,0 +1,8 @@
1
+ from dataclasses_json import DataClassJsonMixin
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class MissingFiles(DataClassJsonMixin):
7
+ filename: str
8
+ input_geode_object: str
@@ -0,0 +1,7 @@
1
+ from dataclasses_json import DataClassJsonMixin
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class Ping(DataClassJsonMixin):
7
+ pass