Skip to content

Commit 197bc3d

Browse files
authored
[Fixes GeoNode#14136] Fixes the support for creation of dataset with generic Geometry type (GeoNode#14137)
* [Fixes GeoNode#14136] Fixes the support for creation of dataset with generic Geometry type * [Fixes GeoNode#14136] added review suggestions
1 parent f8e9fb4 commit 197bc3d

4 files changed

Lines changed: 23 additions & 5 deletions

File tree

geonode/upload/handlers/common/vector.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import logging
3434
import os
3535
from subprocess import PIPE, Popen
36-
from typing import List, Optional, Tuple
36+
from typing import List, Optional, Tuple, Union
3737
import shlex
3838
from celery import chord, group
3939
from django.db import transaction
@@ -78,6 +78,7 @@
7878
from geonode.upload.registry import feature_validators_registry
7979
from django.core.exceptions import ValidationError
8080

81+
8182
logger = logging.getLogger("importer")
8283

8384

@@ -605,7 +606,7 @@ def find_alternate_by_dataset(self, _exec_obj, layer_name, should_be_overwritten
605606

606607
def setup_dynamic_model(
607608
self,
608-
layer: ogr.Layer,
609+
layer: Union[ogr.Layer, str],
609610
execution_id: str,
610611
should_be_overwritten: bool,
611612
username: str,
@@ -619,7 +620,7 @@ def setup_dynamic_model(
619620
- celery_group -> the celery group of the field creation
620621
"""
621622

622-
layer_name = self.fixup_name(self._extract_layer(layer).GetName())
623+
layer_name = self.fixup_name(layer if isinstance(layer, str) else self._extract_layer(layer).GetName())
623624
_exec_obj = orchestrator.get_execution_object(execution_id)
624625

625626
is_dynamic_model_managed = _exec_obj.input_params.get("is_dynamic_model_managed", False)
@@ -768,7 +769,7 @@ def promote_to_multi(self, geometry_name):
768769
"Multi" not in geometry_name
769770
and "Point" not in geometry_name
770771
and "3D" not in geometry_name
771-
and geometry_name != "Unknown (any)"
772+
and geometry_name not in ("Unknown (any)", "Geometry")
772773
):
773774
return f"Multi {geometry_name.title()}"
774775
return geometry_name

geonode/upload/handlers/empty_dataset/tests.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,12 @@ def test__define_dynamic_layer_schema(self):
154154
expected_schema = [
155155
{"name": "field_int", "class_name": "django.db.models.IntegerField", "null": False},
156156
{"name": "field_str", "class_name": "django.db.models.CharField", "null": False},
157-
{"name": "geom", "class_name": None, "dim": 2, "authority": "EPSG:4326"},
157+
{
158+
"name": "geom",
159+
"class_name": "django.contrib.gis.db.models.fields.GeometryField",
160+
"dim": 2,
161+
"authority": "EPSG:4326",
162+
},
158163
{"name": "fid", "class_name": "django.db.models.BigAutoField", "null": False, "primary_key": True},
159164
]
160165
output_schema = self.handler._define_dynamic_layer_schema(None, execution_id=str(exec_req.exec_id))
@@ -245,3 +250,13 @@ def test_utils_add_attributes_to_xml(self):
245250
expected = b"<featureType><name>myname</name><nativeName>myname</nativeName><title>myname</title><srs>EPSG:4326</srs><nativeBoundingBox><minx>-180</minx><maxx>180</maxx><miny>-90</miny><maxy>90</maxy><crs>EPSG:4326</crs></nativeBoundingBox><latLonBoundingBox><minx>-180</minx><maxx>180</maxx><miny>-90</miny><maxy>90</maxy><crs>EPSG:4326</crs></latLonBoundingBox><attributes><attribute><name>field_str</name><binding>java.lang.String</binding><nillable>false</nillable></attribute><attribute><name>field_int</name><binding>java.lang.Integer</binding><nillable>false</nillable></attribute></attributes></featureType>" # noqa
246251
actual_xml = add_attributes_to_xml(subset_attributes, base_xml.format(name="myname"))
247252
self.assertEqual(expected, actual_xml)
253+
254+
def test_utils_add_attributes_to_xml_supports_generic_geometry(self):
255+
"""
256+
Generic Geometry should be mapped to the GeoServer JTS Geometry binding.
257+
"""
258+
subset_attributes = {"geom": {"type": "Geometry"}}
259+
actual_xml = add_attributes_to_xml(subset_attributes, base_xml.format(name="myname"))
260+
261+
self.assertIn(b"<name>geom</name>", actual_xml)
262+
self.assertIn(b"<binding>org.locationtech.jts.geom.Geometry</binding>", actual_xml)

geonode/upload/handlers/empty_dataset/utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
"Point": "com.vividsolutions.jts.geom.Point",
3535
"LineString": "com.vividsolutions.jts.geom.LineString",
3636
"Polygon": "com.vividsolutions.jts.geom.Polygon",
37+
"Geometry": "org.locationtech.jts.geom.Geometry",
3738
}
3839
RESTRICTION_OPTIONS_TYPE_MAP = {"string": "string", "float": "float", "integer": "int"}
3940

geonode/upload/handlers/utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
"Multi Polygon": "django.contrib.gis.db.models.fields.MultiPolygonField",
6969
"Multipolygon": "django.contrib.gis.db.models.fields.MultiPolygonField",
7070
"3D Multi Polygon": "django.contrib.gis.db.models.fields.MultiPolygonField",
71+
"Geometry": "django.contrib.gis.db.models.fields.GeometryField",
7172
"Unknown (any)": "django.contrib.gis.db.models.fields.GeometryField",
7273
}
7374

0 commit comments

Comments
 (0)