From 142e307fc3d840aa478351a4451f7bc813d7c64c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Mon, 26 Jun 2023 18:15:34 +0200 Subject: [PATCH] fix editor up a bit --- src/c3nav/editor/api.py | 6 +++--- src/c3nav/editor/static/editor/js/editor.js | 1 + src/c3nav/mapdata/fields.py | 8 +++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/c3nav/editor/api.py b/src/c3nav/editor/api.py index c06543d5..cd8e4881 100644 --- a/src/c3nav/editor/api.py +++ b/src/c3nav/editor/api.py @@ -69,7 +69,7 @@ class EditorViewSet(EditorViewSetMixin, ViewSet): @staticmethod def _get_level_geometries(level): buildings = level.buildings.all() - buildings_geom = unary_union([building.geometry for building in buildings]) + buildings_geom = unary_union([building.geometry.wrapped_geom for building in buildings]) spaces = {space.pk: space for space in level.spaces.all()} holes_geom = [] for space in spaces.values(): @@ -77,9 +77,9 @@ class EditorViewSet(EditorViewSetMixin, ViewSet): space.geometry = space.geometry.difference(buildings_geom) columns = [column.geometry for column in space.columns.all()] if columns: - columns_geom = unary_union([column.geometry for column in space.columns.all()]) + columns_geom = unary_union([column.geometry.wrapped_geom for column in space.columns.all()]) space.geometry = space.geometry.difference(columns_geom) - holes = [hole.geometry for hole in space.holes.all()] + holes = [hole.geometry.wrapped_geom for hole in space.holes.all()] if holes: space_holes_geom = unary_union(holes) holes_geom.append(space_holes_geom.intersection(space.geometry)) diff --git a/src/c3nav/editor/static/editor/js/editor.js b/src/c3nav/editor/static/editor/js/editor.js index 1bb18387..7bda8204 100644 --- a/src/c3nav/editor/static/editor/js/editor.js +++ b/src/c3nav/editor/static/editor/js/editor.js @@ -1111,6 +1111,7 @@ editor = { var form = geometry_field.closest('form'); var options, mapitem_type = form.attr('data-new'); var geometry_value = geometry_field.val(); + if (geometry_value === 'null') geometry_value = ''; if (geometry_value) { editor._creating_type = null; if (editor._editing_layer !== null) { diff --git a/src/c3nav/mapdata/fields.py b/src/c3nav/mapdata/fields.py index 06a04cd6..ac7623e9 100644 --- a/src/c3nav/mapdata/fields.py +++ b/src/c3nav/mapdata/fields.py @@ -56,7 +56,7 @@ class GeometryField(models.JSONField): if value is None or value == '': return None try: - geometry = shape(json.loads(value)) + geometry = shape(value) except Exception: raise ValidationError(_('Invalid GeoJSON.')) self._validate_geomtype(geometry) @@ -67,6 +67,9 @@ class GeometryField(models.JSONField): self._validate_geomtype(geometry) return geometry + def validate(self, value, model_instance): + super().validate(mapping(value), model_instance) + @cached_property def classes(self): return { @@ -101,6 +104,9 @@ class GeometryField(models.JSONField): return format_geojson(mapping(value), rounded=False) if as_json else value + def get_db_prep_value(self, value, connection, prepared=False): + return super().get_db_prep_value(mapping(value), connection, prepared=prepared) + def get_prep_value(self, value): if value is None: return None