schon/geo/util.py

101 lines
2.7 KiB
Python

import re
import unicodedata
from math import acos, cos, radians, sin
import six
from django import VERSION as DJANGO_VERSION
if DJANGO_VERSION < (4, 0):
try:
from django.utils.encoding import force_unicode as force_text
except (NameError, ImportError):
from django.utils.encoding import force_text
else:
from django.utils.encoding import force_str as force_text
from django.utils.safestring import SafeText, mark_safe
from .conf import CONTINENT_DATA
unicode_func = str
# GEO DISTANCE
earth_radius_km = 6371.009
def geo_distance(a, b):
"""Distance between two geo points in km. (p.x = long, p.y = lat)"""
a_y = radians(a.y)
b_y = radians(b.y)
delta_x = radians(a.x - b.x)
cos_x = sin(a_y) * sin(b_y) + cos(a_y) * cos(b_y) * cos(delta_x)
return acos(cos_x) * earth_radius_km
# ADD CONTINENTS FUNCTION
def add_continents(continent_model):
for ccode, cdata in CONTINENT_DATA.items():
try:
c = continent_model.objects.get(code=ccode)
except continent_model.DoesNotExist:
c = continent_model()
c.id = cdata[1]
c.name = cdata[0]
c.code = ccode
c.slug = c.name
c.save()
# SLUGIFY REGEXES
to_und_rgx = re.compile(r"[']", re.UNICODE)
slugify_rgx = re.compile(r"[^-\w._~]", re.UNICODE)
multi_dash_rgx = re.compile(r"-{2,}", re.UNICODE)
dash_und_rgx = re.compile(r"[-_]_", re.UNICODE)
und_dash_rgx = re.compile(r"[-_]-", re.UNICODE)
starting_chars_rgx = re.compile(r"^[-._]*", re.UNICODE)
ending_chars_rgx = re.compile(r"[-._]*$", re.UNICODE)
def default_slugify(obj, value):
if value is None:
return None
value = force_text(unicode_func(value))
value = unicodedata.normalize("NFKC", value.strip())
value = re.sub(to_und_rgx, "_", value)
value = re.sub(slugify_rgx, "-", value)
value = re.sub(multi_dash_rgx, "-", value)
value = re.sub(dash_und_rgx, "_", value)
value = re.sub(und_dash_rgx, "_", value)
value = re.sub(starting_chars_rgx, "", value)
value = re.sub(ending_chars_rgx, "", value)
return mark_safe(value)
if DJANGO_VERSION < (1, 10):
from django.utils.functional import allow_lazy
default_slugify = allow_lazy(default_slugify, six.text_type, SafeText)
else:
from django.utils.functional import keep_lazy
default_slugify = keep_lazy(six.text_type, SafeText)(default_slugify)
# DJANGO BACKWARDS-COMPATIBLE PATTERNS
def patterns(prefix, *args):
if DJANGO_VERSION < (1, 9):
from django.conf.urls import patterns as django_patterns
return django_patterns(prefix, *args)
elif prefix != "":
raise Exception("You need to update your URLConf to be a list of URL objects")
else:
return list(args)