From f0eec51d4547d564aee6f95662584c83c18e2a9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Tue, 20 Sep 2016 16:13:47 +0200 Subject: [PATCH] sort geojson --- src/c3nav/api/fields.py | 4 +++- src/c3nav/mapdata/fields.py | 4 +++- src/c3nav/mapdata/utils.py | 8 ++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/c3nav/api/fields.py b/src/c3nav/api/fields.py index 2d2e3509..f7dd7317 100644 --- a/src/c3nav/api/fields.py +++ b/src/c3nav/api/fields.py @@ -3,6 +3,8 @@ from rest_framework import serializers from rest_framework.exceptions import ValidationError from shapely.geometry import mapping, shape +from ..mapdata.utils import sort_geojson + class GeometryField(serializers.DictField): """ @@ -13,7 +15,7 @@ class GeometryField(serializers.DictField): } def to_representation(self, obj): - geojson = mapping(obj) + geojson = sort_geojson(mapping(obj)) return super().to_representation(geojson) def to_internal_value(self, data): diff --git a/src/c3nav/mapdata/fields.py b/src/c3nav/mapdata/fields.py index cd41b368..a3d7ffc1 100644 --- a/src/c3nav/mapdata/fields.py +++ b/src/c3nav/mapdata/fields.py @@ -3,6 +3,8 @@ import json from django.db import models from shapely.geometry import mapping, shape +from .utils import sort_geojson + class GeometryField(models.TextField): def from_db_value(self, value, expression, connection, context): @@ -14,4 +16,4 @@ class GeometryField(models.TextField): return shape(json.loads(value)) def get_prep_value(self, value): - return json.dumps(mapping(value)) + return json.dumps(sort_geojson(mapping(value))) diff --git a/src/c3nav/mapdata/utils.py b/src/c3nav/mapdata/utils.py index 4dcdb21f..a3eeb8a3 100644 --- a/src/c3nav/mapdata/utils.py +++ b/src/c3nav/mapdata/utils.py @@ -1,4 +1,5 @@ import json +from collections import OrderedDict def _preencode(data, magic_marker): @@ -27,3 +28,10 @@ def json_encoder_reindent(method, data, *args, **kwargs): else: magic_marker = magic_marker.encode() return result.replace(b'"'+magic_marker, b'').replace(magic_marker+b'"', b'') + + +def sort_geojson(data): + return OrderedDict(( + ('type', data['type']), + ('coordinates', data['coordinates']), + ))