OpenGeodeWeb-Back 5.10.5rc1__tar.gz → 5.11.0rc1__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 (48) hide show
  1. {opengeodeweb_back-5.10.5rc1/src/OpenGeodeWeb_Back.egg-info → opengeodeweb_back-5.11.0rc1}/PKG-INFO +9 -9
  2. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/pyproject.toml +2 -1
  3. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/requirements.txt +8 -8
  4. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1/src/OpenGeodeWeb_Back.egg-info}/PKG-INFO +9 -9
  5. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt +4 -1
  6. opengeodeweb_back-5.11.0rc1/src/OpenGeodeWeb_Back.egg-info/requires.txt +17 -0
  7. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/app.py +11 -10
  8. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/blueprint_routes.py +2 -26
  9. opengeodeweb_back-5.11.0rc1/src/opengeodeweb_back/routes/create/blueprint_create.py +117 -0
  10. opengeodeweb_back-5.11.0rc1/src/opengeodeweb_back/routes/create/schemas/create_aoi.json +46 -0
  11. opengeodeweb_back-5.11.0rc1/src/opengeodeweb_back/routes/create/schemas/create_point.json +29 -0
  12. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/utils_functions.py +1 -0
  13. opengeodeweb_back-5.11.0rc1/tests/test_create_routes.py +210 -0
  14. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/tests/test_routes.py +0 -16
  15. opengeodeweb_back-5.10.5rc1/src/OpenGeodeWeb_Back.egg-info/requires.txt +0 -17
  16. opengeodeweb_back-5.10.5rc1/src/opengeodeweb_back/routes/schemas/create_point.json +0 -29
  17. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/LICENSE +0 -0
  18. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/README.md +0 -0
  19. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/setup.cfg +0 -0
  20. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/OpenGeodeWeb_Back.egg-info/dependency_links.txt +0 -0
  21. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/OpenGeodeWeb_Back.egg-info/entry_points.txt +0 -0
  22. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/OpenGeodeWeb_Back.egg-info/top_level.txt +0 -0
  23. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/__init__.py +0 -0
  24. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/app_config.py +0 -0
  25. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/geode_functions.py +0 -0
  26. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/geode_objects.py +0 -0
  27. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/py.typed +0 -0
  28. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/models/blueprint_models.py +0 -0
  29. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/models/schemas/mesh_components.json +0 -0
  30. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/models/schemas/vtm_component_indices.json +0 -0
  31. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_files.json +0 -0
  32. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_objects.json +0 -0
  33. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json +0 -0
  34. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json +0 -0
  35. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/inspect_file.json +0 -0
  36. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/kill.json +0 -0
  37. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/missing_files.json +0 -0
  38. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/ping.json +0 -0
  39. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.json +0 -0
  40. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.json +0 -0
  41. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/save_viewable_file.json +0 -0
  42. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/texture_coordinates.json +0 -0
  43. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/upload_file.json +0 -0
  44. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.json +0 -0
  45. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/src/opengeodeweb_back/test_utils.py +0 -0
  46. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/tests/test_geode_functions.py +0 -0
  47. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/tests/test_models_routes.py +0 -0
  48. {opengeodeweb_back-5.10.5rc1 → opengeodeweb_back-5.11.0rc1}/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.10.5rc1
3
+ Version: 5.11.0rc1
4
4
  Summary: OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem
5
5
  Author-email: Geode-solutions <team-web@geode-solutions.com>
6
6
  Project-URL: Homepage, https://github.com/Geode-solutions/OpenGeodeWeb-Back
@@ -16,18 +16,18 @@ Requires-Dist: blinker>=1
16
16
  Requires-Dist: click>=8
17
17
  Requires-Dist: flask[async]>=3
18
18
  Requires-Dist: flask-cors==6.0.1
19
- Requires-Dist: geode-common==33.11.0
20
- Requires-Dist: geode-viewables==3.3.0
19
+ Requires-Dist: geode-common==33.11.3
20
+ Requires-Dist: geode-viewables==3.3.2
21
21
  Requires-Dist: itsdangerous>=2
22
22
  Requires-Dist: jinja2>=3
23
23
  Requires-Dist: markupsafe>=3
24
- Requires-Dist: opengeode-core==15.27.4
25
- Requires-Dist: opengeode-geosciences==9.4.1
26
- Requires-Dist: opengeode-geosciencesio==5.8.0
27
- Requires-Dist: opengeode-inspector==6.8.1
28
- Requires-Dist: opengeode-io==7.4.0
24
+ Requires-Dist: opengeode-core==15.29.2
25
+ Requires-Dist: opengeode-geosciences==9.5.0
26
+ Requires-Dist: opengeode-geosciencesio==5.8.1
27
+ Requires-Dist: opengeode-inspector==6.8.2
28
+ Requires-Dist: opengeode-io==7.4.2
29
29
  Requires-Dist: werkzeug==3.1.2
30
- Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.5rc1
30
+ Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.5
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.10.5-rc.1"
7
+ version = "5.11.0-rc.1"
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"
@@ -32,4 +32,5 @@ where = ["src"]
32
32
  [tool.setuptools.package-data]
33
33
  "opengeodeweb_back.routes.schemas" = ["*.json"]
34
34
  "opengeodeweb_back.routes.models.schemas" = ["*.json"]
35
+ "opengeodeweb_back.routes.create.schemas" = ["*.json"]
35
36
  opengeodeweb_microservice = ["py.typed"]
@@ -16,11 +16,11 @@ flask[async]>=3
16
16
  # flask-cors
17
17
  flask-cors==6.0.1
18
18
  # via -r requirements.in
19
- geode-common==33.11.0
19
+ geode-common==33.11.3
20
20
  # via
21
21
  # -r requirements.in
22
22
  # geode-viewables
23
- geode-viewables==3.3.0
23
+ geode-viewables==3.3.2
24
24
  # via -r requirements.in
25
25
  itsdangerous>=2
26
26
  # via flask
@@ -31,7 +31,7 @@ markupsafe>=3
31
31
  # flask
32
32
  # jinja2
33
33
  # werkzeug
34
- opengeode-core==15.27.4
34
+ opengeode-core==15.29.2
35
35
  # via
36
36
  # -r requirements.in
37
37
  # geode-common
@@ -40,16 +40,16 @@ opengeode-core==15.27.4
40
40
  # opengeode-geosciencesio
41
41
  # opengeode-inspector
42
42
  # opengeode-io
43
- opengeode-geosciences==9.4.1
43
+ opengeode-geosciences==9.5.0
44
44
  # via
45
45
  # -r requirements.in
46
46
  # geode-viewables
47
47
  # opengeode-geosciencesio
48
- opengeode-geosciencesio==5.8.0
48
+ opengeode-geosciencesio==5.8.1
49
49
  # via -r requirements.in
50
- opengeode-inspector==6.8.1
50
+ opengeode-inspector==6.8.2
51
51
  # via -r requirements.in
52
- opengeode-io==7.4.0
52
+ opengeode-io==7.4.2
53
53
  # via
54
54
  # -r requirements.in
55
55
  # geode-viewables
@@ -60,4 +60,4 @@ werkzeug==3.1.2
60
60
  # flask
61
61
  # flask-cors
62
62
 
63
- opengeodeweb-microservice==1.*,>=1.0.5rc1
63
+ opengeodeweb-microservice==1.*,>=1.0.5
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 5.10.5rc1
3
+ Version: 5.11.0rc1
4
4
  Summary: OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem
5
5
  Author-email: Geode-solutions <team-web@geode-solutions.com>
6
6
  Project-URL: Homepage, https://github.com/Geode-solutions/OpenGeodeWeb-Back
@@ -16,18 +16,18 @@ Requires-Dist: blinker>=1
16
16
  Requires-Dist: click>=8
17
17
  Requires-Dist: flask[async]>=3
18
18
  Requires-Dist: flask-cors==6.0.1
19
- Requires-Dist: geode-common==33.11.0
20
- Requires-Dist: geode-viewables==3.3.0
19
+ Requires-Dist: geode-common==33.11.3
20
+ Requires-Dist: geode-viewables==3.3.2
21
21
  Requires-Dist: itsdangerous>=2
22
22
  Requires-Dist: jinja2>=3
23
23
  Requires-Dist: markupsafe>=3
24
- Requires-Dist: opengeode-core==15.27.4
25
- Requires-Dist: opengeode-geosciences==9.4.1
26
- Requires-Dist: opengeode-geosciencesio==5.8.0
27
- Requires-Dist: opengeode-inspector==6.8.1
28
- Requires-Dist: opengeode-io==7.4.0
24
+ Requires-Dist: opengeode-core==15.29.2
25
+ Requires-Dist: opengeode-geosciences==9.5.0
26
+ Requires-Dist: opengeode-geosciencesio==5.8.1
27
+ Requires-Dist: opengeode-inspector==6.8.2
28
+ Requires-Dist: opengeode-io==7.4.2
29
29
  Requires-Dist: werkzeug==3.1.2
30
- Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.5rc1
30
+ Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.5
31
31
  Dynamic: license-file
32
32
 
33
33
  <h1 align="center">OpenGeodeWeb-Back<sup><i>by Geode-solutions</i></sup></h1>
@@ -17,12 +17,14 @@ src/opengeodeweb_back/py.typed
17
17
  src/opengeodeweb_back/test_utils.py
18
18
  src/opengeodeweb_back/utils_functions.py
19
19
  src/opengeodeweb_back/routes/blueprint_routes.py
20
+ src/opengeodeweb_back/routes/create/blueprint_create.py
21
+ src/opengeodeweb_back/routes/create/schemas/create_aoi.json
22
+ src/opengeodeweb_back/routes/create/schemas/create_point.json
20
23
  src/opengeodeweb_back/routes/models/blueprint_models.py
21
24
  src/opengeodeweb_back/routes/models/schemas/mesh_components.json
22
25
  src/opengeodeweb_back/routes/models/schemas/vtm_component_indices.json
23
26
  src/opengeodeweb_back/routes/schemas/allowed_files.json
24
27
  src/opengeodeweb_back/routes/schemas/allowed_objects.json
25
- src/opengeodeweb_back/routes/schemas/create_point.json
26
28
  src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json
27
29
  src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json
28
30
  src/opengeodeweb_back/routes/schemas/inspect_file.json
@@ -35,6 +37,7 @@ src/opengeodeweb_back/routes/schemas/save_viewable_file.json
35
37
  src/opengeodeweb_back/routes/schemas/texture_coordinates.json
36
38
  src/opengeodeweb_back/routes/schemas/upload_file.json
37
39
  src/opengeodeweb_back/routes/schemas/vertex_attribute_names.json
40
+ tests/test_create_routes.py
38
41
  tests/test_geode_functions.py
39
42
  tests/test_models_routes.py
40
43
  tests/test_routes.py
@@ -0,0 +1,17 @@
1
+ asgiref>=3
2
+ blinker>=1
3
+ click>=8
4
+ flask[async]>=3
5
+ flask-cors==6.0.1
6
+ geode-common==33.11.3
7
+ geode-viewables==3.3.2
8
+ itsdangerous>=2
9
+ jinja2>=3
10
+ markupsafe>=3
11
+ opengeode-core==15.29.2
12
+ opengeode-geosciences==9.5.0
13
+ opengeode-geosciencesio==5.8.1
14
+ opengeode-inspector==6.8.2
15
+ opengeode-io==7.4.2
16
+ werkzeug==3.1.2
17
+ opengeodeweb-microservice==1.*,>=1.0.5
@@ -4,30 +4,26 @@ import argparse
4
4
  import os
5
5
  import time
6
6
  from typing import Any
7
-
8
7
  import flask
9
8
  import flask_cors # type: ignore
10
9
  from flask import Flask, Response
11
10
  from flask_cors import cross_origin
12
11
  from werkzeug.exceptions import HTTPException
13
-
14
12
  from opengeodeweb_back import utils_functions, app_config
15
13
  from opengeodeweb_back.routes import blueprint_routes
16
14
  from opengeodeweb_back.routes.models import blueprint_models
15
+ from opengeodeweb_back.routes.create import blueprint_create
17
16
  from opengeodeweb_microservice.database import connection
18
17
 
19
-
20
18
  """ Global config """
21
19
  app: Flask = flask.Flask(__name__)
22
20
 
23
21
  """ Config variables """
24
22
  FLASK_DEBUG = True if os.environ.get("FLASK_DEBUG", default=None) == "True" else False
25
-
26
23
  if FLASK_DEBUG == False:
27
24
  app.config.from_object(app_config.ProdConfig)
28
25
  else:
29
26
  app.config.from_object(app_config.DevConfig)
30
-
31
27
  DEFAULT_HOST: str = app.config.get("DEFAULT_HOST") or "localhost"
32
28
  DEFAULT_PORT: int = int(app.config.get("DEFAULT_PORT") or 5000)
33
29
  DEFAULT_DATA_FOLDER_PATH: str = app.config.get("DEFAULT_DATA_FOLDER_PATH") or "./data"
@@ -54,12 +50,16 @@ app.register_blueprint(
54
50
  url_prefix="/opengeodeweb_back",
55
51
  name="opengeodeweb_back",
56
52
  )
57
-
58
53
  app.register_blueprint(
59
54
  blueprint_models.routes,
60
55
  url_prefix="/opengeodeweb_back/models",
61
56
  name="opengeodeweb_models",
62
57
  )
58
+ app.register_blueprint(
59
+ blueprint_create.routes,
60
+ url_prefix="/opengeodeweb_back/create",
61
+ name="opengeodeweb_create",
62
+ )
63
63
 
64
64
  if FLASK_DEBUG == False:
65
65
  utils_functions.set_interval(
@@ -72,6 +72,11 @@ def errorhandler(e: HTTPException) -> tuple[dict[str, Any], int] | Response:
72
72
  return utils_functions.handle_exception(e)
73
73
 
74
74
 
75
+ @app.errorhandler(Exception)
76
+ def handle_generic_exception(e: Exception) -> Response:
77
+ return flask.make_response({"error": str(e)}, 500)
78
+
79
+
75
80
  @app.route(
76
81
  "/error",
77
82
  methods=["POST"],
@@ -136,13 +141,10 @@ def run_server() -> None:
136
141
  help="Number of minutes before the server times out",
137
142
  )
138
143
  args = parser.parse_args()
139
-
140
144
  app.config.update(DATA_FOLDER_PATH=args.data_folder_path)
141
145
  app.config.update(UPLOAD_FOLDER=args.upload_folder_path)
142
146
  app.config.update(MINUTES_BEFORE_TIMEOUT=args.timeout)
143
-
144
147
  flask_cors.CORS(app, origins=args.allowed_origins)
145
-
146
148
  print(
147
149
  f"Host: {args.host}, Port: {args.port}, Debug: {args.debug}, "
148
150
  f"Data folder path: {args.data_folder_path}, Timeout: {args.timeout}, "
@@ -158,7 +160,6 @@ def run_server() -> None:
158
160
 
159
161
  connection.init_database(db_path)
160
162
  print(f"Database initialized at: {db_path}", flush=True)
161
-
162
163
  app.run(debug=args.debug, host=args.host, port=args.port, ssl_context=SSL)
163
164
 
164
165
 
@@ -10,7 +10,8 @@ import werkzeug
10
10
 
11
11
  # Local application imports
12
12
  from .. import geode_functions, utils_functions
13
-
13
+ from opengeodeweb_microservice.database.data import Data
14
+ from opengeodeweb_microservice.database.connection import get_session
14
15
  from .models import blueprint_models
15
16
 
16
17
  routes = flask.Blueprint("routes", __name__, url_prefix="/opengeodeweb_back")
@@ -22,7 +23,6 @@ routes.register_blueprint(
22
23
  name=blueprint_models.routes.name,
23
24
  )
24
25
 
25
-
26
26
  schemas = os.path.join(os.path.dirname(__file__), "schemas")
27
27
 
28
28
  with open(
@@ -244,30 +244,6 @@ def save_viewable_file():
244
244
  )
245
245
 
246
246
 
247
- with open(os.path.join(schemas, "create_point.json"), "r") as file:
248
- create_point_json = json.load(file)
249
-
250
-
251
- @routes.route(create_point_json["route"], methods=create_point_json["methods"])
252
- def create_point():
253
- utils_functions.validate_request(flask.request, create_point_json)
254
- title = flask.request.get_json()["title"]
255
- x = flask.request.get_json()["x"]
256
- y = flask.request.get_json()["y"]
257
- z = flask.request.get_json()["z"]
258
- class_ = geode_functions.geode_object_class("PointSet3D")
259
- PointSet3D = class_.create()
260
- builder = geode_functions.create_builder("PointSet3D", PointSet3D)
261
- builder.create_point(opengeode.Point3D([x, y, z]))
262
- builder.set_name(title)
263
- return flask.make_response(
264
- utils_functions.generate_native_viewable_and_light_viewable_from_object(
265
- "PointSet3D", PointSet3D
266
- ),
267
- 200,
268
- )
269
-
270
-
271
247
  with open(os.path.join(schemas, "texture_coordinates.json"), "r") as file:
272
248
  texture_coordinates_json = json.load(file)
273
249
 
@@ -0,0 +1,117 @@
1
+ # Standard library imports
2
+ import json
3
+ import os
4
+ from typing import Any, TypedDict
5
+
6
+ # Third party imports
7
+ import flask
8
+ import opengeode
9
+
10
+ # Local application imports
11
+ from opengeodeweb_back import geode_functions, utils_functions
12
+
13
+ routes = flask.Blueprint("create", __name__, url_prefix="/create")
14
+ schemas = os.path.join(os.path.dirname(__file__), "schemas")
15
+
16
+ # --- Type definitions ---
17
+ type SchemaDict = dict[str, Any]
18
+
19
+
20
+ class PointDict(TypedDict):
21
+ x: float
22
+ y: float
23
+
24
+
25
+ class CreatePointParams(TypedDict):
26
+ name: str
27
+ x: float
28
+ y: float
29
+ z: float
30
+
31
+
32
+ class CreateAOIParams(TypedDict):
33
+ name: str
34
+ points: list[PointDict]
35
+ z: float
36
+
37
+
38
+ # Load schemas
39
+ with open(os.path.join(schemas, "create_point.json"), "r") as file:
40
+ create_point_json: SchemaDict = json.load(file)
41
+
42
+
43
+ @routes.route(create_point_json["route"], methods=create_point_json["methods"])
44
+ def create_point() -> flask.Response:
45
+ """Endpoint to create a single point in 3D space."""
46
+ print(f"create_point : {flask.request=}", flush=True)
47
+ utils_functions.validate_request(flask.request, create_point_json)
48
+
49
+ # Extract and validate data from request
50
+ params: CreatePointParams = flask.request.get_json()
51
+ name = params["name"]
52
+ x = params["x"]
53
+ y = params["y"]
54
+ z = params["z"]
55
+
56
+ # Create the point
57
+ class_ = geode_functions.geode_object_class("PointSet3D")
58
+ pointset = class_.create()
59
+ builder = geode_functions.create_builder("PointSet3D", pointset)
60
+ builder.set_name(name)
61
+ builder.create_point(opengeode.Point3D([x, y, z]))
62
+
63
+ # Save and get info
64
+ result = utils_functions.generate_native_viewable_and_light_viewable_from_object(
65
+ geode_object="PointSet3D",
66
+ data=pointset,
67
+ )
68
+ result["name"] = name
69
+ return flask.make_response(result, 200)
70
+
71
+
72
+ # Load schema for AOI creation
73
+ with open(os.path.join(schemas, "create_aoi.json"), "r") as file:
74
+ create_aoi_json: SchemaDict = json.load(file)
75
+
76
+
77
+ @routes.route(create_aoi_json["route"], methods=create_aoi_json["methods"])
78
+ def create_aoi() -> flask.Response:
79
+ """Endpoint to create an Area of Interest (AOI) as an EdgedCurve3D."""
80
+ print(f"create_aoi : {flask.request=}", flush=True)
81
+ utils_functions.validate_request(flask.request, create_aoi_json)
82
+
83
+ # Extract and validate data from request
84
+ params: CreateAOIParams = flask.request.get_json()
85
+ name = params["name"]
86
+ points = params["points"]
87
+ z = params["z"]
88
+
89
+ # Create the edged curve
90
+ class_ = geode_functions.geode_object_class("EdgedCurve3D")
91
+ edged_curve = class_.create()
92
+ builder = geode_functions.create_builder("EdgedCurve3D", edged_curve)
93
+ builder.set_name(name)
94
+
95
+ # Create vertices first
96
+ vertex_indices: list[int] = []
97
+ for point in points:
98
+ vertex_id = builder.create_point(opengeode.Point3D([point["x"], point["y"], z]))
99
+ vertex_indices.append(vertex_id)
100
+
101
+ # Create edges between consecutive vertices and close the loop
102
+ num_vertices = len(vertex_indices)
103
+ for i in range(num_vertices):
104
+ next_i = (i + 1) % num_vertices
105
+ edge_id = builder.create_edge()
106
+ builder.set_edge_vertex(opengeode.EdgeVertex(edge_id, 0), vertex_indices[i])
107
+ builder.set_edge_vertex(
108
+ opengeode.EdgeVertex(edge_id, 1), vertex_indices[next_i]
109
+ )
110
+
111
+ # Save and get info
112
+ result = utils_functions.generate_native_viewable_and_light_viewable_from_object(
113
+ geode_object="EdgedCurve3D",
114
+ data=edged_curve,
115
+ )
116
+ result["name"] = name
117
+ return flask.make_response(result, 200)
@@ -0,0 +1,46 @@
1
+ {
2
+ "route": "/create_aoi",
3
+ "methods": [
4
+ "POST"
5
+ ],
6
+ "type": "object",
7
+ "properties": {
8
+ "name": {
9
+ "type": "string",
10
+ "description": "Name of the AOI"
11
+ },
12
+ "points": {
13
+ "type": "array",
14
+ "items": {
15
+ "type": "object",
16
+ "properties": {
17
+ "x": {
18
+ "type": "number"
19
+ },
20
+ "y": {
21
+ "type": "number"
22
+ }
23
+ },
24
+ "required": [
25
+ "x",
26
+ "y"
27
+ ],
28
+ "additionalProperties": false
29
+ },
30
+ "minItems": 4,
31
+ "maxItems": 4
32
+ },
33
+ "z": {
34
+ "type": "number"
35
+ },
36
+ "id": {
37
+ "type": "string"
38
+ }
39
+ },
40
+ "required": [
41
+ "name",
42
+ "points",
43
+ "z"
44
+ ],
45
+ "additionalProperties": false
46
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "route": "/create_point",
3
+ "methods": [
4
+ "POST"
5
+ ],
6
+ "type": "object",
7
+ "properties": {
8
+ "name": {
9
+ "type": "string",
10
+ "minLength": 1
11
+ },
12
+ "x": {
13
+ "type": "number"
14
+ },
15
+ "y": {
16
+ "type": "number"
17
+ },
18
+ "z": {
19
+ "type": "number"
20
+ }
21
+ },
22
+ "required": [
23
+ "name",
24
+ "x",
25
+ "y",
26
+ "z"
27
+ ],
28
+ "additionalProperties": false
29
+ }
@@ -211,6 +211,7 @@ def save_all_viewables_and_return_info(
211
211
  "native_file_name": data_entry.native_file_name,
212
212
  "viewable_file_name": data_entry.viewable_file_name,
213
213
  "id": data_entry.id,
214
+ "name": data.name(), # type: ignore
214
215
  "object_type": geode_functions.get_object_type(geode_object),
215
216
  "binary_light_viewable": binary_light_viewable.decode("utf-8"),
216
217
  "geode_object": data_entry.geode_object,
@@ -0,0 +1,210 @@
1
+ # Standard library imports
2
+ import os
3
+ import uuid
4
+ from typing import Any, Callable, Dict, List
5
+
6
+ # Third party imports
7
+ import pytest
8
+ from flask.testing import FlaskClient
9
+
10
+ # Local application imports
11
+ from src.opengeodeweb_back import test_utils
12
+
13
+
14
+ @pytest.fixture
15
+ def point_data() -> Dict[str, Any]:
16
+ return {"name": "test_point", "x": 1.0, "y": 2.0, "z": 3.0}
17
+
18
+
19
+ @pytest.fixture
20
+ def aoi_data() -> Dict[str, Any]:
21
+ return {
22
+ "name": "test_aoi",
23
+ "points": [
24
+ {"x": 0.0, "y": 0.0},
25
+ {"x": 1.0, "y": 0.0},
26
+ {"x": 1.0, "y": 1.0},
27
+ {"x": 0.0, "y": 1.0},
28
+ ],
29
+ "z": 0.0,
30
+ }
31
+
32
+
33
+ def test_create_point(client: FlaskClient, point_data: Dict[str, Any]) -> None:
34
+ """Test the creation of a point with valid data."""
35
+ route: str = "/opengeodeweb_back/create/create_point"
36
+
37
+ # Test with all required data
38
+ response = client.post(route, json=point_data)
39
+ assert response.status_code == 200
40
+
41
+ # Verify response data
42
+ response_data: Any = response.json
43
+ assert "viewable_file_name" in response_data
44
+ assert "id" in response_data
45
+ assert "name" in response_data
46
+ assert "native_file_name" in response_data
47
+ assert "object_type" in response_data
48
+ assert "geode_object" in response_data
49
+
50
+ assert response_data["name"] == point_data["name"]
51
+ assert response_data["object_type"] == "mesh"
52
+ assert response_data["geode_object"] == "PointSet3D"
53
+
54
+ # Test with missing parameters
55
+ test_utils.test_route_wrong_params(client, route, lambda: point_data.copy()) # type: ignore
56
+
57
+
58
+ def test_create_aoi(client: FlaskClient, aoi_data: Dict[str, Any]) -> None:
59
+ """Test the creation of an AOI with valid data."""
60
+ route: str = "/opengeodeweb_back/create/create_aoi"
61
+
62
+ # Test with all required data
63
+ response = client.post(route, json=aoi_data)
64
+ assert response.status_code == 200
65
+
66
+ # Verify response data
67
+ response_data: Any = response.json
68
+ assert "viewable_file_name" in response_data
69
+ assert "id" in response_data
70
+ assert "name" in response_data
71
+ assert "native_file_name" in response_data
72
+ assert "object_type" in response_data
73
+ assert "geode_object" in response_data
74
+
75
+ assert response_data["name"] == aoi_data["name"]
76
+ assert response_data["object_type"] == "mesh"
77
+ assert response_data["geode_object"] == "EdgedCurve3D"
78
+
79
+ # Test with missing parameters
80
+ test_utils.test_route_wrong_params(client, route, lambda: aoi_data.copy()) # type: ignore
81
+
82
+
83
+ def test_create_point_with_invalid_data(client: FlaskClient) -> None:
84
+ """Test the point creation endpoint with invalid data."""
85
+ route: str = "/opengeodeweb_back/create/create_point"
86
+
87
+ # Test with non-numeric coordinates
88
+ invalid_data: Dict[str, Any] = {
89
+ "name": "invalid_point",
90
+ "x": "not_a_number",
91
+ "y": 2.0,
92
+ "z": 3.0,
93
+ }
94
+ response = client.post(route, json=invalid_data)
95
+ assert response.status_code == 400
96
+
97
+ # Test with missing coordinates
98
+ invalid_data = {"name": "invalid_point", "y": 2.0, "z": 3.0}
99
+ response = client.post(route, json=invalid_data)
100
+ assert response.status_code == 400
101
+
102
+
103
+ def test_create_aoi_with_invalid_data(
104
+ client: FlaskClient, aoi_data: Dict[str, Any]
105
+ ) -> None:
106
+ """Test the AOI creation endpoint with invalid data."""
107
+ route: str = "/opengeodeweb_back/create/create_aoi"
108
+
109
+ # Test with invalid points
110
+ invalid_data: Dict[str, Any] = {
111
+ **aoi_data,
112
+ "points": [
113
+ {"x": "not_a_number", "y": 0.0},
114
+ {"x": 1.0, "y": 0.0},
115
+ {"x": 1.0, "y": 1.0},
116
+ {"x": 0.0, "y": 1.0},
117
+ ],
118
+ }
119
+ response = client.post(route, json=invalid_data)
120
+ assert response.status_code == 400
121
+
122
+ # Test with too few points
123
+ invalid_data = {**aoi_data, "points": [{"x": 0.0, "y": 0.0}, {"x": 1.0, "y": 0.0}]}
124
+ response = client.post(route, json=invalid_data)
125
+ assert response.status_code == 400
126
+
127
+ # Test with invalid z value
128
+ invalid_data = {**aoi_data, "z": "not_a_number"}
129
+ response = client.post(route, json=invalid_data)
130
+ assert response.status_code == 400
131
+
132
+
133
+ def test_create_point_file_generation(
134
+ client: FlaskClient, point_data: Dict[str, Any]
135
+ ) -> None:
136
+ """Test that the point creation generates the correct files."""
137
+ route: str = "/opengeodeweb_back/create/create_point"
138
+
139
+ # Make the request
140
+ response = client.post(route, json=point_data)
141
+ assert response.status_code == 200
142
+ response_data: Any = response.json
143
+
144
+ # Get the data folder path for this specific ID
145
+ DATA_FOLDER_PATH: str = client.application.config["DATA_FOLDER_PATH"]
146
+ data_id: str = response_data["id"]
147
+ data_folder: str = os.path.join(DATA_FOLDER_PATH, data_id)
148
+
149
+ # Check that the data folder exists
150
+ assert os.path.exists(data_folder)
151
+ assert os.path.isdir(data_folder)
152
+
153
+ # Check native file exists
154
+ native_file_path: str = os.path.join(data_folder, response_data["native_file_name"])
155
+ assert os.path.exists(native_file_path)
156
+
157
+ # Check viewable file exists
158
+ viewable_file_path: str = os.path.join(
159
+ data_folder, response_data["viewable_file_name"]
160
+ )
161
+ assert os.path.exists(viewable_file_path)
162
+
163
+ # Check light viewable file exists if present
164
+ if "binary_light_viewable" in response_data:
165
+ light_viewable_file_path: str = os.path.join(data_folder, "light_viewable.vtp")
166
+ assert os.path.exists(light_viewable_file_path)
167
+
168
+ # Verify file extensions
169
+ assert response_data["native_file_name"].endswith(".og_pts3d")
170
+ assert response_data["viewable_file_name"].endswith(".vtp")
171
+
172
+
173
+ def test_create_aoi_file_generation(
174
+ client: FlaskClient, aoi_data: Dict[str, Any]
175
+ ) -> None:
176
+ """Test that the AOI creation generates the correct files."""
177
+ route: str = "/opengeodeweb_back/create/create_aoi"
178
+
179
+ # Make the request
180
+ response = client.post(route, json=aoi_data)
181
+ assert response.status_code == 200
182
+ response_data: Any = response.json
183
+
184
+ # Get the data folder path for this specific ID
185
+ DATA_FOLDER_PATH: str = client.application.config["DATA_FOLDER_PATH"]
186
+ data_id: str = response_data["id"]
187
+ data_folder: str = os.path.join(DATA_FOLDER_PATH, data_id)
188
+
189
+ # Check that the data folder exists
190
+ assert os.path.exists(data_folder)
191
+ assert os.path.isdir(data_folder)
192
+
193
+ # Check native file exists
194
+ native_file_path: str = os.path.join(data_folder, response_data["native_file_name"])
195
+ assert os.path.exists(native_file_path)
196
+
197
+ # Check viewable file exists
198
+ viewable_file_path: str = os.path.join(
199
+ data_folder, response_data["viewable_file_name"]
200
+ )
201
+ assert os.path.exists(viewable_file_path)
202
+
203
+ # Check light viewable file exists if present
204
+ if "binary_light_viewable" in response_data:
205
+ light_viewable_file_path: str = os.path.join(data_folder, "light_viewable.vtp")
206
+ assert os.path.exists(light_viewable_file_path)
207
+
208
+ # Verify file extensions
209
+ assert response_data["native_file_name"].endswith(".og_edc3d")
210
+ assert response_data["viewable_file_name"].endswith(".vtp")
@@ -274,22 +274,6 @@ def test_polyhedron_attribute_names(client, test_id):
274
274
  assert type(polyhedron_attribute_name) is str
275
275
 
276
276
 
277
- def test_create_point(client):
278
- route = f"/opengeodeweb_back/create_point"
279
- get_full_data = lambda: {"title": "test_point", "x": 1, "y": 2, "z": 3}
280
-
281
- # Normal test with all keys
282
- response = client.post(route, json=get_full_data())
283
- assert response.status_code == 200
284
- viewable_file_name = response.json["viewable_file_name"]
285
- assert type(viewable_file_name) is str
286
- id = response.json.get("id")
287
- assert type(id) is str
288
-
289
- # Test all params
290
- test_utils.test_route_wrong_params(client, route, get_full_data)
291
-
292
-
293
277
  def test_database_uri_path(client):
294
278
  app = client.application
295
279
  with app.app_context():
@@ -1,17 +0,0 @@
1
- asgiref>=3
2
- blinker>=1
3
- click>=8
4
- flask[async]>=3
5
- flask-cors==6.0.1
6
- geode-common==33.11.0
7
- geode-viewables==3.3.0
8
- itsdangerous>=2
9
- jinja2>=3
10
- markupsafe>=3
11
- opengeode-core==15.27.4
12
- opengeode-geosciences==9.4.1
13
- opengeode-geosciencesio==5.8.0
14
- opengeode-inspector==6.8.1
15
- opengeode-io==7.4.0
16
- werkzeug==3.1.2
17
- opengeodeweb-microservice==1.*,>=1.0.5rc1
@@ -1,29 +0,0 @@
1
- {
2
- "route": "/create_point",
3
- "methods": [
4
- "POST"
5
- ],
6
- "type": "object",
7
- "properties": {
8
- "title": {
9
- "type": "string",
10
- "minLength": 1
11
- },
12
- "x": {
13
- "type": "number"
14
- },
15
- "y": {
16
- "type": "number"
17
- },
18
- "z": {
19
- "type": "number"
20
- }
21
- },
22
- "required": [
23
- "title",
24
- "x",
25
- "y",
26
- "z"
27
- ],
28
- "additionalProperties": false
29
- }