OpenGeodeWeb-Back 5.8.3__tar.gz → 5.8.4__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 (39) hide show
  1. {opengeodeweb_back-5.8.3/src/OpenGeodeWeb_Back.egg-info → opengeodeweb_back-5.8.4}/PKG-INFO +2 -3
  2. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/pyproject.toml +1 -1
  3. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/requirements.txt +3 -5
  4. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4/src/OpenGeodeWeb_Back.egg-info}/PKG-INFO +2 -3
  5. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/OpenGeodeWeb_Back.egg-info/requires.txt +1 -2
  6. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/blueprint_routes.py +7 -71
  7. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/test_utils.py +4 -5
  8. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/utils_functions.py +54 -5
  9. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/LICENSE +0 -0
  10. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/README.md +0 -0
  11. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/setup.cfg +0 -0
  12. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt +0 -0
  13. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/OpenGeodeWeb_Back.egg-info/dependency_links.txt +0 -0
  14. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/OpenGeodeWeb_Back.egg-info/top_level.txt +0 -0
  15. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/__init__.py +0 -0
  16. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/app_config.py +0 -0
  17. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/geode_functions.py +0 -0
  18. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/geode_objects.py +0 -0
  19. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/models/blueprint_models.py +0 -0
  20. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/models/schemas/mesh_components.json +0 -0
  21. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/models/schemas/vtm_component_indices.json +0 -0
  22. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/allowed_files.json +0 -0
  23. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/allowed_objects.json +0 -0
  24. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/create_point.json +0 -0
  25. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json +0 -0
  26. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json +0 -0
  27. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/inspect_file.json +0 -0
  28. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/missing_files.json +0 -0
  29. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/ping.json +0 -0
  30. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.json +0 -0
  31. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.json +0 -0
  32. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/save_viewable_file.json +0 -0
  33. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/texture_coordinates.json +0 -0
  34. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/upload_file.json +0 -0
  35. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.json +0 -0
  36. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/tests/test_geode_functions.py +0 -0
  37. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/tests/test_models_routes.py +0 -0
  38. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/tests/test_routes.py +0 -0
  39. {opengeodeweb_back-5.8.3 → opengeodeweb_back-5.8.4}/tests/test_utils_functions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 5.8.3
3
+ Version: 5.8.4
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
@@ -15,6 +15,7 @@ Requires-Dist: asgiref==3.8.1
15
15
  Requires-Dist: attrs==25.3.0
16
16
  Requires-Dist: blinker==1.9.0
17
17
  Requires-Dist: click==8.2.1
18
+ Requires-Dist: fastjsonschema==2.21.1
18
19
  Requires-Dist: flask[async]==3.1.1
19
20
  Requires-Dist: flask-cors==6.0.1
20
21
  Requires-Dist: geode-background==9.2.9
@@ -27,8 +28,6 @@ Requires-Dist: geode-simplex==9.4.2
27
28
  Requires-Dist: geode-viewables==3.1.4
28
29
  Requires-Dist: itsdangerous==2.2.0
29
30
  Requires-Dist: jinja2==3.1.6
30
- Requires-Dist: jsonschema==4.24.0
31
- Requires-Dist: jsonschema-specifications==2025.4.1
32
31
  Requires-Dist: markupsafe==3.0.2
33
32
  Requires-Dist: opengeode-core==15.21.2
34
33
  Requires-Dist: opengeode-geosciences==9.0.0
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
 
6
6
  [project]
7
7
  name = "OpenGeodeWeb-Back"
8
- version = "5.8.3"
8
+ version = "5.8.4"
9
9
  dynamic = ["dependencies"]
10
10
  authors = [
11
11
  { name="Geode-solutions", email="team-web@geode-solutions.com" },
@@ -14,6 +14,8 @@ blinker==1.9.0
14
14
  # via flask
15
15
  click==8.2.1
16
16
  # via flask
17
+ fastjsonschema==2.21.1
18
+ # via -r requirements.in
17
19
  flask[async]==3.1.1
18
20
  # via
19
21
  # -r requirements.in
@@ -60,10 +62,6 @@ itsdangerous==2.2.0
60
62
  # via flask
61
63
  jinja2==3.1.6
62
64
  # via flask
63
- jsonschema==4.24.0
64
- # via -r requirements.in
65
- jsonschema-specifications==2025.4.1
66
- # via jsonschema
67
65
  markupsafe==3.0.2
68
66
  # via
69
67
  # flask
@@ -120,4 +118,4 @@ werkzeug==3.1.3
120
118
  # via
121
119
  # -r requirements.in
122
120
  # flask
123
- # flask-cors
121
+ # flask-cors
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 5.8.3
3
+ Version: 5.8.4
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
@@ -15,6 +15,7 @@ Requires-Dist: asgiref==3.8.1
15
15
  Requires-Dist: attrs==25.3.0
16
16
  Requires-Dist: blinker==1.9.0
17
17
  Requires-Dist: click==8.2.1
18
+ Requires-Dist: fastjsonschema==2.21.1
18
19
  Requires-Dist: flask[async]==3.1.1
19
20
  Requires-Dist: flask-cors==6.0.1
20
21
  Requires-Dist: geode-background==9.2.9
@@ -27,8 +28,6 @@ Requires-Dist: geode-simplex==9.4.2
27
28
  Requires-Dist: geode-viewables==3.1.4
28
29
  Requires-Dist: itsdangerous==2.2.0
29
30
  Requires-Dist: jinja2==3.1.6
30
- Requires-Dist: jsonschema==4.24.0
31
- Requires-Dist: jsonschema-specifications==2025.4.1
32
31
  Requires-Dist: markupsafe==3.0.2
33
32
  Requires-Dist: opengeode-core==15.21.2
34
33
  Requires-Dist: opengeode-geosciences==9.0.0
@@ -2,6 +2,7 @@ asgiref==3.8.1
2
2
  attrs==25.3.0
3
3
  blinker==1.9.0
4
4
  click==8.2.1
5
+ fastjsonschema==2.21.1
5
6
  flask[async]==3.1.1
6
7
  flask-cors==6.0.1
7
8
  geode-background==9.2.9
@@ -14,8 +15,6 @@ geode-simplex==9.4.2
14
15
  geode-viewables==3.1.4
15
16
  itsdangerous==2.2.0
16
17
  jinja2==3.1.6
17
- jsonschema==4.24.0
18
- jsonschema-specifications==2025.4.1
19
18
  markupsafe==3.0.2
20
19
  opengeode-core==15.21.2
21
20
  opengeode-geosciences==9.0.0
@@ -241,61 +241,16 @@ with open(
241
241
  methods=save_viewable_file_json["methods"],
242
242
  )
243
243
  def save_viewable_file():
244
+ utils_functions.validate_request(flask.request, save_viewable_file_json)
244
245
  UPLOAD_FOLDER = flask.current_app.config["UPLOAD_FOLDER"]
245
246
  DATA_FOLDER_PATH = flask.current_app.config["DATA_FOLDER_PATH"]
246
- utils_functions.validate_request(flask.request, save_viewable_file_json)
247
-
248
247
  secure_filename = werkzeug.utils.secure_filename(flask.request.json["filename"])
249
248
  file_path = os.path.abspath(os.path.join(UPLOAD_FOLDER, secure_filename))
250
249
  data = geode_functions.load(flask.request.json["input_geode_object"], file_path)
251
- generated_id = str(uuid.uuid4()).replace("-", "")
252
-
253
- name = data.name()
254
- native_extension = data.native_extension()
255
-
256
- absolute_native_file_path = os.path.join(
257
- UPLOAD_FOLDER, generated_id + "." + native_extension
258
- )
259
-
260
- saved_viewable_file_path = geode_functions.save_viewable(
261
- flask.request.json["input_geode_object"], data, DATA_FOLDER_PATH, generated_id
262
- )
263
-
264
- saved_light_viewable_file_path = geode_functions.save_light_viewable(
265
- flask.request.json["input_geode_object"],
266
- data,
267
- DATA_FOLDER_PATH,
268
- "light_" + generated_id,
269
- )
270
-
271
- f = open(saved_light_viewable_file_path, "rb")
272
- binary_light_viewable = f.read()
273
- f.close()
274
-
275
- geode_functions.save(
276
- flask.request.json["input_geode_object"],
277
- data,
278
- DATA_FOLDER_PATH,
279
- generated_id + "." + native_extension,
280
- )
281
- os.remove(os.path.join(UPLOAD_FOLDER, secure_filename))
282
- object_type = geode_functions.get_object_type(
283
- flask.request.json["input_geode_object"]
284
- )
285
-
286
- native_file_name = os.path.basename(absolute_native_file_path)
287
- viewable_file_name = os.path.basename(saved_viewable_file_path)
288
- return flask.make_response(
289
- {
290
- "name": name,
291
- "native_file_name": native_file_name,
292
- "viewable_file_name": viewable_file_name,
293
- "id": generated_id,
294
- "object_type": object_type,
295
- "binary_light_viewable": str(binary_light_viewable, "utf-8"),
296
- },
297
- 200,
250
+ response_data = utils_functions.create_response_with_binary_light_viewable(
251
+ flask.request.json["input_geode_object"], data, DATA_FOLDER_PATH
298
252
  )
253
+ return flask.jsonify(response_data), 200
299
254
 
300
255
 
301
256
  with open(os.path.join(schemas, "create_point.json"), "r") as file:
@@ -315,29 +270,10 @@ def create_point():
315
270
  builder = geode_functions.create_builder("PointSet3D", PointSet3D)
316
271
  builder.create_point(opengeode.Point3D([x, y, z]))
317
272
  builder.set_name(title)
318
- name = PointSet3D.name()
319
- generated_id = str(uuid.uuid4()).replace("-", "")
320
- object_type = geode_functions.get_object_type("PointSet3D")
321
- saved_native_file_path = geode_functions.save(
322
- "PointSet3D", PointSet3D, DATA_FOLDER_PATH, generated_id + ".og_pts3d"
323
- )
324
- saved_viewable_file_path = geode_functions.save_viewable(
325
- "PointSet3D", PointSet3D, DATA_FOLDER_PATH, generated_id
326
- )
327
-
328
- native_file_name = os.path.basename(saved_native_file_path[0])
329
- viewable_file_name = os.path.basename(saved_viewable_file_path)
330
-
331
273
  return flask.make_response(
332
- {
333
- "viewable_file_name": os.path.basename(saved_viewable_file_path),
334
- "id": generated_id,
335
- "name": name,
336
- "native_file_name": native_file_name,
337
- "viewable_file_name": viewable_file_name,
338
- "object_type": object_type,
339
- "geode_object": "PointSet3D",
340
- },
274
+ utils_functions.create_response_with_binary_light_viewable(
275
+ "PointSet3D", PointSet3D, DATA_FOLDER_PATH
276
+ ),
341
277
  200,
342
278
  )
343
279
 
@@ -12,14 +12,13 @@ def test_route_wrong_params(client, route, get_full_data):
12
12
  response = client.post(route, json=json)
13
13
  assert response.status_code == 400
14
14
  error_description = response.json["description"]
15
- assert error_description == f"Validation error: '{key}' is a required property"
15
+ assert "data must contain" in error_description
16
+ assert f"'{key}'" in error_description
16
17
 
17
18
  json = get_full_data()
18
19
  json["dumb_key"] = "dumb_value"
19
20
  response = client.post(route, json=json)
20
21
  assert response.status_code == 400
21
22
  error_description = response.json["description"]
22
- assert (
23
- error_description
24
- == "Validation error: Additional properties are not allowed ('dumb_key' was unexpected)"
25
- )
23
+ assert "data must not contain" in error_description
24
+ assert "'dumb_key'" in error_description
@@ -2,15 +2,16 @@
2
2
  import os
3
3
  import threading
4
4
  import time
5
+ import uuid
5
6
  import zipfile
6
7
 
7
8
  # Third party imports
8
9
  import flask
9
- from jsonschema import validate
10
- from jsonschema.exceptions import ValidationError
10
+ import fastjsonschema
11
11
  import importlib.metadata as metadata
12
12
 
13
13
  # Local application imports
14
+ from . import geode_functions
14
15
 
15
16
 
16
17
  def increment_request_counter(current_app):
@@ -82,9 +83,11 @@ def validate_request(request, schema):
82
83
  json_data = {}
83
84
 
84
85
  try:
85
- validate(instance=json_data, schema=schema)
86
- except ValidationError as e:
87
- flask.abort(400, f"Validation error: {e.message}")
86
+ validate = fastjsonschema.compile(schema)
87
+ validate(json_data)
88
+ except fastjsonschema.JsonSchemaException as e:
89
+ error_msg = str(e)
90
+ flask.abort(400, error_msg)
88
91
 
89
92
 
90
93
  def set_interval(func, sec, args=None):
@@ -138,3 +141,49 @@ def handle_exception(e):
138
141
  )
139
142
  response.content_type = "application/json"
140
143
  return response
144
+
145
+
146
+ def save_native_viewable_binary_file_names(geode_object, data, folder_absolute_path):
147
+ generated_id = str(uuid.uuid4()).replace("-", "")
148
+ saved_native_file_path = geode_functions.save(
149
+ geode_object,
150
+ data,
151
+ folder_absolute_path,
152
+ generated_id + "." + data.native_extension(),
153
+ )
154
+ saved_viewable_file_path = geode_functions.save_viewable(
155
+ geode_object, data, folder_absolute_path, generated_id
156
+ )
157
+ saved_light_viewable_file_path = geode_functions.save_light_viewable(
158
+ geode_object, data, folder_absolute_path, "light_" + generated_id
159
+ )
160
+ f = open(saved_light_viewable_file_path, "rb")
161
+ binary_light_viewable = f.read()
162
+ f.close()
163
+ return {
164
+ "native_file_name": os.path.basename(saved_native_file_path[0]),
165
+ "viewable_file_name": os.path.basename(saved_viewable_file_path[0]),
166
+ "binary_light_viewable": str(binary_light_viewable, "utf-8"),
167
+ }
168
+
169
+
170
+ def create_response_with_binary_light_viewable(
171
+ geode_object, data, folder_absolute_path
172
+ ):
173
+ generated_id = str(uuid.uuid4()).replace("-", "")
174
+ name = data.name()
175
+ object_type = geode_functions.get_object_type(geode_object)
176
+
177
+ native_file_name, viewable_file_name, binary_light_viewable = (
178
+ save_native_viewable_binary_file_names(geode_object, data, folder_absolute_path)
179
+ )
180
+
181
+ return {
182
+ "name": name,
183
+ "native_file_name": native_file_name,
184
+ "viewable_file_name": viewable_file_name,
185
+ "id": generated_id,
186
+ "object_type": object_type,
187
+ "binary_light_viewable": binary_light_viewable,
188
+ "geode_object": geode_object,
189
+ }