Skip to content

Commit ff3634e

Browse files
committed
Store attributes brute-force
1 parent e881e17 commit ff3634e

File tree

2 files changed

+70
-29
lines changed

2 files changed

+70
-29
lines changed

importer_datapackage/handlers/datapackage/handler.py

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,18 @@
55

66
import importlib.resources as pkg_resources
77

8-
from io import BytesIO
98
from pathlib import Path
109
from osgeo import ogr
11-
from PIL import Image
1210

1311
from django.conf import settings
12+
from django.db.utils import DataError
1413
from django.db.models import Q
1514

1615
from geonode.base.models import ResourceBase
1716
from geonode.layers.models import Dataset
1817
from geonode.resource.manager import resource_manager
1918
from geonode.resource.models import ExecutionRequest
2019
from geonode.resource.enumerator import ExecutionRequestAction as exa
21-
from geonode.geoserver.helpers import set_attributes
2220
from geonode.utils import set_resource_default_links
2321

2422
from importer.handlers.common.vector import BaseVectorFileHandler
@@ -100,12 +98,13 @@ def prepare_import(self, files, execution_id, **kwargs):
10098
process_rows(resource)
10199

102100
folder = Path(_file).parent
103-
mapper = TabularDataHelper(package)
101+
mapper = TabularDataHelper(package, self.fixup_name)
104102
vrt_file = mapper.write_vrt_file(f"{package.name}.vrt", folder)
105103

106104
# update base file to be imported by ogr2ogr
107105
prepared_files = {
108106
"base_file": str(vrt_file),
107+
# "sld_file": str(self.load_local_resource("fake.sld")),
109108
"package_file": _file,
110109
}
111110
files.update(prepared_files)
@@ -118,21 +117,21 @@ def prepare_import(self, files, execution_id, **kwargs):
118117
execution_id=str(execution_id), input_params=_input
119118
)
120119

121-
def can_handle_sld_file():
122-
return False
120+
# def can_handle_sld_file():
121+
# return True
123122

124123
def get_ogr2ogr_driver(self):
125124
return ogr.GetDriverByName("VRT")
126125

127-
def handle_sld_file(self, saved_dataset: Dataset, _exec: ExecutionRequest):
128-
sld_file = self.load_local_resource("fake.sld")
129-
resource_manager.exec(
130-
"set_style",
131-
None,
132-
instance=saved_dataset,
133-
sld_file=sld_file,
134-
sld_uploaded=True,
135-
)
126+
# def handle_sld_file(self, saved_dataset: Dataset, _exec: ExecutionRequest):
127+
# sld_file = self.load_local_resource("fake.sld")
128+
# resource_manager.exec(
129+
# "set_style",
130+
# None,
131+
# instance=saved_dataset,
132+
# sld_file=sld_file,
133+
# sld_uploaded=True,
134+
# )
136135

137136
def create_geonode_resource(
138137
self,
@@ -190,10 +189,33 @@ def create_geonode_resource(
190189
package_file = _files.get("package_file")
191190
package = Package(package_file)
192191

193-
mapper = TabularDataHelper(package)
194-
attribute_map = mapper.parse_attribute_map(layer_name, self.fixup_name)
195-
set_attributes(saved_dataset, attribute_map, _overwrite)
196-
192+
mapper = TabularDataHelper(package, self.fixup_name)
193+
attributes = saved_dataset.attribute_set.all()
194+
attribute_map = mapper.parse_attribute_map(layer_name)
195+
for la in attributes:
196+
for attribute in attribute_map:
197+
field, ftype, description, label, display_order = attribute
198+
if field == la.attribute:
199+
try:
200+
la.description = description
201+
la.attribute_label = label
202+
la.save()
203+
except DataError as e:
204+
logger.error(f"Cannot save attribute {field} for layer {saved_dataset.name}: {e}")
205+
206+
continue
207+
208+
saved_dataset.set_bbox_polygon(
209+
# for 'non-spatial' data we apply world bbox
210+
bbox=[
211+
-179.0, # west
212+
-89.0, # south,
213+
179.0, # east,
214+
89.0, #n north,
215+
],
216+
srid="EPSG:4326",
217+
)
218+
saved_dataset.save()
197219
saved_dataset.refresh_from_db()
198220
return saved_dataset
199221

importer_datapackage/handlers/datapackage/mapper.py

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
1+
import logging
12
from pathlib import Path
2-
from functools import reduce
3+
from collections.abc import Callable
34

45
import xml.etree.cElementTree as ET
56

7+
logger = logging.getLogger(__name__)
8+
69
class TabularDataHelper():
710

8-
def __init__(self, package):
11+
def __init__(self, package, fixup_name: Callable):
912
self.package = package
1013
self.resources = package.resources or []
14+
self.fixup_name = fixup_name
1115

1216

13-
def parse_attribute_map(self, resource_name: str, fixup_name) -> list:
17+
def parse_attribute_map(self, resource_name: str) -> list:
1418
""" Of type: [ [field, ftype, description, label, display_oder], ... ]"""
1519

1620
resource = self.package.get_resource(resource_name)
1721
schema = resource.schema
1822
attribute_map = [
19-
[fixup_name(field.name), _parse_field_type(field)[0], field.description, field.title or field.name, None]
23+
[self.fixup_name(field.name), _parse_field_type(field)[0], field.description, field.title or field.name, None]
2024
for field in schema.fields
2125
]
2226
return attribute_map
@@ -31,23 +35,38 @@ def write_vrt_file(self, filename: str, folder: Path):
3135
layer = ET.SubElement(root, "OGRVRTLayer", name=resource.name)
3236
source = Path(folder, resource.path) if folder else resource.path
3337
ET.SubElement(layer, "SrcDataSource").text = str(source)
38+
ET.SubElement(layer, "ExtentXMin").text = "-89.0"
39+
ET.SubElement(layer, "ExtentYMin").text = "-179"
40+
ET.SubElement(layer, "ExtentXMax").text = "89"
41+
ET.SubElement(layer, "ExtentYMax").text = "179"
42+
3443
schema = resource.schema
3544
for field in schema.fields:
3645
(type, subtype) = _parse_field_type(field)
37-
normalized_fieldname = normalize(field.name).lower()
38-
ET.SubElement(layer, "Field", src=field.name, name=normalized_fieldname, type=type, subtype=subtype,)
46+
normalized_fieldname = self.fixup_name(field.name)
47+
48+
ET.SubElement(
49+
layer, "Field",
50+
src=field.name or "",
51+
name=normalized_fieldname or "",
52+
# alternativeName=field.title or "", # GDAL >=3.7
53+
# comment=field.description or "", # GDAL >=3.7
54+
type=type,
55+
subtype=subtype,
56+
)
3957

4058
# write VRT file
4159
vrt_filename = Path(folder, filename) if folder else filename
4260
tree = ET.ElementTree(root)
4361
ET.indent(tree, space=" ")
44-
tree.write(vrt_filename)
62+
try:
63+
with open(vrt_filename, "wb") as f:
64+
tree.write(f, encoding="UTF-8")
65+
except TypeError:
66+
logger.error(f"Could not create VRT file '{vrt_filename}'", exc_info=True)
4567

4668
return vrt_filename
4769

48-
def normalize(fieldname):
49-
return fieldname.replace(" ", "_") if fieldname else fieldname
50-
5170

5271
def _parse_field_type(field) -> tuple:
5372

0 commit comments

Comments
 (0)