Commit 7e526578 authored by Justin Bronn's avatar Justin Bronn
Browse files

Fixed #10594 -- `GeoQuerySet` measurment methods no longer crash on geometry...

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.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@12885 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 381b10c2
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -51,7 +51,8 @@ class GeoQuery(sql.Query):
        return obj

    def convert_values(self, value, field, connection):
        """        Using the same routines that Oracle does we can convert our
        """
        Using the same routines that Oracle does we can convert our
        extra selection objects into Geometry and Distance objects.
        TODO: Make converted objects 'lazy' for less overhead.
        """
@@ -59,7 +60,11 @@ class GeoQuery(sql.Query):
            # Running through Oracle's first.
            value = super(GeoQuery, self).convert_values(value, field or GeomField(), connection)

        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
@@ -362,6 +362,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))