summaryrefslogtreecommitdiff
path: root/ishtar_common/forms_common.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2022-06-01 17:39:10 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2022-12-12 12:21:00 +0100
commit1bc40bcbc0792abe3686f5a09eeb7a229ab18a95 (patch)
tree78d25ed0a224c5a87af078f12a0bffe9a64c04f2 /ishtar_common/forms_common.py
parente435a4929b8d315f13184ea65086fc032c1fbea6 (diff)
downloadIshtar-1bc40bcbc0792abe3686f5a09eeb7a229ab18a95.tar.bz2
Ishtar-1bc40bcbc0792abe3686f5a09eeb7a229ab18a95.zip
Geodata - geo forms: create item form
Diffstat (limited to 'ishtar_common/forms_common.py')
-rw-r--r--ishtar_common/forms_common.py153
1 files changed, 113 insertions, 40 deletions
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py
index e764077be..b6a36ff03 100644
--- a/ishtar_common/forms_common.py
+++ b/ishtar_common/forms_common.py
@@ -2615,7 +2615,7 @@ class GISForm(forms.ModelForm, CustomForm, ManageOldType):
class Meta:
model = models.GeoVectorData
exclude = ["need_update", "imports", "cached_x", "cached_y", "cached_z",
- "point_3d"]
+ "source_content_type"]
HEADERS = {
"related_items_ishtar_common_town": FormHeader(
@@ -2630,68 +2630,44 @@ class GISForm(forms.ModelForm, CustomForm, ManageOldType):
GEO_FIELDS = (
("point_2d",),
+ ("point_3d",),
("multi_points",),
("multi_line",),
("multi_polygon",),
- ("x", "z")
+ ("x", "z"),
)
+ GEOM_TYPES = {
+ "point_2d": "Point",
+ "point_3d": "Point",
+ "multi_points": "MultiPoint",
+ "multi_line": "MultiLineString",
+ "multi_polygon": "MultiPolygon",
+ }
+
def __init__(self, *args, **kwargs):
main_items_fields = {}
if "main_items_fields" in kwargs:
main_items_fields = kwargs.pop("main_items_fields")
self.user = None
+ self.geom_type = kwargs.pop("geom_type") \
+ if kwargs.get("geom_type", None) else None
if kwargs.get("user", None):
self.user = kwargs.pop("user")
instance = kwargs.get("instance", False)
self.is_instancied = bool(instance)
+ self.source_content_type = kwargs.pop("source_content_type", None)
+ self.source_id = kwargs.pop("source_id", None)
super(GISForm, self).__init__(*args, **kwargs)
if not self.fields["import_key"].initial:
self.fields.pop("import_key")
- self.source_content_type = kwargs.pop("source_content_type", None)
- self.source_id = kwargs.pop("source_id", None)
if not self.source_content_type:
self.fields.pop("source_content_type_id")
self.fields.pop("source_id")
else:
self.fields["source_content_type_id"].initial = self.source_content_type
self.fields["source_id"].initial = self.source_id
- self.geo_keys = []
- if instance:
- for keys in self.GEO_FIELDS:
- if any(getattr(instance, key) for key in keys):
- if keys[0] != "x":
- geom = getattr(instance, keys[0])
- map_srid = geom.srid or 4326
- widget = gis_forms.OSMWidget
- if map_srid == 4326:
- widget = widgets.ReversedOSMWidget
- self.fields[keys[0]].widget = widget(
- attrs={"map_srid": map_srid,
- "geom_type": geom.geom_type})
- self.fields.pop("spatial_reference_system")
- self.geo_keys = keys[:]
- else:
- self.geo_keys = [
- "x", "estimated_error_x",
- "y", "estimated_error_y",
- "z", "estimated_error_z",
- "spatial_reference_system",
- ]
- for geo_fields in self.GEO_FIELDS:
- if geo_fields != keys:
- for geo_field in geo_fields:
- self.fields.pop(geo_field)
- if geo_field == "x":
- self.fields.pop("estimated_error_x")
- self.fields.pop("y")
- self.fields.pop("estimated_error_y")
- if geo_field == "z":
- self.fields.pop("estimated_error_z")
- break
- if not self.geo_keys:
- # TODO....
- pass
+ self.geo_keys = self.get_geo_keys(instance)
fields = OrderedDict()
for related_key in models.GeoVectorData.RELATED_MODELS:
@@ -2703,6 +2679,7 @@ class GISForm(forms.ModelForm, CustomForm, ManageOldType):
required=False,
style="width: 100%",
)
+ for related_key in models.GeoVectorData.RELATED_MODELS:
if related_key in main_items_fields:
for field_key, label in main_items_fields[related_key]:
disabled = False
@@ -2720,6 +2697,85 @@ class GISForm(forms.ModelForm, CustomForm, ManageOldType):
fields[k] = self.fields[k]
self.fields = fields
+ def get_geo_keys(self, instance):
+ if instance:
+ return self._get_instance_geo_keys(instance)
+ else:
+ return self._get_base_geo_keys()
+
+ def _get_base_geo_keys(self):
+ geo_keys = []
+ if self.geom_type == "coordinates":
+ geo_keys = [
+ "x", "estimated_error_x",
+ "y", "estimated_error_y",
+ "z", "estimated_error_z",
+ "spatial_reference_system",
+ ]
+ for keys in self.GEO_FIELDS:
+ if any(key == self.geom_type for key in keys):
+ map_srid = 4326
+ widget = gis_forms.OSMWidget
+ self.fields[keys[0]].widget = widget(
+ attrs={"map_srid": map_srid,
+ "cols": True,
+ "geom_type": self.GEOM_TYPES[self.geom_type]})
+ self.fields.pop("spatial_reference_system")
+ geo_keys = keys[:]
+ self.fields.pop("x")
+ self.fields.pop("y")
+ if self.geom_type != "point_3d":
+ self.fields.pop("z")
+ self.fields.pop("estimated_error_x")
+ self.fields.pop("estimated_error_y")
+ self.fields.pop("estimated_error_z")
+ break
+ for geo_fields in self.GEO_FIELDS[:-1]:
+ # -1 -> do not get x - already managed
+ if geo_fields != geo_keys:
+ for geo_field in geo_fields:
+ self.fields.pop(geo_field)
+ if self.geom_type == "point_3d":
+ geo_keys = list(geo_keys) + ["z"]
+ return geo_keys
+
+ def _get_instance_geo_keys(self, instance):
+ # geo keys for an instanced item
+ geo_keys = []
+ for keys in self.GEO_FIELDS:
+ if any(getattr(instance, key) for key in keys):
+ if keys[0] != "x":
+ geom = getattr(instance, keys[0])
+ map_srid = geom.srid or 4326
+ widget = gis_forms.OSMWidget
+ if map_srid == 4326:
+ widget = widgets.ReversedOSMWidget
+ self.fields[keys[0]].widget = widget(
+ attrs={"map_srid": map_srid,
+ "geom_type": geom.geom_type,
+ "cols": True})
+ self.fields.pop("spatial_reference_system")
+ geo_keys = keys[:]
+ else:
+ geo_keys = [
+ "x", "estimated_error_x",
+ "y", "estimated_error_y",
+ "z", "estimated_error_z",
+ "spatial_reference_system",
+ ]
+ for geo_fields in self.GEO_FIELDS:
+ if geo_fields != keys:
+ for geo_field in geo_fields:
+ self.fields.pop(geo_field)
+ if geo_field == "x":
+ self.fields.pop("estimated_error_x")
+ self.fields.pop("y")
+ self.fields.pop("estimated_error_y")
+ if geo_field == "z":
+ self.fields.pop("estimated_error_z")
+ break
+ return geo_keys
+
def get_headers(self):
headers = self.HEADERS.copy()
if self.geo_keys:
@@ -2769,3 +2825,20 @@ class GISForm(forms.ModelForm, CustomForm, ManageOldType):
item.skip_history_when_saving = True
item.save() # resave to regen the attached items
return item
+
+
+class PreGISForm(IshtarForm):
+ geom_type = forms.ChoiceField(
+ label=_("Geometry type"),
+ choices=(
+ ("coordinates", _("Coordinates")),
+ ("point_2d", _("Point")),
+ ("point_3d", _("Point 3D")),
+ ("multi_points", _("Multi-points")),
+ ("multi_line", _("Multi-lines")),
+ ("multi_polygon", _("Multi-polygons")),
+ )
+ )
+ HEADERS = {
+ "geom_type": FormHeader(_("Type")),
+ }