Skip to content

Commit

Permalink
[1.0.X] Fixed #10839 -- GeoQuery now unpickles properly on Oracle.
Browse files Browse the repository at this point in the history
Backport of r10615 from trunk.


git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10616 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
jbronn committed Apr 21, 2009
1 parent f110f91 commit 725ffa5
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 0 deletions.
16 changes: 16 additions & 0 deletions django/contrib/gis/db/models/sql/query.py
Expand Up @@ -30,6 +30,13 @@ def __init__(self, model, conn):
self.transformed_srid = None
self.extra_select_fields = {}

if SpatialBackend.oracle:
# Have to override this so that GeoQuery, instead of OracleQuery,
# is returned when unpickling.
def __reduce__(self):
callable, args, data = super(GeoQuery, self).__reduce__()
return (unpickle_geoquery, (), data)

def clone(self, *args, **kwargs):
obj = super(GeoQuery, self).clone(*args, **kwargs)
# Customized selection dictionary and transformed srid flag have
Expand Down Expand Up @@ -324,6 +331,15 @@ def _geo_field(self, field_name=None):
# a lookup to a _related_ geographic field.
return self._check_geo_field(self.model, field_name)

if SpatialBackend.oracle:
def unpickle_geoquery():
"""
Utility function, called by Python's unpickling machinery, that handles
unpickling of GeoQuery subclasses of OracleQuery.
"""
return GeoQuery.__new__(GeoQuery)
unpickle_geoquery.__safe_for_unpickling__ = True

### Field Classes for `convert_values` ####
class BaseField(object):
def get_internal_type(self):
Expand Down
9 changes: 9 additions & 0 deletions django/contrib/gis/tests/relatedapp/tests.py
Expand Up @@ -137,6 +137,15 @@ def test09_pk_relations(self):
self.assertEqual(val_dict['id'], c_id)
self.assertEqual(val_dict['location__id'], l_id)

def test11_geoquery_pickle(self):
"Ensuring GeoQuery objects are unpickled correctly. See #10839."
import pickle
from django.contrib.gis.db.models.sql import GeoQuery
qs = City.objects.all()
q_str = pickle.dumps(qs.query)
q = pickle.loads(q_str)
self.assertEqual(GeoQuery, q.__class__)

# TODO: Related tests for KML, GML, and distance lookups.

def suite():
Expand Down

0 comments on commit 725ffa5

Please sign in to comment.