summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorAhmed Ibrahim <ahmeddark369@gmail.com>2025-07-17 09:50:39 +0300
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2025-07-20 11:18:38 +0200
commita5b0a618c3ff16f9f52a9abdc89c05899ef112b4 (patch)
tree08c83f12bfe69d585b3c40fecb215dceaa52a4b3 /django
parent6aa05fd23205fce523924e307f78ce8d614af7f1 (diff)
Fixed #28696 -- Added GeometryType GIS database function and __geom_type lookup.
Co-Authored-By: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Diffstat (limited to 'django')
-rw-r--r--django/contrib/gis/db/backends/base/operations.py1
-rw-r--r--django/contrib/gis/db/backends/oracle/operations.py40
-rw-r--r--django/contrib/gis/db/backends/postgis/operations.py1
-rw-r--r--django/contrib/gis/db/models/functions.py24
4 files changed, 49 insertions, 17 deletions
diff --git a/django/contrib/gis/db/backends/base/operations.py b/django/contrib/gis/db/backends/base/operations.py
index 8351e71fbd..23e7fd2c25 100644
--- a/django/contrib/gis/db/backends/base/operations.py
+++ b/django/contrib/gis/db/backends/base/operations.py
@@ -54,6 +54,7 @@ class BaseSpatialOperations:
"FromWKT",
"GeoHash",
"GeometryDistance",
+ "GeometryType",
"Intersection",
"IsEmpty",
"IsValid",
diff --git a/django/contrib/gis/db/backends/oracle/operations.py b/django/contrib/gis/db/backends/oracle/operations.py
index b8618ae593..3d5dcc7294 100644
--- a/django/contrib/gis/db/backends/oracle/operations.py
+++ b/django/contrib/gis/db/backends/oracle/operations.py
@@ -18,6 +18,7 @@ from django.contrib.gis.geos.geometry import GEOSGeometry, GEOSGeometryBase
from django.contrib.gis.geos.prototypes.io import wkb_r
from django.contrib.gis.measure import Distance
from django.db.backends.oracle.operations import DatabaseOperations
+from django.utils.functional import cached_property
DEFAULT_TOLERANCE = "0.05"
@@ -117,23 +118,28 @@ class OracleOperations(BaseSpatialOperations, DatabaseOperations):
"dwithin": SDODWithin(),
}
- unsupported_functions = {
- "AsKML",
- "AsSVG",
- "Azimuth",
- "ClosestPoint",
- "ForcePolygonCW",
- "GeoHash",
- "GeometryDistance",
- "IsEmpty",
- "LineLocatePoint",
- "MakeValid",
- "MemSize",
- "Rotate",
- "Scale",
- "SnapToGrid",
- "Translate",
- }
+ @cached_property
+ def unsupported_functions(self):
+ unsupported = {
+ "AsKML",
+ "AsSVG",
+ "Azimuth",
+ "ClosestPoint",
+ "ForcePolygonCW",
+ "GeoHash",
+ "GeometryDistance",
+ "IsEmpty",
+ "LineLocatePoint",
+ "MakeValid",
+ "MemSize",
+ "Rotate",
+ "Scale",
+ "SnapToGrid",
+ "Translate",
+ }
+ if self.connection.oracle_version < (23,):
+ unsupported.add("GeometryType")
+ return unsupported
def geo_quote_name(self, name):
return super().geo_quote_name(name).upper()
diff --git a/django/contrib/gis/db/backends/postgis/operations.py b/django/contrib/gis/db/backends/postgis/operations.py
index 7ae22fd00b..bd1e79a6d6 100644
--- a/django/contrib/gis/db/backends/postgis/operations.py
+++ b/django/contrib/gis/db/backends/postgis/operations.py
@@ -177,6 +177,7 @@ class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
"FromWKB": "ST_GeomFromWKB",
"FromWKT": "ST_GeomFromText",
"NumPoints": "ST_NPoints",
+ "GeometryType": "GeometryType",
}
return function_names
diff --git a/django/contrib/gis/db/models/functions.py b/django/contrib/gis/db/models/functions.py
index f26e9ae3e0..cafcd32e3b 100644
--- a/django/contrib/gis/db/models/functions.py
+++ b/django/contrib/gis/db/models/functions.py
@@ -9,6 +9,7 @@ from django.db import NotSupportedError
from django.db.models import (
BinaryField,
BooleanField,
+ CharField,
FloatField,
Func,
IntegerField,
@@ -423,6 +424,29 @@ class Intersection(OracleToleranceMixin, GeomOutputGeoFunc):
@BaseSpatialField.register_lookup
+class GeometryType(GeoFuncMixin, Transform):
+ output_field = CharField()
+ lookup_name = "geom_type"
+
+ def as_oracle(self, compiler, connection, **extra_context):
+ lhs, params = compiler.compile(self.lhs)
+ sql = (
+ "(SELECT DECODE("
+ f"SDO_GEOMETRY.GET_GTYPE({lhs}),"
+ "1, 'POINT',"
+ "2, 'LINESTRING',"
+ "3, 'POLYGON',"
+ "4, 'COLLECTION',"
+ "5, 'MULTIPOINT',"
+ "6, 'MULTILINESTRING',"
+ "7, 'MULTIPOLYGON',"
+ "8, 'SOLID',"
+ "'UNKNOWN'))"
+ )
+ return sql, params
+
+
+@BaseSpatialField.register_lookup
class IsEmpty(GeoFuncMixin, Transform):
lookup_name = "isempty"
output_field = BooleanField()