validate GeometryField and cleanup intersection errors if possible

This commit is contained in:
Laura Klünder 2016-11-26 23:28:46 +01:00
parent bf338c59d5
commit a3d0f6dac3
2 changed files with 32 additions and 2 deletions

View file

@ -1,19 +1,32 @@
import json
from django.core.exceptions import ValidationError
from django.db import models
from shapely import validation
from shapely.geometry import mapping, shape
from shapely.geometry.base import BaseGeometry
from c3nav.mapdata.utils import format_geojson
from c3nav.mapdata.utils import clean_geometry, format_geojson
def validate_geometry(geometry):
if not isinstance(geometry, BaseGeometry):
raise ValidationError('GeometryField expexted a Shapely BaseGeometry child-class.')
if not geometry.is_valid:
raise ValidationError('Invalid geometry: %s' % validation.explain_validity(geometry))
class GeometryField(models.TextField):
default_validators = [validate_geometry]
def from_db_value(self, value, expression, connection, context):
if value is None:
return value
return shape(json.loads(value))
def to_python(self, value):
return shape(json.loads(value))
return clean_geometry(shape(json.loads(value)))
def get_prep_value(self, value):
return json.dumps(format_geojson(mapping(value)))