1
0
mirror of https://github.com/django/django.git synced 2025-06-11 06:29:13 +00:00

Added validation to BaseSpatialFeatures.has_<Func>_function.

This commit is contained in:
Tim Graham 2025-06-05 16:18:56 -04:00 committed by GitHub
parent f0a87895ff
commit cf1a80fc2d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 26 additions and 3 deletions

View File

@ -2,6 +2,8 @@ import re
from django.contrib.gis.db import models from django.contrib.gis.db import models
from .operations import BaseSpatialOperations
class BaseSpatialFeatures: class BaseSpatialFeatures:
gis_enabled = True gis_enabled = True
@ -107,5 +109,11 @@ class BaseSpatialFeatures:
m = re.match(r"has_(\w*)_function$", name) m = re.match(r"has_(\w*)_function$", name)
if m: if m:
func_name = m[1] func_name = m[1]
if func_name not in BaseSpatialOperations.unsupported_functions:
raise ValueError(
f"DatabaseFeatures.has_{func_name}_function isn't valid. "
f'Is "{func_name}" missing from '
"BaseSpatialOperations.unsupported_functions?"
)
return func_name not in self.connection.ops.unsupported_functions return func_name not in self.connection.ops.unsupported_functions
raise AttributeError raise AttributeError

View File

@ -39,13 +39,17 @@ class BaseSpatialOperations:
"AsGML", "AsGML",
"AsKML", "AsKML",
"AsSVG", "AsSVG",
"AsWKB",
"AsWKT",
"Azimuth", "Azimuth",
"BoundingCircle", "BoundingCircle",
"Centroid", "Centroid",
"ClosestPoint", "ClosestPoint",
"Difference", "Difference",
"Distance", "Distance",
"DistanceSpheroid",
"Envelope", "Envelope",
"ForcePolygonCW",
"FromWKB", "FromWKB",
"FromWKT", "FromWKT",
"GeoHash", "GeoHash",

View File

@ -559,7 +559,7 @@ class GISFunctionsTests(FuncTestMixin, TestCase):
# Exact value depends on database and version. # Exact value depends on database and version.
self.assertTrue(20 <= ptown.size <= 105) self.assertTrue(20 <= ptown.size <= 105)
@skipUnlessDBFeature("has_NumGeom_function") @skipUnlessDBFeature("has_NumGeometries_function")
def test_num_geom(self): def test_num_geom(self):
# Both 'countries' only have two geometries. # Both 'countries' only have two geometries.
for c in Country.objects.annotate(num_geom=functions.NumGeometries("mpoly")): for c in Country.objects.annotate(num_geom=functions.NumGeometries("mpoly")):
@ -576,7 +576,7 @@ class GISFunctionsTests(FuncTestMixin, TestCase):
else: else:
self.assertEqual(1, city.num_geom) self.assertEqual(1, city.num_geom)
@skipUnlessDBFeature("has_NumPoint_function") @skipUnlessDBFeature("has_NumPoints_function")
def test_num_points(self): def test_num_points(self):
coords = [(-95.363151, 29.763374), (-95.448601, 29.713803)] coords = [(-95.363151, 29.763374), (-95.448601, 29.713803)]
Track.objects.create(name="Foo", line=LineString(coords)) Track.objects.create(name="Foo", line=LineString(coords))

View File

@ -1,8 +1,9 @@
import unittest import unittest
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.db import ProgrammingError from django.db import ProgrammingError, connection
from django.db.backends.base.base import NO_DB_ALIAS from django.db.backends.base.base import NO_DB_ALIAS
from django.test import TestCase
try: try:
from django.contrib.gis.db.backends.postgis.operations import PostGISOperations from django.contrib.gis.db.backends.postgis.operations import PostGISOperations
@ -12,6 +13,16 @@ except ImportError:
HAS_POSTGRES = False HAS_POSTGRES = False
class BaseSpatialFeaturesTests(TestCase):
def test_invalid_has_func_function(self):
msg = (
'DatabaseFeatures.has_Invalid_function isn\'t valid. Is "Invalid" '
"missing from BaseSpatialOperations.unsupported_functions?"
)
with self.assertRaisesMessage(ValueError, msg):
connection.features.has_Invalid_function
if HAS_POSTGRES: if HAS_POSTGRES:
class FakeConnection: class FakeConnection: