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 -~----------~----~----~----~------~----~------~--~---