OpenGeodeWeb-Back 5.10.4rc1__tar.gz → 5.10.5rc1__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 (43) hide show
  1. {opengeodeweb_back-5.10.4rc1/src/OpenGeodeWeb_Back.egg-info → opengeodeweb_back-5.10.5rc1}/PKG-INFO +2 -2
  2. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/pyproject.toml +1 -1
  3. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/requirements.txt +1 -1
  4. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1/src/OpenGeodeWeb_Back.egg-info}/PKG-INFO +2 -2
  5. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/OpenGeodeWeb_Back.egg-info/requires.txt +1 -1
  6. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/app.py +12 -2
  7. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/blueprint_routes.py +0 -14
  8. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/utils_functions.py +39 -36
  9. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/tests/test_models_routes.py +1 -0
  10. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/tests/test_routes.py +20 -4
  11. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/tests/test_utils_functions.py +19 -9
  12. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/LICENSE +0 -0
  13. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/README.md +0 -0
  14. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/setup.cfg +0 -0
  15. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt +0 -0
  16. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/OpenGeodeWeb_Back.egg-info/dependency_links.txt +0 -0
  17. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/OpenGeodeWeb_Back.egg-info/entry_points.txt +0 -0
  18. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/OpenGeodeWeb_Back.egg-info/top_level.txt +0 -0
  19. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/__init__.py +0 -0
  20. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/app_config.py +0 -0
  21. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/geode_functions.py +0 -0
  22. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/geode_objects.py +0 -0
  23. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/py.typed +0 -0
  24. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/models/blueprint_models.py +0 -0
  25. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/models/schemas/mesh_components.json +0 -0
  26. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/models/schemas/vtm_component_indices.json +0 -0
  27. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/allowed_files.json +0 -0
  28. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/allowed_objects.json +0 -0
  29. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/create_point.json +0 -0
  30. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json +0 -0
  31. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json +0 -0
  32. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/inspect_file.json +0 -0
  33. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/kill.json +0 -0
  34. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/missing_files.json +0 -0
  35. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/ping.json +0 -0
  36. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.json +0 -0
  37. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.json +0 -0
  38. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/save_viewable_file.json +0 -0
  39. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/texture_coordinates.json +0 -0
  40. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/upload_file.json +0 -0
  41. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.json +0 -0
  42. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/src/opengeodeweb_back/test_utils.py +0 -0
  43. {opengeodeweb_back-5.10.4rc1 → opengeodeweb_back-5.10.5rc1}/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.10.4rc1
3
+ Version: 5.10.5rc1
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.0
27
27
  Requires-Dist: opengeode-inspector==6.8.1
28
28
  Requires-Dist: opengeode-io==7.4.0
29
29
  Requires-Dist: werkzeug==3.1.2
30
- Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.4
30
+ Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.5rc1
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.4-rc.1"
7
+ version = "5.10.5-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"
@@ -60,4 +60,4 @@ werkzeug==3.1.2
60
60
  # flask
61
61
  # flask-cors
62
62
 
63
- opengeodeweb-microservice==1.*,>=1.0.4
63
+ opengeodeweb-microservice==1.*,>=1.0.5rc1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 5.10.4rc1
3
+ Version: 5.10.5rc1
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.0
27
27
  Requires-Dist: opengeode-inspector==6.8.1
28
28
  Requires-Dist: opengeode-io==7.4.0
29
29
  Requires-Dist: werkzeug==3.1.2
30
- Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.4
30
+ Requires-Dist: opengeodeweb-microservice==1.*,>=1.0.5rc1
31
31
  Dynamic: license-file
32
32
 
33
33
  <h1 align="center">OpenGeodeWeb-Back<sup><i>by Geode-solutions</i></sup></h1>
@@ -14,4 +14,4 @@ opengeode-geosciencesio==5.8.0
14
14
  opengeode-inspector==6.8.1
15
15
  opengeode-io==7.4.0
16
16
  werkzeug==3.1.2
17
- opengeodeweb-microservice==1.*,>=1.0.4
17
+ opengeodeweb-microservice==1.*,>=1.0.5rc1
@@ -14,7 +14,7 @@ from werkzeug.exceptions import HTTPException
14
14
  from opengeodeweb_back import utils_functions, app_config
15
15
  from opengeodeweb_back.routes import blueprint_routes
16
16
  from opengeodeweb_back.routes.models import blueprint_models
17
- from opengeodeweb_microservice.database.connection import init_database
17
+ from opengeodeweb_microservice.database import connection
18
18
 
19
19
 
20
20
  """ Global config """
@@ -39,6 +39,16 @@ SECONDS_BETWEEN_SHUTDOWNS: float = float(
39
39
  )
40
40
 
41
41
 
42
+ @app.before_request
43
+ def before_request() -> None:
44
+ utils_functions.before_request(flask.current_app)
45
+
46
+
47
+ @app.teardown_request
48
+ def teardown_request(exception: BaseException | None) -> None:
49
+ utils_functions.teardown_request(flask.current_app, exception)
50
+
51
+
42
52
  app.register_blueprint(
43
53
  blueprint_routes.routes,
44
54
  url_prefix="/opengeodeweb_back",
@@ -146,7 +156,7 @@ def run_server() -> None:
146
156
  app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{db_path}"
147
157
  app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
148
158
 
149
- init_database(db_path)
159
+ connection.init_database(db_path)
150
160
  print(f"Database initialized at: {db_path}", flush=True)
151
161
 
152
162
  app.run(debug=args.debug, host=args.host, port=args.port, ssl_context=SSL)
@@ -16,20 +16,6 @@ from .models import blueprint_models
16
16
  routes = flask.Blueprint("routes", __name__, url_prefix="/opengeodeweb_back")
17
17
 
18
18
 
19
- @routes.before_request
20
- def before_request():
21
- if "ping" not in flask.request.path:
22
- utils_functions.increment_request_counter(flask.current_app)
23
-
24
-
25
- @routes.teardown_request
26
- def teardown_request(exception):
27
-
28
- if "ping" not in flask.request.path:
29
- utils_functions.decrement_request_counter(flask.current_app)
30
- utils_functions.update_last_request_time(flask.current_app)
31
-
32
-
33
19
  routes.register_blueprint(
34
20
  blueprint_models.routes,
35
21
  url_prefix=blueprint_models.routes.url_prefix,
@@ -4,7 +4,6 @@ import threading
4
4
  import time
5
5
  import zipfile
6
6
  from collections.abc import Callable
7
- from typing import Any
8
7
  from concurrent.futures import ThreadPoolExecutor
9
8
 
10
9
  # Third party imports
@@ -41,13 +40,28 @@ def update_last_request_time(current_app: flask.Flask) -> None:
41
40
  current_app.config.update(LAST_REQUEST_TIME=LAST_REQUEST_TIME)
42
41
 
43
42
 
43
+ def terminate_session(exception: BaseException | None) -> None:
44
+ session = flask.g.pop("session", None)
45
+ if session is None:
46
+ return
47
+ if exception is None:
48
+ session.commit()
49
+ else:
50
+ session.rollback()
51
+ session.close()
52
+
53
+
44
54
  def before_request(current_app: flask.Flask) -> None:
45
55
  increment_request_counter(current_app)
56
+ flask.g.session = get_session()
46
57
 
47
58
 
48
- def teardown_request(current_app: flask.Flask) -> None:
59
+ def teardown_request(
60
+ current_app: flask.Flask, exception: BaseException | None = None
61
+ ) -> None:
49
62
  decrement_request_counter(current_app)
50
63
  update_last_request_time(current_app)
64
+ terminate_session(exception)
51
65
 
52
66
 
53
67
  def kill_task(current_app: flask.Flask) -> None:
@@ -97,7 +111,7 @@ def validate_request(request: flask.Request, schema: dict[str, str]) -> None:
97
111
 
98
112
 
99
113
  def set_interval(
100
- function: Callable[[Any], None], seconds: float, args: Any
114
+ function: Callable[[flask.Flask], None], seconds: float, args: flask.Flask
101
115
  ) -> threading.Timer:
102
116
  def function_wrapper() -> None:
103
117
  set_interval(function, seconds, args)
@@ -114,7 +128,7 @@ def extension_from_filename(filename: str) -> str:
114
128
 
115
129
 
116
130
  def send_file(
117
- upload_folder: str, saved_files: str, new_file_name: str
131
+ upload_folder: str, saved_files: list[str], new_file_name: str
118
132
  ) -> flask.Response:
119
133
  if len(saved_files) == 1:
120
134
  mimetype = "application/octet-binary"
@@ -162,19 +176,10 @@ def create_data_folder_from_id(data_id: str) -> str:
162
176
 
163
177
  def save_all_viewables_and_return_info(
164
178
  geode_object: str,
165
- data: Any,
166
- input_file: str | None = None,
167
- additional_files: list[str] | None = None,
168
- ) -> dict[str, Any]:
169
- if additional_files is None:
170
- additional_files = []
171
-
172
- data_entry = Data.create(
173
- geode_object=geode_object,
174
- input_file=input_file,
175
- additional_files=additional_files,
176
- )
177
- data_path = create_data_folder_from_id(data_entry.id)
179
+ data: object,
180
+ data_entry: Data,
181
+ data_path: str,
182
+ ) -> dict[str, str | list[str]]:
178
183
  with ThreadPoolExecutor() as executor:
179
184
  native_future = executor.submit(
180
185
  geode_functions.save,
@@ -202,10 +207,6 @@ def save_all_viewables_and_return_info(
202
207
  data_entry.viewable_file_name = os.path.basename(saved_viewable_file_path)
203
208
  data_entry.light_viewable = os.path.basename(saved_light_viewable_file_path)
204
209
 
205
- session = get_session()
206
- if session:
207
- session.commit()
208
-
209
210
  return {
210
211
  "native_file_name": data_entry.native_file_name,
211
212
  "viewable_file_name": data_entry.viewable_file_name,
@@ -219,23 +220,29 @@ def save_all_viewables_and_return_info(
219
220
 
220
221
 
221
222
  def generate_native_viewable_and_light_viewable_from_object(
222
- geode_object: str, data: Any
223
- ) -> dict[str, Any]:
224
- return save_all_viewables_and_return_info(geode_object, data, input_file="")
223
+ geode_object: str, data: object
224
+ ) -> dict[str, str | list[str]]:
225
+ data_entry = Data.create(
226
+ geode_object=geode_object,
227
+ viewer_object=geode_functions.get_object_type(geode_object),
228
+ input_file="",
229
+ additional_files=[],
230
+ )
231
+ data_path = create_data_folder_from_id(data_entry.id)
232
+ return save_all_viewables_and_return_info(geode_object, data, data_entry, data_path)
225
233
 
226
234
 
227
235
  def generate_native_viewable_and_light_viewable_from_file(
228
236
  geode_object: str, input_filename: str
229
- ) -> dict[str, Any]:
230
-
231
- session = get_session()
232
- temp_data_entry = Data.create(
237
+ ) -> dict[str, str | list[str]]:
238
+ data_entry = Data.create(
233
239
  geode_object=geode_object,
240
+ viewer_object=geode_functions.get_object_type(geode_object),
234
241
  input_file=input_filename,
235
242
  additional_files=[],
236
243
  )
237
244
 
238
- data_path = create_data_folder_from_id(temp_data_entry.id)
245
+ data_path = create_data_folder_from_id(data_entry.id)
239
246
 
240
247
  full_input_filename = geode_functions.upload_file_path(input_filename)
241
248
  copied_full_path = os.path.join(
@@ -260,14 +267,10 @@ def generate_native_viewable_and_light_viewable_from_file(
260
267
 
261
268
  data = geode_functions.load(geode_object, copied_full_path)
262
269
 
263
- if session:
264
- session.delete(temp_data_entry)
265
- session.flush()
266
- session.commit()
267
-
270
+ data_entry.additional_files = additional_files_copied
268
271
  return save_all_viewables_and_return_info(
269
272
  geode_object,
270
273
  data,
271
- input_file=input_filename,
272
- additional_files=additional_files_copied,
274
+ data_entry,
275
+ data_path,
273
276
  )
@@ -35,6 +35,7 @@ def test_extract_brep_uuids(client, test_id):
35
35
  with client.application.app_context():
36
36
  data_entry = Data.create(
37
37
  geode_object="BRep",
38
+ viewer_object=geode_functions.get_object_type("BRep"),
38
39
  input_file=brep_filename,
39
40
  )
40
41
  data_entry.native_file_name = brep_filename
@@ -171,7 +171,11 @@ def test_save_viewable_file(client):
171
171
 
172
172
  def test_texture_coordinates(client, test_id):
173
173
  with client.application.app_context():
174
- data = Data.create(geode_object="PolygonalSurface3D", input_file="hat.vtp")
174
+ data = Data.create(
175
+ geode_object="PolygonalSurface3D",
176
+ viewer_object=geode_functions.get_object_type("PolygonalSurface3D"),
177
+ input_file="hat.vtp",
178
+ )
175
179
  data.native_file_name = "hat.vtp"
176
180
  session = get_session()
177
181
  if session:
@@ -195,7 +199,11 @@ def test_vertex_attribute_names(client, test_id):
195
199
  route = f"/opengeodeweb_back/vertex_attribute_names"
196
200
 
197
201
  with client.application.app_context():
198
- data = Data.create(geode_object="PolygonalSurface3D", input_file="test.vtp")
202
+ data = Data.create(
203
+ geode_object="PolygonalSurface3D",
204
+ viewer_object=geode_functions.get_object_type("PolygonalSurface3D"),
205
+ input_file="test.vtp",
206
+ )
199
207
  data.native_file_name = "test.vtp"
200
208
  session = get_session()
201
209
  if session:
@@ -217,7 +225,11 @@ def test_polygon_attribute_names(client, test_id):
217
225
  route = f"/opengeodeweb_back/polygon_attribute_names"
218
226
 
219
227
  with client.application.app_context():
220
- data = Data.create(geode_object="PolygonalSurface3D", input_file="test.vtp")
228
+ data = Data.create(
229
+ geode_object="PolygonalSurface3D",
230
+ viewer_object=geode_functions.get_object_type("PolygonalSurface3D"),
231
+ input_file="test.vtp",
232
+ )
221
233
  data.native_file_name = "test.vtp"
222
234
  session = get_session()
223
235
  if session:
@@ -239,7 +251,11 @@ def test_polyhedron_attribute_names(client, test_id):
239
251
  route = f"/opengeodeweb_back/polyhedron_attribute_names"
240
252
 
241
253
  with client.application.app_context():
242
- data = Data.create(geode_object="PolyhedralSolid3D", input_file="test.vtu")
254
+ data = Data.create(
255
+ geode_object="PolyhedralSolid3D",
256
+ viewer_object=geode_functions.get_object_type("PolyhedralSolid3D"),
257
+ input_file="test.vtu",
258
+ )
243
259
  data.native_file_name = "test.vtu"
244
260
  session = get_session()
245
261
  if session:
@@ -103,8 +103,16 @@ def test_save_all_viewables_and_return_info(client):
103
103
  input_file = "test.og_brep"
104
104
  additional_files = ["additional_file.txt"]
105
105
 
106
+ data_entry = Data.create(
107
+ geode_object=geode_object,
108
+ viewer_object=geode_functions.get_object_type(geode_object),
109
+ input_file=input_file,
110
+ additional_files=additional_files,
111
+ )
112
+ data_path = utils_functions.create_data_folder_from_id(data_entry.id)
113
+
106
114
  result = utils_functions.save_all_viewables_and_return_info(
107
- geode_object, data, input_file, additional_files
115
+ geode_object, data, data_entry, data_path
108
116
  )
109
117
 
110
118
  assert isinstance(result, dict)
@@ -136,20 +144,22 @@ def test_save_all_viewables_commits_to_db(client):
136
144
  geode_object = "BRep"
137
145
  data = geode_functions.load(geode_object, "./tests/data/test.og_brep")
138
146
  input_file = "test.og_brep"
147
+
148
+ data_entry = Data.create(
149
+ geode_object=geode_object,
150
+ viewer_object=geode_functions.get_object_type(geode_object),
151
+ input_file=input_file,
152
+ additional_files=[],
153
+ )
154
+ data_path = utils_functions.create_data_folder_from_id(data_entry.id)
155
+
139
156
  result = utils_functions.save_all_viewables_and_return_info(
140
- geode_object, data, input_file
157
+ geode_object, data, data_entry, data_path
141
158
  )
142
159
  data_id = result["id"]
143
160
  db_entry_before = Data.get(data_id)
144
161
  assert db_entry_before is not None
145
162
  assert db_entry_before.native_file_name == result["native_file_name"]
146
- session = get_session()
147
- session.rollback()
148
- db_entry_after = Data.get(data_id)
149
- assert (
150
- db_entry_after is not None
151
- ), "database.session.commit() was not called - entry missing after rollback"
152
- assert db_entry_after.native_file_name == result["native_file_name"]
153
163
 
154
164
 
155
165
  def test_generate_native_viewable_and_light_viewable_from_object(client):