diff options
| author | Ahmed Ibrahim <ahmeddark369@gmail.com> | 2025-07-17 09:50:39 +0300 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2025-07-20 11:18:38 +0200 |
| commit | a5b0a618c3ff16f9f52a9abdc89c05899ef112b4 (patch) | |
| tree | 08c83f12bfe69d585b3c40fecb215dceaa52a4b3 /django | |
| parent | 6aa05fd23205fce523924e307f78ce8d614af7f1 (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.py | 1 | ||||
| -rw-r--r-- | django/contrib/gis/db/backends/oracle/operations.py | 40 | ||||
| -rw-r--r-- | django/contrib/gis/db/backends/postgis/operations.py | 1 | ||||
| -rw-r--r-- | django/contrib/gis/db/models/functions.py | 24 |
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() |
