mirror of
https://github.com/django/django.git
synced 2024-12-01 15:42:04 +01:00
Fixed #22714 -- Made contrib.gis use six-provided memoryview type
Thanks Tim Graham for the report.
This commit is contained in:
parent
4b57e203fe
commit
e97b7a2677
@ -1,9 +1 @@
|
||||
from django.utils import six
|
||||
|
||||
if six.PY3:
|
||||
memoryview = memoryview
|
||||
else:
|
||||
memoryview = buffer
|
||||
|
||||
|
||||
default_app_config = 'django.contrib.gis.apps.GISConfig'
|
||||
|
@ -5,7 +5,6 @@ corresponding to geographic model fields.
|
||||
|
||||
Thanks to Robert Coup for providing this functionality (see #4322).
|
||||
"""
|
||||
from django.contrib.gis import memoryview
|
||||
from django.utils import six
|
||||
|
||||
|
||||
@ -57,7 +56,7 @@ class GeometryProxy(object):
|
||||
# Assigning the SRID to the geometry.
|
||||
if value.srid is None:
|
||||
value.srid = self._field.srid
|
||||
elif value is None or isinstance(value, six.string_types + (memoryview,)):
|
||||
elif value is None or isinstance(value, six.string_types + (six.memoryview,)):
|
||||
# Set with None, WKT, HEX, or WKB
|
||||
pass
|
||||
else:
|
||||
|
@ -1,7 +1,6 @@
|
||||
from django.db import connections
|
||||
from django.db.models.query import QuerySet, ValuesQuerySet, ValuesListQuerySet
|
||||
|
||||
from django.contrib.gis import memoryview
|
||||
from django.contrib.gis.db.models import aggregates
|
||||
from django.contrib.gis.db.models.fields import get_srid_info, PointField, LineStringField
|
||||
from django.contrib.gis.db.models.sql import AreaField, DistanceField, GeomField, GeoQuery
|
||||
@ -690,7 +689,7 @@ class GeoQuerySet(QuerySet):
|
||||
if not backend.geography:
|
||||
if not isinstance(geo_field, PointField):
|
||||
raise ValueError('Spherical distance calculation only supported on PointFields.')
|
||||
if not str(Geometry(memoryview(params[0].ewkb)).geom_type) == 'Point':
|
||||
if not str(Geometry(six.memoryview(params[0].ewkb)).geom_type) == 'Point':
|
||||
raise ValueError('Spherical distance calculation only supported with Point Geometry parameters')
|
||||
# The `function` procedure argument needs to be set differently for
|
||||
# geodetic distance calculations.
|
||||
|
@ -43,8 +43,6 @@ import sys
|
||||
from binascii import a2b_hex, b2a_hex
|
||||
from ctypes import byref, string_at, c_char_p, c_double, c_ubyte, c_void_p
|
||||
|
||||
from django.contrib.gis import memoryview
|
||||
|
||||
# Getting GDAL prerequisites
|
||||
from django.contrib.gis.gdal.base import GDALBase
|
||||
from django.contrib.gis.gdal.envelope import Envelope, OGREnvelope
|
||||
@ -77,7 +75,7 @@ class OGRGeometry(GDALBase):
|
||||
|
||||
# If HEX, unpack input to a binary buffer.
|
||||
if str_instance and hex_regex.match(geom_input):
|
||||
geom_input = memoryview(a2b_hex(geom_input.upper().encode()))
|
||||
geom_input = six.memoryview(a2b_hex(geom_input.upper().encode()))
|
||||
str_instance = False
|
||||
|
||||
# Constructing the geometry,
|
||||
@ -102,7 +100,7 @@ class OGRGeometry(GDALBase):
|
||||
# (e.g., 'Point', 'POLYGON').
|
||||
OGRGeomType(geom_input)
|
||||
g = capi.create_geom(OGRGeomType(geom_input).num)
|
||||
elif isinstance(geom_input, memoryview):
|
||||
elif isinstance(geom_input, six.memoryview):
|
||||
# WKB was passed in
|
||||
g = capi.from_wkb(bytes(geom_input), None, byref(c_void_p()), len(geom_input))
|
||||
elif isinstance(geom_input, OGRGeomType):
|
||||
@ -346,7 +344,7 @@ class OGRGeometry(GDALBase):
|
||||
buf = (c_ubyte * sz)()
|
||||
capi.to_wkb(self.ptr, byteorder, byref(buf))
|
||||
# Returning a buffer of the string at the pointer.
|
||||
return memoryview(string_at(buf, sz))
|
||||
return six.memoryview(string_at(buf, sz))
|
||||
|
||||
@property
|
||||
def wkt(self):
|
||||
|
@ -1,4 +1,3 @@
|
||||
from django.contrib.gis import memoryview
|
||||
from django.contrib.gis.geos.geometry import GEOSGeometry, wkt_regex, hex_regex
|
||||
|
||||
from django.utils import six
|
||||
@ -27,7 +26,7 @@ def fromfile(file_h):
|
||||
else:
|
||||
return GEOSGeometry(buf)
|
||||
|
||||
return GEOSGeometry(memoryview(buf))
|
||||
return GEOSGeometry(six.memoryview(buf))
|
||||
|
||||
|
||||
def fromstr(string, **kwargs):
|
||||
|
@ -7,7 +7,6 @@ from __future__ import unicode_literals
|
||||
# Python, ctypes and types dependencies.
|
||||
from ctypes import addressof, byref, c_double
|
||||
|
||||
from django.contrib.gis import memoryview
|
||||
# super-class for mutable list behavior
|
||||
from django.contrib.gis.geos.mutable_list import ListMixin
|
||||
|
||||
@ -80,7 +79,7 @@ class GEOSGeometry(GEOSBase, ListMixin):
|
||||
elif isinstance(geo_input, GEOM_PTR):
|
||||
# When the input is a pointer to a geometry (GEOM_PTR).
|
||||
g = geo_input
|
||||
elif isinstance(geo_input, memoryview):
|
||||
elif isinstance(geo_input, six.memoryview):
|
||||
# When the input is a buffer (WKB).
|
||||
g = wkb_r().read(geo_input)
|
||||
elif isinstance(geo_input, GEOSGeometry):
|
||||
@ -151,7 +150,7 @@ class GEOSGeometry(GEOSBase, ListMixin):
|
||||
def __setstate__(self, state):
|
||||
# Instantiating from the tuple state that was pickled.
|
||||
wkb, srid = state
|
||||
ptr = wkb_r().read(memoryview(wkb))
|
||||
ptr = wkb_r().read(six.memoryview(wkb))
|
||||
if not ptr:
|
||||
raise GEOSException('Invalid Geometry loaded from pickled state.')
|
||||
self.ptr = ptr
|
||||
|
@ -1,6 +1,5 @@
|
||||
import threading
|
||||
from ctypes import byref, c_char_p, c_int, c_char, c_size_t, Structure, POINTER
|
||||
from django.contrib.gis import memoryview
|
||||
from django.contrib.gis.geos.base import GEOSBase
|
||||
from django.contrib.gis.geos.libgeos import GEOM_PTR
|
||||
from django.contrib.gis.geos.prototypes.errcheck import check_geom, check_string, check_sized_string
|
||||
@ -164,7 +163,7 @@ class _WKBReader(IOBase):
|
||||
|
||||
def read(self, wkb):
|
||||
"Returns a _pointer_ to C GEOS Geometry object from the given WKB."
|
||||
if isinstance(wkb, memoryview):
|
||||
if isinstance(wkb, six.memoryview):
|
||||
wkb_s = bytes(wkb)
|
||||
return wkb_reader_read(self.ptr, wkb_s, len(wkb_s))
|
||||
elif isinstance(wkb, (bytes, six.string_types)):
|
||||
@ -201,7 +200,7 @@ class WKBWriter(IOBase):
|
||||
|
||||
def write(self, geom):
|
||||
"Returns the WKB representation of the given geometry."
|
||||
return memoryview(wkb_writer_write(self.ptr, geom.ptr, byref(c_size_t())))
|
||||
return six.memoryview(wkb_writer_write(self.ptr, geom.ptr, byref(c_size_t())))
|
||||
|
||||
def write_hex(self, geom):
|
||||
"Returns the HEXEWKB representation of the given geometry."
|
||||
|
@ -10,7 +10,6 @@ from io import BytesIO
|
||||
|
||||
from django.contrib.gis.gdal import HAS_GDAL
|
||||
|
||||
from django.contrib.gis import memoryview
|
||||
from django.contrib.gis.geometry.test_data import TestDataMixin
|
||||
|
||||
from django.utils.encoding import force_bytes
|
||||
@ -110,8 +109,8 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
|
||||
self.assertEqual(True, GEOSGeometry(hexewkb_3d).hasz)
|
||||
|
||||
# Same for EWKB.
|
||||
self.assertEqual(memoryview(a2b_hex(hexewkb_2d)), pnt_2d.ewkb)
|
||||
self.assertEqual(memoryview(a2b_hex(hexewkb_3d)), pnt_3d.ewkb)
|
||||
self.assertEqual(six.memoryview(a2b_hex(hexewkb_2d)), pnt_2d.ewkb)
|
||||
self.assertEqual(six.memoryview(a2b_hex(hexewkb_3d)), pnt_3d.ewkb)
|
||||
|
||||
# Redundant sanity check.
|
||||
self.assertEqual(4326, GEOSGeometry(hexewkb_2d).srid)
|
||||
@ -132,7 +131,7 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
|
||||
fromstr(err.wkt)
|
||||
|
||||
# Bad WKB
|
||||
self.assertRaises(GEOSException, GEOSGeometry, memoryview(b'0'))
|
||||
self.assertRaises(GEOSException, GEOSGeometry, six.memoryview(b'0'))
|
||||
|
||||
class NotAGeometry(object):
|
||||
pass
|
||||
@ -160,7 +159,7 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
|
||||
def test_create_wkb(self):
|
||||
"Testing creation from WKB."
|
||||
for g in self.geometries.hex_wkt:
|
||||
wkb = memoryview(a2b_hex(g.hex.encode()))
|
||||
wkb = six.memoryview(a2b_hex(g.hex.encode()))
|
||||
geom_h = GEOSGeometry(wkb)
|
||||
# we need to do this so decimal places get normalized
|
||||
geom_t = fromstr(g.wkt)
|
||||
|
@ -4,7 +4,7 @@ import binascii
|
||||
import unittest
|
||||
from unittest import skipUnless
|
||||
|
||||
from django.contrib.gis import memoryview
|
||||
from django.utils.six import memoryview
|
||||
|
||||
from ..import HAS_GEOS
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user