def get_boundaries(self, sets=None): r = {'boundaries_concordance': [], 'boundaries_centroid': []} concordances = PostcodeConcordance.objects.filter( code=self.code).values_list('boundary', flat=True) if sets: concordances = [ boundary for boundary in concordances if boundary.split('/')[0] in sets ] concordance_sets = set() if concordances: q = ((models.Q(set=concordance.split('/')[0]) & models.Q(slug=concordance.split('/')[1])) for concordance in concordances) boundaries = Boundary.objects.filter(reduce(lambda a, b: a | b, q)) boundaries = Boundary.prepare_queryset_for_get_dicts(boundaries) boundaries = Boundary.get_dicts(boundaries) r['boundaries_concordance'] = boundaries for boundary in boundaries: concordance_sets.add(boundary['related']['boundary_set_url']) if self.centroid: q = models.Q(shape__contains=self.centroid) if sets: q &= models.Q(set__in=sets) boundaries = Boundary.objects.filter(q) boundaries = Boundary.prepare_queryset_for_get_dicts(boundaries) boundaries = Boundary.get_dicts(boundaries) r['boundaries_centroid'] = [ boundary for boundary in boundaries if boundary['related'] ['boundary_set_url'] not in concordance_sets ] return r
def get_boundaries(self, sets=None): r = { 'boundaries_concordance': [], 'boundaries_centroid': [] } concordances = PostcodeConcordance.objects.filter(code=self.code).values_list('boundary', flat=True) if sets: concordances = [boundary for boundary in concordances if boundary.split('/')[0] in sets] concordance_sets = set() if concordances: q = ((models.Q(set=concordance.split('/')[0]) & models.Q(slug=concordance.split('/')[1])) for concordance in concordances) boundaries = Boundary.objects.filter(reduce(lambda a, b: a | b, q)) boundaries = Boundary.prepare_queryset_for_get_dicts(boundaries) boundaries = Boundary.get_dicts(boundaries) r['boundaries_concordance'] = boundaries for boundary in boundaries: concordance_sets.add(boundary['related']['boundary_set_url']) if self.centroid: q = models.Q(shape__contains=self.centroid) if sets: q &= models.Q(set__in=sets) boundaries = Boundary.objects.filter(q) boundaries = Boundary.prepare_queryset_for_get_dicts(boundaries) boundaries = Boundary.get_dicts(boundaries) r['boundaries_centroid'] = [boundary for boundary in boundaries if boundary['related']['boundary_set_url'] not in concordance_sets] return r
def test_prepare_queryset_for_get_dicts(self): Boundary.objects.create( slug='bar', set=BoundarySet(slug='foo'), name='Bar', set_name='Foo', external_id=1, shape=MultiPolygon(()), simple_shape=MultiPolygon(()), ) # Coerce the django.contrib.gis.db.models.query.GeoValuesListQuerySet. self.assertEqual(list(Boundary.prepare_queryset_for_get_dicts(Boundary.objects)), [ ('bar', 'foo', 'Bar', 'Foo', '1'), ])
def test_prepare_queryset_for_get_dicts(self): geom = GEOSGeometry('MULTIPOLYGON(((0 0,0 5,5 5,0 0)))') Boundary.objects.create( slug='bar', set=BoundarySet(slug='foo'), name='Bar', set_name='Foo', external_id=1, shape=geom, simple_shape=geom, ) # Coerce the django.contrib.gis.db.models.query.GeoValuesListQuerySet. self.assertEqual(list(Boundary.prepare_queryset_for_get_dicts(Boundary.objects)), [ ('bar', 'foo', 'Bar', 'Foo', '1'), ])
def test_prepare_queryset_for_get_dicts(self): geom = GEOSGeometry('MULTIPOLYGON(((0 0,0 5,5 5,0 0)))') Boundary.objects.create( slug='bar', set=BoundarySet(slug='foo'), name='Bar', set_name='Foo', external_id=1, shape=geom, simple_shape=geom, ) # Coerce the django.contrib.gis.db.models.query.GeoValuesListQuerySet. self.assertEqual(list(Boundary.prepare_queryset_for_get_dicts(Boundary.objects)), [ ('bar', 'foo', 'Bar', 'Foo', '1'), ])