diff options
| author | Justin Bronn <jbronn@gmail.com> | 2009-04-21 22:40:49 +0000 |
|---|---|---|
| committer | Justin Bronn <jbronn@gmail.com> | 2009-04-21 22:40:49 +0000 |
| commit | 725ffa57bb33c45956ec11f14eae997cf9607bc2 (patch) | |
| tree | 7d22bae5f3073761217e5cd774d4375f3e051ecf | |
| parent | f110f91a0399afad8db9b2925737074d185d20bf (diff) | |
[1.0.X] Fixed #10839 -- `GeoQuery` now unpickles properly on Oracle.
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
| -rw-r--r-- | django/contrib/gis/db/models/sql/query.py | 16 | ||||
| -rw-r--r-- | django/contrib/gis/tests/relatedapp/tests.py | 9 |
2 files changed, 25 insertions, 0 deletions
diff --git a/django/contrib/gis/db/models/sql/query.py b/django/contrib/gis/db/models/sql/query.py index 0376e266e1..13b724ec9e 100644 --- a/django/contrib/gis/db/models/sql/query.py +++ b/django/contrib/gis/db/models/sql/query.py @@ -30,6 +30,13 @@ class GeoQuery(sql.Query): 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 @@ -324,6 +331,15 @@ class GeoQuery(sql.Query): # 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): diff --git a/django/contrib/gis/tests/relatedapp/tests.py b/django/contrib/gis/tests/relatedapp/tests.py index a35836773a..3096914a9d 100644 --- a/django/contrib/gis/tests/relatedapp/tests.py +++ b/django/contrib/gis/tests/relatedapp/tests.py @@ -137,6 +137,15 @@ class RelatedGeoModelTest(unittest.TestCase): 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(): |
