geobox 1.2.1__py3-none-any.whl → 1.2.2__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.
- geobox/file.py +50 -45
- {geobox-1.2.1.dist-info → geobox-1.2.2.dist-info}/METADATA +1 -1
- {geobox-1.2.1.dist-info → geobox-1.2.2.dist-info}/RECORD +6 -6
- {geobox-1.2.1.dist-info → geobox-1.2.2.dist-info}/WHEEL +0 -0
- {geobox-1.2.1.dist-info → geobox-1.2.2.dist-info}/licenses/LICENSE +0 -0
- {geobox-1.2.1.dist-info → geobox-1.2.2.dist-info}/top_level.txt +0 -0
geobox/file.py
CHANGED
|
@@ -2,13 +2,16 @@ from urllib.parse import urljoin
|
|
|
2
2
|
from typing import Optional, Dict, List, Union, TYPE_CHECKING
|
|
3
3
|
import os
|
|
4
4
|
import mimetypes
|
|
5
|
+
from geobox.exception import ValidationError
|
|
5
6
|
import requests
|
|
6
7
|
import sys
|
|
8
|
+
from pathlib import Path
|
|
7
9
|
|
|
8
10
|
from .base import Base
|
|
9
11
|
from .enums import FileFormat, PublishFileType, InputGeomType, FileType
|
|
10
12
|
from .utils import clean_data
|
|
11
13
|
from .task import Task
|
|
14
|
+
from .feature import Feature
|
|
12
15
|
|
|
13
16
|
if TYPE_CHECKING:
|
|
14
17
|
from . import GeoboxClient
|
|
@@ -221,9 +224,9 @@ class File(Base):
|
|
|
221
224
|
>>> from geobox import GeoboxClient
|
|
222
225
|
>>> from geobox.file import File
|
|
223
226
|
>>> client = GeoboxClient()
|
|
224
|
-
>>> files = File.
|
|
227
|
+
>>> files = File.get_files_by_name(client, name='test')
|
|
225
228
|
or
|
|
226
|
-
>>> files = client.
|
|
229
|
+
>>> files = client.get_files_by_name(name='test')
|
|
227
230
|
"""
|
|
228
231
|
return cls.get_files(api, q=f"name = '{name}'", user_id=user_id)
|
|
229
232
|
|
|
@@ -248,44 +251,34 @@ class File(Base):
|
|
|
248
251
|
>>> client = GeoboxClient()
|
|
249
252
|
>>> file_path = File.get_file(client, uuid="12345678-1234-5678-1234-567812345678")
|
|
250
253
|
"""
|
|
251
|
-
# Get the original filename from data or use uuid
|
|
252
|
-
if self.name:
|
|
253
|
-
filename = f"{self.name.split('.')[0]}" if len(self.name.split('.')) > 1 else f'{self.name}'
|
|
254
|
-
else:
|
|
255
|
-
filename = f'{self.uuid}'
|
|
256
|
-
|
|
257
254
|
# If save_path is provided, check if it ends with a '/'
|
|
258
255
|
if save_path and save_path.endswith('/'):
|
|
259
|
-
return f'{save_path}
|
|
256
|
+
return f'{save_path}'
|
|
260
257
|
|
|
261
258
|
if save_path and not save_path.endswith('/'):
|
|
262
259
|
raise ValueError("save_path must end with a '/'")
|
|
263
260
|
|
|
264
|
-
return os.
|
|
261
|
+
return os.getcwd()
|
|
265
262
|
|
|
266
263
|
|
|
267
|
-
def
|
|
264
|
+
def _get_file_name(self, response: requests.Response) -> str:
|
|
268
265
|
"""
|
|
269
|
-
Get the file
|
|
266
|
+
Get the file name from the response.
|
|
270
267
|
|
|
271
268
|
Args:
|
|
272
269
|
response (requests.Response): The response of the request.
|
|
273
270
|
|
|
274
271
|
Returns:
|
|
275
|
-
str: The file
|
|
272
|
+
str: The file name
|
|
276
273
|
"""
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
content_disposition = response.headers['Content-Disposition']
|
|
280
|
-
if 'filename=' in content_disposition:
|
|
281
|
-
filename = content_disposition.split('filename=')[-1].strip().strip('"')
|
|
282
|
-
ext = f".{filename.split('.')[-1]}"
|
|
274
|
+
if 'Content-Disposition' in response.headers and 'filename=' in response.headers['Content-Disposition']:
|
|
275
|
+
file_name = response.headers['Content-Disposition'].split('filename=')[-1].strip().strip('"')
|
|
283
276
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
277
|
+
else:
|
|
278
|
+
content_type = response.headers.get("Content-Type", "")
|
|
279
|
+
file_name = f'{self.name}.{mimetypes.guess_extension(content_type.split(";")[0])}'
|
|
287
280
|
|
|
288
|
-
return
|
|
281
|
+
return file_name
|
|
289
282
|
|
|
290
283
|
|
|
291
284
|
def _create_progress_bar(self) -> 'tqdm':
|
|
@@ -338,20 +331,20 @@ class File(Base):
|
|
|
338
331
|
save_path = self._get_save_path(save_path)
|
|
339
332
|
os.makedirs(os.path.dirname(save_path), exist_ok=True)
|
|
340
333
|
|
|
341
|
-
with self.api.get(f"{self.endpoint}download/", stream=True) as response
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
334
|
+
with self.api.get(f"{self.endpoint}download/", stream=True) as response:
|
|
335
|
+
file_name = self._get_file_name(response)
|
|
336
|
+
full_path = f"{save_path}/{file_name}"
|
|
337
|
+
with open(full_path, 'wb') as f:
|
|
338
|
+
pbar = self._create_progress_bar() if progress_bar else None
|
|
339
|
+
for chunk in response.iter_content(chunk_size=8192):
|
|
340
|
+
f.write(chunk)
|
|
341
|
+
if pbar:
|
|
342
|
+
pbar.update(len(chunk))
|
|
343
|
+
pbar.refresh()
|
|
346
344
|
if pbar:
|
|
347
|
-
pbar.
|
|
348
|
-
pbar.refresh()
|
|
349
|
-
if pbar:
|
|
350
|
-
pbar.close()
|
|
345
|
+
pbar.close()
|
|
351
346
|
|
|
352
|
-
|
|
353
|
-
os.rename(os.path.abspath(save_path), os.path.abspath(final_path))
|
|
354
|
-
return os.path.abspath(final_path)
|
|
347
|
+
return os.path.abspath(full_path)
|
|
355
348
|
|
|
356
349
|
|
|
357
350
|
def delete(self) -> None:
|
|
@@ -378,8 +371,8 @@ class File(Base):
|
|
|
378
371
|
input_layer: str = None,
|
|
379
372
|
input_dataset: str = None,
|
|
380
373
|
user_id: int = None,
|
|
381
|
-
input_srid: int =
|
|
382
|
-
file_encoding: str = "
|
|
374
|
+
input_srid: int = Feature.BASE_SRID,
|
|
375
|
+
file_encoding: str = "UTF-8",
|
|
383
376
|
replace_domain_codes_by_values: bool = False,
|
|
384
377
|
report_errors: bool = True,
|
|
385
378
|
as_terrain: bool = False) -> 'Task':
|
|
@@ -393,7 +386,7 @@ class File(Base):
|
|
|
393
386
|
input_layer (str, optional): The name of the input layer.
|
|
394
387
|
input_dataset (str, optional): The name of the input dataset.
|
|
395
388
|
user_id (int, optional): Specific user. privileges required.
|
|
396
|
-
input_srid (int, optional): The SRID of the layer.
|
|
389
|
+
input_srid (int, optional): The SRID of the layer. default is: 3857
|
|
397
390
|
file_encoding (str, optional): The encoding of the file. default is "utf-8".
|
|
398
391
|
replace_domain_codes_by_values (bool, optional): Whether to replace domain codes by values. default is False.
|
|
399
392
|
report_errors (bool, optional): Whether to report errors. default is True.
|
|
@@ -404,6 +397,7 @@ class File(Base):
|
|
|
404
397
|
|
|
405
398
|
Raises:
|
|
406
399
|
ValueError: If the publish_as is not a valid PublishFileType.
|
|
400
|
+
ValidationError: if the zipped file doesn't have any layers to publish.
|
|
407
401
|
|
|
408
402
|
Example:
|
|
409
403
|
>>> from geobox import GeoboxClient
|
|
@@ -416,30 +410,41 @@ class File(Base):
|
|
|
416
410
|
... input_layer='layer1',
|
|
417
411
|
... input_dataset='dataset1',
|
|
418
412
|
... input_srid=4326,
|
|
419
|
-
... file_encoding='
|
|
413
|
+
... file_encoding='UTF-8')
|
|
420
414
|
"""
|
|
421
415
|
if not publish_as:
|
|
422
|
-
|
|
416
|
+
# checks the file format or file first layer format to dynamically set the publish_as
|
|
417
|
+
if self.file_type.value in ['GeoJSON', 'GPKG', 'DXF', 'GPX', 'Shapefile', 'KML', 'CSV', 'FileGDB'] or \
|
|
418
|
+
(self.file_type.value in ['Complex'] and self.layers and \
|
|
419
|
+
FileType(self.layers[0]['format']).value in ['GeoJSON', 'GPKG', 'DXF', 'GPX', 'Shapefile', 'KML', 'CSV', 'FileGDB']):
|
|
423
420
|
publish_as = PublishFileType.VECTOR
|
|
424
|
-
|
|
421
|
+
|
|
422
|
+
elif self.file_type.value in ['GeoTIFF'] or \
|
|
423
|
+
(self.file_type.value in ['Complex'] and self.layers and \
|
|
424
|
+
FileType(self.layers[0]['format']).value in ['GeoTIFF']):
|
|
425
425
|
publish_as = PublishFileType.RASTER
|
|
426
|
-
|
|
426
|
+
|
|
427
|
+
elif self.file_type.value in ['GLB'] or \
|
|
428
|
+
(self.file_type.value in ['Complex'] and self.layers and \
|
|
429
|
+
FileType(self.layers[0]['format']).value in ['GLB']):
|
|
427
430
|
publish_as = PublishFileType.MODEL3D
|
|
428
431
|
|
|
432
|
+
else:
|
|
433
|
+
raise ValidationError('Unknown format')
|
|
434
|
+
|
|
429
435
|
data = clean_data({
|
|
430
436
|
"publish_as": publish_as.value if isinstance(publish_as, PublishFileType) else publish_as,
|
|
431
437
|
"layer_name": name,
|
|
432
|
-
"input_layer": input_layer,
|
|
438
|
+
"input_layer": self.layers[0]['layer'] if not input_layer and self.layers else input_layer,
|
|
433
439
|
"input_geom_type": input_geom_type.value if isinstance(input_geom_type, InputGeomType) else input_geom_type,
|
|
434
440
|
"replace_domain_codes_by_values": replace_domain_codes_by_values,
|
|
435
|
-
"input_dataset": self.
|
|
441
|
+
"input_dataset": self.layers[0]['dataset'] if not input_layer and self.layers else input_dataset,
|
|
436
442
|
"user_id": user_id,
|
|
437
443
|
"input_srid": input_srid,
|
|
438
444
|
"file_encoding": file_encoding,
|
|
439
445
|
"report_errors": report_errors,
|
|
440
446
|
"as_terrain": as_terrain
|
|
441
447
|
})
|
|
442
|
-
|
|
443
448
|
endpoint = urljoin(self.endpoint, 'publish/')
|
|
444
449
|
response = self.api.post(endpoint, data, is_json=False)
|
|
445
450
|
task = Task.get_task(self.api, response.get('task_id'))
|
|
@@ -9,7 +9,7 @@ geobox/enums.py,sha256=jGs8GzyCzQMJ5go9owDKMiAwuWjDCpKPaNmQg2eiCaQ,6613
|
|
|
9
9
|
geobox/exception.py,sha256=jvpnv0M2Ck1FpxHTL_aKYWxGvLnCQ3d9vOrMIktjw1U,1507
|
|
10
10
|
geobox/feature.py,sha256=3Kbc1LjIkBt1YqRAry84BrR7qxx9BexvBB3YQ8D9mGk,18504
|
|
11
11
|
geobox/field.py,sha256=2VxjeYgRwnDxHYpAsK0ASOCz8V0JmfTA3GqHDv3rfgQ,10526
|
|
12
|
-
geobox/file.py,sha256=
|
|
12
|
+
geobox/file.py,sha256=Ula8r8pZaCmifsnUHDbaJujw53SLxUiCiBzVS358o88,19967
|
|
13
13
|
geobox/log.py,sha256=ZTmVErhyAszf7M5YFxT5mqXNNDGPnRwXPeGLDS1G6PE,3582
|
|
14
14
|
geobox/map.py,sha256=98P1gbB5U_eu71Hu6EQ0kL_ponbPAnoOCitjEa35q4I,31307
|
|
15
15
|
geobox/model3d.py,sha256=qRYCx-q9LpGhdu5oz3av0uUoiDimuk4BvXXwMW5bo9Q,12061
|
|
@@ -30,8 +30,8 @@ geobox/vectorlayer.py,sha256=xnYsJei-bpKgM_EJlRbZ-bAIHdmvfU-VZ2t-NEEJCfc,49420
|
|
|
30
30
|
geobox/version.py,sha256=0GLPhxCeEb2bAkdpPJWtXPXc1KP6kQ_TOMwLAL0ldo0,9374
|
|
31
31
|
geobox/view.py,sha256=fRYlzNu4eGl6Zx9gPom47BkVE8DfWLj0bNlW2-u4TOU,37390
|
|
32
32
|
geobox/workflow.py,sha256=6hKnSw4G0_ZlgmUb0g3fxT-UVsFbiYpF2FbEO5fpQv0,11606
|
|
33
|
-
geobox-1.2.
|
|
34
|
-
geobox-1.2.
|
|
35
|
-
geobox-1.2.
|
|
36
|
-
geobox-1.2.
|
|
37
|
-
geobox-1.2.
|
|
33
|
+
geobox-1.2.2.dist-info/licenses/LICENSE,sha256=AvFB7W94sJYKLDhBxLRshL3upexCOG8HQY_1JibB96w,1063
|
|
34
|
+
geobox-1.2.2.dist-info/METADATA,sha256=RZiM4hs-22stMecCl19HntScQWrGeUiYN_YpyVPQUKc,2556
|
|
35
|
+
geobox-1.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
36
|
+
geobox-1.2.2.dist-info/top_level.txt,sha256=ppXH8Bu2mlB-pLQ6lsoWEm2Gr6wZx1uzkhetsYA5ins,7
|
|
37
|
+
geobox-1.2.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|