@geode/opengeodeweb-back 0.0.0-semantically-released

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 (88) hide show
  1. package/.gitattributes +2 -0
  2. package/.github/workflows/Branch-protection.yml +11 -0
  3. package/.github/workflows/CD.yml +53 -0
  4. package/.github/workflows/prepare_pr.yml +11 -0
  5. package/.pylintrc +536 -0
  6. package/.pypirc +6 -0
  7. package/CHANGELOG.md +1223 -0
  8. package/COPYLEFT +4 -0
  9. package/LICENSE +21 -0
  10. package/README.md +32 -0
  11. package/app.py +54 -0
  12. package/config.py +29 -0
  13. package/generate_schemas.js +82 -0
  14. package/package.json +31 -0
  15. package/pyproject.toml +48 -0
  16. package/requirements.in +15 -0
  17. package/requirements.txt +116 -0
  18. package/src/OpenGeodeWeb_Back.egg-info/PKG-INFO +74 -0
  19. package/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt +22 -0
  20. package/src/OpenGeodeWeb_Back.egg-info/dependency_links.txt +1 -0
  21. package/src/OpenGeodeWeb_Back.egg-info/requires.txt +28 -0
  22. package/src/OpenGeodeWeb_Back.egg-info/top_level.txt +1 -0
  23. package/src/opengeodeweb_back/__init__.py +0 -0
  24. package/src/opengeodeweb_back/geode_functions.py +330 -0
  25. package/src/opengeodeweb_back/geode_objects.py +429 -0
  26. package/src/opengeodeweb_back/inspector_functions.py +483 -0
  27. package/src/opengeodeweb_back/routes/blueprint_routes.py +178 -0
  28. package/src/opengeodeweb_back/routes/schemas/allowed_files.json +20 -0
  29. package/src/opengeodeweb_back/routes/schemas/allowed_objects.json +16 -0
  30. package/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json +21 -0
  31. package/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json +17 -0
  32. package/src/opengeodeweb_back/routes/schemas/missing_files.json +16 -0
  33. package/src/opengeodeweb_back/routes/schemas/upload_file.json +15 -0
  34. package/tests/__init__.py +0 -0
  35. package/tests/conftest.py +12 -0
  36. package/tests/corbi.og_brep +0 -0
  37. package/tests/data/test.bmp +0 -0
  38. package/tests/data/test.dat +11 -0
  39. package/tests/data/test.dev +121 -0
  40. package/tests/data/test.dxf +4184 -0
  41. package/tests/data/test.grdecl +2555 -0
  42. package/tests/data/test.jpg +0 -0
  43. package/tests/data/test.lso +3637 -0
  44. package/tests/data/test.ml +78770 -0
  45. package/tests/data/test.msh +800 -0
  46. package/tests/data/test.obj +24 -0
  47. package/tests/data/test.og_brep +0 -0
  48. package/tests/data/test.og_edc2d +0 -0
  49. package/tests/data/test.og_edc3d +0 -0
  50. package/tests/data/test.og_grp +0 -0
  51. package/tests/data/test.og_hso3d +0 -0
  52. package/tests/data/test.og_img2d +3 -0
  53. package/tests/data/test.og_img3d +0 -0
  54. package/tests/data/test.og_lrgd2d +0 -0
  55. package/tests/data/test.og_lrgd3d +0 -0
  56. package/tests/data/test.og_psf2d +0 -0
  57. package/tests/data/test.og_psf3d +0 -0
  58. package/tests/data/test.og_pso3d +0 -0
  59. package/tests/data/test.og_pts2d +0 -0
  60. package/tests/data/test.og_pts3d +0 -0
  61. package/tests/data/test.og_rgd2d +0 -0
  62. package/tests/data/test.og_rgd3d +0 -0
  63. package/tests/data/test.og_sctn +0 -0
  64. package/tests/data/test.og_strm +0 -0
  65. package/tests/data/test.og_tsf2d +0 -0
  66. package/tests/data/test.og_tsf3d +0 -0
  67. package/tests/data/test.og_tso3d +0 -0
  68. package/tests/data/test.og_vts +0 -0
  69. package/tests/data/test.og_xsctn +0 -0
  70. package/tests/data/test.ply +20 -0
  71. package/tests/data/test.png +0 -0
  72. package/tests/data/test.shp +0 -0
  73. package/tests/data/test.shx +0 -0
  74. package/tests/data/test.shz +0 -0
  75. package/tests/data/test.smesh +2049 -0
  76. package/tests/data/test.stl +7191 -0
  77. package/tests/data/test.svg +144 -0
  78. package/tests/data/test.ts +266 -0
  79. package/tests/data/test.txt +11 -0
  80. package/tests/data/test.vo +49 -0
  81. package/tests/data/test.vti +3 -0
  82. package/tests/data/test.vtp +212 -0
  83. package/tests/data/test.vtu +3585 -0
  84. package/tests/data/test.wl +76 -0
  85. package/tests/data/test__ascii@@ +1003 -0
  86. package/tests/test_functions.py +291 -0
  87. package/tests/test_routes.py +131 -0
  88. package/tmp.3491.json +0 -0
@@ -0,0 +1,330 @@
1
+ # Standard library imports
2
+ import os
3
+ import time
4
+ import threading
5
+ import uuid
6
+ import zipfile
7
+
8
+ # Third party imports
9
+ import flask
10
+ import opengeode_geosciences as og_gs
11
+ import opengeode as og
12
+ import pkg_resources
13
+ from jsonschema import validate
14
+ from jsonschema.exceptions import ValidationError
15
+
16
+ # Local application imports
17
+ from .geode_objects import geode_objects_dict
18
+
19
+
20
+ def geode_object_value(geode_object: str):
21
+ return geode_objects_dict()[geode_object]
22
+
23
+
24
+ def input_factory(geode_object: str):
25
+ return geode_object_value(geode_object)["input_factory"]
26
+
27
+
28
+ def output_factory(geode_object: str):
29
+ return geode_object_value(geode_object)["output_factory"]
30
+
31
+
32
+ def missing_files(geode_object: str, file_absolute_path: str):
33
+ return geode_object_value(geode_object)["missing_files"](file_absolute_path)
34
+
35
+
36
+ def is_loadable(geode_object: str, file_absolute_path: str):
37
+ return geode_object_value(geode_object)["is_loadable"](file_absolute_path)
38
+
39
+
40
+ def load(geode_object: str, file_absolute_path: str):
41
+ return geode_object_value(geode_object)["load"](file_absolute_path)
42
+
43
+
44
+ def is_saveable(geode_object: str, data, filename: str):
45
+ return geode_object_value(geode_object)["is_saveable"](data, filename)
46
+
47
+
48
+ def save(geode_object: str, data, folder_absolute_path: str, filename: str):
49
+ return geode_object_value(geode_object)["save"](
50
+ data, os.path.join(folder_absolute_path, filename)
51
+ )
52
+
53
+
54
+ def create_builder(geode_object: str, data):
55
+ return geode_object_value(geode_object)["builder"](data)
56
+
57
+
58
+ def assign_crs(geode_object: str, data, crs_name: str, info):
59
+ builder = create_builder(geode_object, data)
60
+ geode_object_value(geode_object)["crs"]["assign"](data, builder, crs_name, info)
61
+
62
+
63
+ def convert_crs(geode_object: str, data, crs_name: str, info):
64
+ builder = create_builder(geode_object, data)
65
+ geode_object_value(geode_object)["crs"]["convert"](data, builder, crs_name, info)
66
+
67
+
68
+ def create_crs(
69
+ geode_object: str,
70
+ data,
71
+ name: str,
72
+ input_coordiante_system,
73
+ output_coordiante_system,
74
+ ):
75
+ builder = create_builder(geode_object, data)
76
+ geode_object_value(geode_object)["crs"]["create"](
77
+ data, builder, name, input_coordiante_system, output_coordiante_system
78
+ )
79
+
80
+
81
+ def is_model(geode_object: str):
82
+ return geode_object_value(geode_object)["is_model"]
83
+
84
+
85
+ def is_3D(geode_object: str):
86
+ return geode_object_value(geode_object)["is_3D"]
87
+
88
+
89
+ def is_viewable(geode_object: str):
90
+ return geode_object_value(geode_object)["is_viewable"]
91
+
92
+
93
+ def inspector(geode_object: str, data):
94
+ return geode_object_value(geode_object)["inspector"](data)
95
+
96
+
97
+ def save_viewable(geode_object: str, data, folder_absolute_path: str, id: str):
98
+ return geode_object_value(geode_object)["save_viewable"](
99
+ data, os.path.join(folder_absolute_path, id)
100
+ )
101
+
102
+
103
+ def geode_object_input_extensions(geode_object: str):
104
+ geode_object_input_list_creators = input_factory(geode_object).list_creators()
105
+ geode_object_input_list_creators.sort()
106
+ return geode_object_input_list_creators
107
+
108
+
109
+ def geode_object_output_extensions(geode_object: str):
110
+ geode_object_output_list_creators = output_factory(geode_object).list_creators()
111
+ geode_object_output_list_creators.sort()
112
+ return geode_object_output_list_creators
113
+
114
+
115
+ def filter_geode_objects(key: str = None):
116
+ geode_objects_filtered_list = []
117
+ for geode_object, value in geode_objects_dict().items():
118
+ if key != None and key != "":
119
+ if key in value:
120
+ if type(value[key]) == bool:
121
+ geode_objects_filtered_list.append(geode_object)
122
+ else:
123
+ geode_objects_filtered_list.append(geode_object)
124
+ else:
125
+ geode_objects_filtered_list.append(geode_object)
126
+ geode_objects_filtered_list.sort()
127
+ return geode_objects_filtered_list
128
+
129
+
130
+ def list_input_extensions(key: str = None):
131
+ extensions_list = []
132
+ geode_objects_filtered_list = filter_geode_objects(key)
133
+ for geode_object in geode_objects_filtered_list:
134
+ extensions_list += geode_object_input_extensions(geode_object)
135
+
136
+ extensions_list = list(set(extensions_list))
137
+ extensions_list.sort()
138
+ return extensions_list
139
+
140
+
141
+ def has_creator(geode_object: str, extension: str):
142
+ return input_factory(geode_object).has_creator(extension)
143
+
144
+
145
+ def list_geode_objects(
146
+ file_absolute_path: str,
147
+ key: str = None,
148
+ ):
149
+ return_dict = {}
150
+ file_extension = extension_from_filename(os.path.basename(file_absolute_path))
151
+ geode_objects_filtered_list = filter_geode_objects(key)
152
+
153
+ for geode_object in geode_objects_filtered_list:
154
+ if has_creator(geode_object, file_extension):
155
+ file_is_loadable = is_loadable(geode_object, file_absolute_path)
156
+ return_dict[geode_object] = {"is_loadable": file_is_loadable}
157
+ return return_dict
158
+
159
+
160
+ def geode_objects_output_extensions(geode_object: str, data):
161
+ geode_objects_output_extensions_dict = {}
162
+ output_extensions = geode_object_output_extensions(geode_object)
163
+ extensions_dict = {}
164
+ for output_extension in output_extensions:
165
+ bool_is_saveable = is_saveable(geode_object, data, f"test.{output_extension}")
166
+ extensions_dict[output_extension] = {"is_saveable": bool_is_saveable}
167
+ geode_objects_output_extensions_dict[geode_object] = extensions_dict
168
+
169
+ if "parent" in geode_object_value(geode_object).keys():
170
+ parent_geode_object = geode_object_value(geode_object)["parent"]
171
+ geode_objects_output_extensions_dict.update(
172
+ geode_objects_output_extensions(parent_geode_object, data)
173
+ )
174
+ return geode_objects_output_extensions_dict
175
+
176
+
177
+ def versions(list_packages: list):
178
+ list_with_versions = []
179
+ for package in list_packages:
180
+ list_with_versions.append(
181
+ {
182
+ "package": package,
183
+ "version": pkg_resources.get_distribution(package).version,
184
+ }
185
+ )
186
+ return list_with_versions
187
+
188
+
189
+ def create_lock_file(
190
+ folder_absolute_path,
191
+ ):
192
+ if not os.path.exists(folder_absolute_path):
193
+ os.mkdir(folder_absolute_path)
194
+ id = uuid.uuid4()
195
+ file_absolute_path = f"{folder_absolute_path}/{str(id)}.txt"
196
+ f = open(file_absolute_path, "a")
197
+ f.close()
198
+ flask.g.UUID = id
199
+
200
+
201
+ def create_time_file(folder_absolute_path):
202
+ if not os.path.exists(folder_absolute_path):
203
+ os.mkdir(folder_absolute_path)
204
+ file_path = f"{folder_absolute_path}/time.txt"
205
+ if not os.path.isfile(file_path):
206
+ f = open(file_path, "w")
207
+ f.close()
208
+
209
+ f = open(folder_absolute_path + "/time.txt", "w")
210
+ f.write(str(time.time()))
211
+ f.close()
212
+
213
+
214
+ def remove_lock_file(folder_absolute_path):
215
+ id = flask.g.UUID
216
+ os.remove(f"{folder_absolute_path}/{str(id)}.txt")
217
+
218
+
219
+ def set_interval(func, sec):
220
+ def func_wrapper():
221
+ set_interval(func, sec)
222
+ func()
223
+
224
+ t = threading.Timer(sec, func_wrapper)
225
+ t.daemon = True
226
+ t.start()
227
+ return t
228
+
229
+
230
+ def extension_from_filename(filename):
231
+ return os.path.splitext(filename)[1][1:]
232
+
233
+
234
+ def validate_request(request, schema):
235
+ json_data = request.get_json(force=True, silent=True)
236
+
237
+ if json_data is None:
238
+ json_data = {}
239
+
240
+ try:
241
+ validate(instance=json_data, schema=schema)
242
+ except ValidationError as e:
243
+ flask.abort(400, f"Validation error: {e.message}")
244
+
245
+
246
+ def geographic_coordinate_systems(geode_object: str):
247
+ if is_3D(geode_object):
248
+ return og_gs.GeographicCoordinateSystem3D.geographic_coordinate_systems()
249
+ else:
250
+ return og_gs.GeographicCoordinateSystem2D.geographic_coordinate_systems()
251
+
252
+
253
+ def geographic_coordinate_systems_info(geode_object: str, crs):
254
+ if is_3D(geode_object):
255
+ return og_gs.GeographicCoordinateSystemInfo3D(
256
+ crs["authority"], crs["code"], crs["name"]
257
+ )
258
+ else:
259
+ return og_gs.GeographicCoordinateSystemInfo2D(
260
+ crs["authority"], crs["code"], crs["name"]
261
+ )
262
+
263
+
264
+ def coordinate_system(geode_object: str, coordinate_system):
265
+ return og.CoordinateSystem2D(
266
+ [
267
+ og.Vector2D(
268
+ og.Point2D(
269
+ [coordinate_system["origin_x"], coordinate_system["origin_y"]]
270
+ ),
271
+ og.Point2D(
272
+ [coordinate_system["point_1_x"], coordinate_system["point_1_y"]]
273
+ ),
274
+ ),
275
+ og.Vector2D(
276
+ og.Point2D(
277
+ [coordinate_system["origin_x"], coordinate_system["origin_y"]]
278
+ ),
279
+ og.Point2D(
280
+ [coordinate_system["point_2_x"], coordinate_system["point_2_y"]]
281
+ ),
282
+ ),
283
+ ],
284
+ og.Point2D([coordinate_system["origin_x"], coordinate_system["origin_y"]]),
285
+ )
286
+
287
+
288
+ def assign_geographic_coordinate_system_info(geode_object: str, data, input_crs):
289
+ info = geographic_coordinate_systems_info(geode_object, input_crs)
290
+ assign_crs(geode_object, data, input_crs["name"], info)
291
+
292
+
293
+ def convert_geographic_coordinate_system_info(geode_object: str, data, output_crs):
294
+ info = geographic_coordinate_systems_info(geode_object, output_crs)
295
+ convert_crs(geode_object, data, output_crs["name"], info)
296
+
297
+
298
+ def create_coordinate_system(
299
+ geode_object: str, data, name, input_coordinate_points, output_coordinate_points
300
+ ):
301
+ input_coordiante_system = coordinate_system(geode_object, input_coordinate_points)
302
+ output_coordiante_system = coordinate_system(geode_object, output_coordinate_points)
303
+ create_crs(
304
+ geode_object, data, name, input_coordiante_system, output_coordiante_system
305
+ )
306
+
307
+
308
+ def send_file(upload_folder, saved_files, new_file_name):
309
+ if len(saved_files) == 1:
310
+ mimetype = "application/octet-binary"
311
+ else:
312
+ mimetype = "application/zip"
313
+ new_file_name = os.path.splitext(new_file_name)[0] + ".zip"
314
+ with zipfile.ZipFile(os.path.join(upload_folder, new_file_name), "w") as zipObj:
315
+ for saved_file_path in saved_files:
316
+ zipObj.write(
317
+ saved_file_path,
318
+ os.path.basename(saved_file_path),
319
+ )
320
+
321
+ response = flask.send_from_directory(
322
+ directory=upload_folder,
323
+ path=new_file_name,
324
+ as_attachment=True,
325
+ mimetype=mimetype,
326
+ )
327
+ response.headers["new-file-name"] = new_file_name
328
+ response.headers["Access-Control-Expose-Headers"] = "new-file-name"
329
+
330
+ return response