Author: jbronn
Date: 2009-04-21 17:40:49 -0500 (Tue, 21 Apr 2009)
New Revision: 10616

Modified:
   django/branches/releases/1.0.X/django/contrib/gis/db/models/sql/query.py
   django/branches/releases/1.0.X/django/contrib/gis/tests/relatedapp/tests.py
Log:
[1.0.X] Fixed #10839 -- `GeoQuery` now unpickles properly on Oracle.

Backport of r10615 from trunk.


Modified: 
django/branches/releases/1.0.X/django/contrib/gis/db/models/sql/query.py
===================================================================
--- django/branches/releases/1.0.X/django/contrib/gis/db/models/sql/query.py    
2009-04-21 22:35:04 UTC (rev 10615)
+++ django/branches/releases/1.0.X/django/contrib/gis/db/models/sql/query.py    
2009-04-21 22:40:49 UTC (rev 10616)
@@ -30,6 +30,13 @@
         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 @@
             # 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):

Modified: 
django/branches/releases/1.0.X/django/contrib/gis/tests/relatedapp/tests.py
===================================================================
--- django/branches/releases/1.0.X/django/contrib/gis/tests/relatedapp/tests.py 
2009-04-21 22:35:04 UTC (rev 10615)
+++ django/branches/releases/1.0.X/django/contrib/gis/tests/relatedapp/tests.py 
2009-04-21 22:40:49 UTC (rev 10616)
@@ -137,6 +137,15 @@
             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():


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to