@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.
- package/.gitattributes +2 -0
- package/.github/workflows/Branch-protection.yml +11 -0
- package/.github/workflows/CD.yml +53 -0
- package/.github/workflows/prepare_pr.yml +11 -0
- package/.pylintrc +536 -0
- package/.pypirc +6 -0
- package/CHANGELOG.md +1223 -0
- package/COPYLEFT +4 -0
- package/LICENSE +21 -0
- package/README.md +32 -0
- package/app.py +54 -0
- package/config.py +29 -0
- package/generate_schemas.js +82 -0
- package/package.json +31 -0
- package/pyproject.toml +48 -0
- package/requirements.in +15 -0
- package/requirements.txt +116 -0
- package/src/OpenGeodeWeb_Back.egg-info/PKG-INFO +74 -0
- package/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt +22 -0
- package/src/OpenGeodeWeb_Back.egg-info/dependency_links.txt +1 -0
- package/src/OpenGeodeWeb_Back.egg-info/requires.txt +28 -0
- package/src/OpenGeodeWeb_Back.egg-info/top_level.txt +1 -0
- package/src/opengeodeweb_back/__init__.py +0 -0
- package/src/opengeodeweb_back/geode_functions.py +330 -0
- package/src/opengeodeweb_back/geode_objects.py +429 -0
- package/src/opengeodeweb_back/inspector_functions.py +483 -0
- package/src/opengeodeweb_back/routes/blueprint_routes.py +178 -0
- package/src/opengeodeweb_back/routes/schemas/allowed_files.json +20 -0
- package/src/opengeodeweb_back/routes/schemas/allowed_objects.json +16 -0
- package/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json +21 -0
- package/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json +17 -0
- package/src/opengeodeweb_back/routes/schemas/missing_files.json +16 -0
- package/src/opengeodeweb_back/routes/schemas/upload_file.json +15 -0
- package/tests/__init__.py +0 -0
- package/tests/conftest.py +12 -0
- package/tests/corbi.og_brep +0 -0
- package/tests/data/test.bmp +0 -0
- package/tests/data/test.dat +11 -0
- package/tests/data/test.dev +121 -0
- package/tests/data/test.dxf +4184 -0
- package/tests/data/test.grdecl +2555 -0
- package/tests/data/test.jpg +0 -0
- package/tests/data/test.lso +3637 -0
- package/tests/data/test.ml +78770 -0
- package/tests/data/test.msh +800 -0
- package/tests/data/test.obj +24 -0
- package/tests/data/test.og_brep +0 -0
- package/tests/data/test.og_edc2d +0 -0
- package/tests/data/test.og_edc3d +0 -0
- package/tests/data/test.og_grp +0 -0
- package/tests/data/test.og_hso3d +0 -0
- package/tests/data/test.og_img2d +3 -0
- package/tests/data/test.og_img3d +0 -0
- package/tests/data/test.og_lrgd2d +0 -0
- package/tests/data/test.og_lrgd3d +0 -0
- package/tests/data/test.og_psf2d +0 -0
- package/tests/data/test.og_psf3d +0 -0
- package/tests/data/test.og_pso3d +0 -0
- package/tests/data/test.og_pts2d +0 -0
- package/tests/data/test.og_pts3d +0 -0
- package/tests/data/test.og_rgd2d +0 -0
- package/tests/data/test.og_rgd3d +0 -0
- package/tests/data/test.og_sctn +0 -0
- package/tests/data/test.og_strm +0 -0
- package/tests/data/test.og_tsf2d +0 -0
- package/tests/data/test.og_tsf3d +0 -0
- package/tests/data/test.og_tso3d +0 -0
- package/tests/data/test.og_vts +0 -0
- package/tests/data/test.og_xsctn +0 -0
- package/tests/data/test.ply +20 -0
- package/tests/data/test.png +0 -0
- package/tests/data/test.shp +0 -0
- package/tests/data/test.shx +0 -0
- package/tests/data/test.shz +0 -0
- package/tests/data/test.smesh +2049 -0
- package/tests/data/test.stl +7191 -0
- package/tests/data/test.svg +144 -0
- package/tests/data/test.ts +266 -0
- package/tests/data/test.txt +11 -0
- package/tests/data/test.vo +49 -0
- package/tests/data/test.vti +3 -0
- package/tests/data/test.vtp +212 -0
- package/tests/data/test.vtu +3585 -0
- package/tests/data/test.wl +76 -0
- package/tests/data/test__ascii@@ +1003 -0
- package/tests/test_functions.py +291 -0
- package/tests/test_routes.py +131 -0
- 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
|