OpenGeodeWeb-Back 5.8.3rc1__py3-none-any.whl → 5.8.4rc2__py3-none-any.whl

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.
@@ -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
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 5.8.3rc1
3
+ Version: 5.8.4rc2
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,9 +2,9 @@ opengeodeweb_back/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
2
2
  opengeodeweb_back/app_config.py,sha256=gJfYxDJOa_PYLqjqgdXacp3W3F109uujE9LGPvzHOkc,728
3
3
  opengeodeweb_back/geode_functions.py,sha256=EPAM6pw9QwZfoeZjOxycFTKUANw6pdeXr2q3vsnPxt8,9121
4
4
  opengeodeweb_back/geode_objects.py,sha256=13A9FTGugiA9ClSeYkBiCu5QGzm93nm8YJQwiWB4nNw,25995
5
- opengeodeweb_back/test_utils.py,sha256=gvRPOzin4nI5TKuB-AFgIxcekTOYM4h7yUYk0tYIZFI,820
6
- opengeodeweb_back/utils_functions.py,sha256=NOZq-1oI683vFzXz7rWMzt04kURR3yrkms24jcuYXB0,4057
7
- opengeodeweb_back/routes/blueprint_routes.py,sha256=dd5ccR6DY4GQGhc9oE3KtLj2YriaVFd1oTVizrnPp1g,14422
5
+ opengeodeweb_back/test_utils.py,sha256=18AbRW9-tfKkPcmRGilTTHXI7S3armYyV7Vdy5UvUKM,794
6
+ opengeodeweb_back/utils_functions.py,sha256=fghIbadgRBCmjiHQ6h_Sh8_96cznt2FlqNcQEpfYyKE,5732
7
+ opengeodeweb_back/routes/blueprint_routes.py,sha256=o1G6gEeRcQUDPWy5OxBorFMB-bpwjuJr0yL4Ex_Lg24,12341
8
8
  opengeodeweb_back/routes/models/blueprint_models.py,sha256=F5Rx1UpAII2oz75byx4UWvEWrrwY38xO5rsy6B9_AeM,2321
9
9
  opengeodeweb_back/routes/models/schemas/mesh_components.json,sha256=3hgNqkxKDv691JGgjgMoqI_WgH2m7AtEFfjsOIqAz5Y,295
10
10
  opengeodeweb_back/routes/models/schemas/vtm_component_indices.json,sha256=0km8gzawPj-eFodhaGzAgNZjAEOl4wLy24f_Bs3pBlw,217
@@ -22,8 +22,8 @@ opengeodeweb_back/routes/schemas/save_viewable_file.json,sha256=pvvEdaC7bNASPMrl
22
22
  opengeodeweb_back/routes/schemas/texture_coordinates.json,sha256=m0EqxlvKojXVxK5Csucodu3rq1YMVJPwXJN_Wreb3qc,355
23
23
  opengeodeweb_back/routes/schemas/upload_file.json,sha256=LJ3U3L5ApKuQDVFIpVT_y2alq4HW_suTvZ3HUucNbhg,219
24
24
  opengeodeweb_back/routes/schemas/vertex_attribute_names.json,sha256=bya9KGtTmHFWjD-ur0_0UAY2yf3KkMeuNrk6E1UkjLM,358
25
- opengeodeweb_back-5.8.3rc1.dist-info/licenses/LICENSE,sha256=LoTB-aqQvzTGxoTRXNnhNV0LKiqdk2bQv6MB34l8zkI,1079
26
- opengeodeweb_back-5.8.3rc1.dist-info/METADATA,sha256=eytwSzWy_JyK03FY2M5hTN0X0uNdL1_lXxOfsuTRZk8,3083
27
- opengeodeweb_back-5.8.3rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
28
- opengeodeweb_back-5.8.3rc1.dist-info/top_level.txt,sha256=tN1FZeLIVBrdja2-pbmhg5-tK-JILmmT9OeIBnhlUrQ,18
29
- opengeodeweb_back-5.8.3rc1.dist-info/RECORD,,
25
+ opengeodeweb_back-5.8.4rc2.dist-info/licenses/LICENSE,sha256=LoTB-aqQvzTGxoTRXNnhNV0LKiqdk2bQv6MB34l8zkI,1079
26
+ opengeodeweb_back-5.8.4rc2.dist-info/METADATA,sha256=AvDrg_aRYZnCVsh58dzIxh_iEd-0PYvSGtxTcda7eJ4,3036
27
+ opengeodeweb_back-5.8.4rc2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
28
+ opengeodeweb_back-5.8.4rc2.dist-info/top_level.txt,sha256=tN1FZeLIVBrdja2-pbmhg5-tK-JILmmT9OeIBnhlUrQ,18
29
+ opengeodeweb_back-5.8.4rc2.dist-info/RECORD,,