summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Fedoseev <fedoseev.sergey@gmail.com>2015-11-26 00:34:08 +0500
committerTim Graham <timograham@gmail.com>2015-12-03 19:03:28 -0500
commit717a54c88307eabda9240cd28f0c7851f18b45eb (patch)
treeaa6ccdb664036263424f51ab118ed6f51489c3ad
parentb52b9cf6f2e88468b13ca64b806abc9a3dd437bd (diff)
Fixed #25797 -- Fixed regex for getting units from SRS WKT.
-rw-r--r--django/contrib/gis/db/backends/base/models.py7
-rw-r--r--tests/gis_tests/distapp/tests.py40
2 files changed, 24 insertions, 23 deletions
diff --git a/django/contrib/gis/db/backends/base/models.py b/django/contrib/gis/db/backends/base/models.py
index a84b23dfe8..6bebfa9f7e 100644
--- a/django/contrib/gis/db/backends/base/models.py
+++ b/django/contrib/gis/db/backends/base/models.py
@@ -21,12 +21,7 @@ class SpatialRefSysMixin(object):
# TODO: Figure out how to pull out angular units of projected coordinate system and
# fix for LOCAL_CS types. GDAL should be highly recommended for performing
# distance queries.
- units_regex = re.compile(
- r'.+UNIT ?\["(?P<unit_name>[\w \'\(\)]+)", ?(?P<unit>[\d\.]+)'
- r'(,AUTHORITY\["(?P<unit_auth_name>[\w \'\(\)]+)",'
- r'"(?P<unit_auth_val>\d+)"\])?\]([\w ]+)?(,'
- r'AUTHORITY\["(?P<auth_name>[\w \'\(\)]+)","(?P<auth_val>\d+)"\])?\]$'
- )
+ units_regex = re.compile(r'.+UNIT ?\["(?P<unit_name>[\w \.\'\(\)]+)", ?(?P<unit>[^ ,\]]+)', re.DOTALL)
@property
def srs(self):
diff --git a/tests/gis_tests/distapp/tests.py b/tests/gis_tests/distapp/tests.py
index c50f1124f0..f9d3e7ecd8 100644
--- a/tests/gis_tests/distapp/tests.py
+++ b/tests/gis_tests/distapp/tests.py
@@ -1,13 +1,16 @@
from __future__ import unicode_literals
+from unittest import skipUnless
+
from django.contrib.gis.db.models.functions import (
Area, Distance, Length, Perimeter, Transform,
)
+from django.contrib.gis.gdal import HAS_GDAL
from django.contrib.gis.geos import GEOSGeometry, LineString, Point
from django.contrib.gis.measure import D # alias for Distance
from django.db import connection
from django.db.models import F, Q
-from django.test import TestCase, ignore_warnings, skipUnlessDBFeature
+from django.test import TestCase, ignore_warnings, mock, skipUnlessDBFeature
from django.utils.deprecation import RemovedInDjango20Warning
from ..utils import no_oracle, oracle, postgis
@@ -487,6 +490,7 @@ class DistanceFunctionsTests(TestCase):
tol
)
+ @skipUnless(HAS_GDAL, "GDAL is required.")
@skipUnlessDBFeature("has_Distance_function", "has_Transform_function")
def test_distance_projected(self):
"""
@@ -509,24 +513,26 @@ class DistanceFunctionsTests(TestCase):
455411.438904354, 519386.252102563, 696139.009211594,
232513.278304279, 542445.630586414, 456679.155883207]
- # Testing using different variations of parameters and using models
- # with different projected coordinate systems.
- dist1 = SouthTexasCity.objects.annotate(distance=Distance('point', lagrange)).order_by('id')
- if oracle:
- dist_qs = [dist1]
- else:
- dist2 = SouthTexasCityFt.objects.annotate(distance=Distance('point', lagrange)).order_by('id')
- dist_qs = [dist1, dist2]
+ for has_gdal in [False, True]:
+ with mock.patch('django.contrib.gis.gdal.HAS_GDAL', has_gdal):
+ # Testing using different variations of parameters and using models
+ # with different projected coordinate systems.
+ dist1 = SouthTexasCity.objects.annotate(distance=Distance('point', lagrange)).order_by('id')
+ if oracle:
+ dist_qs = [dist1]
+ else:
+ dist2 = SouthTexasCityFt.objects.annotate(distance=Distance('point', lagrange)).order_by('id')
+ dist_qs = [dist1, dist2]
- # Original query done on PostGIS, have to adjust AlmostEqual tolerance
- # for Oracle.
- tol = 2 if oracle else 5
+ # Original query done on PostGIS, have to adjust AlmostEqual tolerance
+ # for Oracle.
+ tol = 2 if oracle else 5
- # Ensuring expected distances are returned for each distance queryset.
- for qs in dist_qs:
- for i, c in enumerate(qs):
- self.assertAlmostEqual(m_distances[i], c.distance.m, tol)
- self.assertAlmostEqual(ft_distances[i], c.distance.survey_ft, tol)
+ # Ensuring expected distances are returned for each distance queryset.
+ for qs in dist_qs:
+ for i, c in enumerate(qs):
+ self.assertAlmostEqual(m_distances[i], c.distance.m, tol)
+ self.assertAlmostEqual(ft_distances[i], c.distance.survey_ft, tol)
@skipUnlessDBFeature("has_Distance_function", "supports_distance_geodetic")
def test_distance_geodetic(self):