2016-09-20 15:57:37 +02:00
|
|
|
import json
|
|
|
|
|
2016-11-26 23:28:46 +01:00
|
|
|
from django.core.exceptions import ValidationError
|
2016-12-27 19:03:54 +01:00
|
|
|
from django.core.validators import RegexValidator
|
2016-09-20 15:57:37 +02:00
|
|
|
from django.db import models
|
2016-12-27 19:03:54 +01:00
|
|
|
from django.utils.translation import ugettext_lazy as _
|
2016-11-26 23:28:46 +01:00
|
|
|
from shapely import validation
|
2016-09-20 15:57:37 +02:00
|
|
|
from shapely.geometry import mapping, shape
|
2016-11-26 23:28:46 +01:00
|
|
|
from shapely.geometry.base import BaseGeometry
|
2016-09-20 15:57:37 +02:00
|
|
|
|
2016-12-07 16:11:33 +01:00
|
|
|
from c3nav.mapdata.utils.geometry import clean_geometry
|
|
|
|
from c3nav.mapdata.utils.json import format_geojson
|
2016-11-26 23:28:46 +01:00
|
|
|
|
2016-12-28 01:55:27 +01:00
|
|
|
validate_bssid_lines = RegexValidator(regex=r'^([0-9a-f]{2}(:[0-9a-f]{2}){5}(\r?\n[0-9a-f]{2}(:[0-9a-f]{2}){5})*)?$',
|
2016-12-27 19:03:54 +01:00
|
|
|
message=_('please enter a newline seperated lowercase list of BSSIDs'))
|
|
|
|
|
2016-11-26 23:28:46 +01:00
|
|
|
|
|
|
|
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))
|
2016-09-20 16:13:47 +02:00
|
|
|
|
2016-09-20 15:57:37 +02:00
|
|
|
|
|
|
|
class GeometryField(models.TextField):
|
2016-11-26 23:28:46 +01:00
|
|
|
default_validators = [validate_geometry]
|
|
|
|
|
2016-09-20 15:57:37 +02:00
|
|
|
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):
|
2016-11-26 23:28:46 +01:00
|
|
|
return clean_geometry(shape(json.loads(value)))
|
2016-09-20 15:57:37 +02:00
|
|
|
|
|
|
|
def get_prep_value(self, value):
|
2016-10-09 16:21:05 +02:00
|
|
|
return json.dumps(format_geojson(mapping(value)))
|
2016-09-26 11:18:56 +02:00
|
|
|
|
|
|
|
|
|
|
|
class JSONField(models.TextField):
|
|
|
|
def from_db_value(self, value, expression, connection, context):
|
|
|
|
if value is None:
|
|
|
|
return value
|
|
|
|
return json.loads(value)
|
|
|
|
|
|
|
|
def to_python(self, value):
|
|
|
|
return json.loads(value)
|
|
|
|
|
|
|
|
def get_prep_value(self, value):
|
|
|
|
return json.dumps(value)
|