Commit 26138729 authored by Justin Bronn's avatar Justin Bronn
Browse files

[1.1.X] Fixed #10594 -- `GeoQuerySet` measurment methods no longer crash on...

[1.1.X] Fixed #10594 -- `GeoQuerySet` measurment methods no longer crash on geometry fields with NULL values.  Thanks, whiteinge for the bug report and yourcelf for the initial patch.

Backport of r12885 from trunk.


git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12886 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 8ef5daeb
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -245,7 +245,11 @@ class GeoQuery(sql.Query):
            # Running through Oracle's first.
            value = super(GeoQuery, self).convert_values(value, field or GeomField())

        if isinstance(field, DistanceField):
        if value is None:
            # Output from spatial function is NULL (e.g., called
            # function on a geometry field with NULL value).
            pass
        elif isinstance(field, DistanceField):
            # Using the field's distance attribute, can instantiate
            # `Distance` with the right context.
            value = Distance(**{field.distance_att : value})
+2 −1
Original line number Diff line number Diff line
@@ -26,11 +26,12 @@ class CensusZipcode(models.Model):
    name = models.CharField(max_length=5)
    poly = models.PolygonField(srid=4269)
    objects = models.GeoManager()
    def __unicode__(self): return self.name

class SouthTexasZipcode(models.Model):
    "Model for a few South Texas ZIP codes."
    name = models.CharField(max_length=5)
    poly = models.PolygonField(srid=32140)
    poly = models.PolygonField(srid=32140, null=True)
    objects = models.GeoManager()
    def __unicode__(self): return self.name

+11 −0
Original line number Diff line number Diff line
@@ -324,6 +324,17 @@ class DistanceTest(unittest.TestCase):
        for i, c in enumerate(SouthTexasCity.objects.perimeter(model_att='perim')):
            self.assertEqual(0, c.perim.m)

    def test09_measurement_null_fields(self):
        "Testing the measurement GeoQuerySet methods on fields with NULL values."
        # Creating SouthTexasZipcode w/NULL value.
        SouthTexasZipcode.objects.create(name='78212')
        # Performing distance/area queries against the NULL PolygonField,
        # and ensuring the result of the operations is None.
        htown = SouthTexasCity.objects.get(name='Downtown Houston')
        z = SouthTexasZipcode.objects.distance(htown.point).area().get(name='78212')
        self.assertEqual(None, z.distance)
        self.assertEqual(None, z.area)

def suite():
    s = unittest.TestSuite()
    s.addTest(unittest.makeSuite(DistanceTest))