def test_overlapping_returned_can_be_filtered(self): overlaps = Topology.overlapping(self.topo1) overlaps = overlaps.exclude(pk=self.topo1.pk) self.assertEqual(len(overlaps), 4) overlaps = Topology.overlapping(self.topo1) overlaps = overlaps.filter(pk__in=[self.point1.pk, self.point2.pk]) self.assertEqual(len(overlaps), 2)
def test_overlapping_returned_can_be_filtered(self): overlaps = Topology.overlapping(self.topo1) overlaps = overlaps.exclude(pk=self.topo1.pk) self.assertEqual(len(overlaps), 4) overlaps = Topology.overlapping(self.topo1) overlaps = overlaps.filter(pk__in=[self.point1.pk, self.point2.pk]) self.assertEqual(len(overlaps), 2)
def filter(qs, edges): """ This piece of code was moved from core, and should be rewritten nicely with managers : TODO ! """ # TODO: this is wrong, land should not depend on maintenance import geotrek.maintenance as maintenance overlapping = Topology.overlapping(edges) # In case, we filter on paths if qs.model == Path: paths = [] for o in overlapping: paths.extend(o.paths.all()) return qs.filter(pk__in=[path.pk for path in set(paths)]) # TODO: This is (amazingly) ugly in terms of OOP. Should refactor overlapping() elif issubclass(qs.model, maintenance.models.Intervention): return qs.filter(topology__in=[topo.pk for topo in overlapping]) elif issubclass(qs.model, maintenance.models.Project): # Find all interventions overlapping those edges interventions = filter(maintenance.models.Intervention.objects.existing() .select_related(depth=1) .filter(project__in=qs), edges) # Return only the projects concerned by the interventions projects = [] for intervention in interventions: projects.append(intervention.project.pk) return qs.filter(pk__in=set(projects)) else: assert issubclass(qs.model, Topology), "%s is not a Topology as expected" % qs.model return qs.filter(pk__in=[topo.pk for topo in overlapping])
def get_interventions(cls, obj): blade_content_type = ContentType.objects.get_for_model(Blade) if settings.TREKKING_TOPOLOGY_ENABLED: topologies = list(Topology.overlapping(obj).values_list('pk', flat=True)) else: area = obj.geom.buffer(settings.INTERVENTION_INTERSECTION_MARGIN) topologies = list(Topology.objects.existing().filter(geom__intersects=area).values_list('pk', flat=True)) qs = Q(target_id__in=topologies) & ~Q(target_type=blade_content_type) if 'geotrek.signage' in settings.INSTALLED_APPS: blades = list(Blade.objects.filter(signage__in=topologies).values_list('id', flat=True)) qs |= Q(target_id__in=blades, target_type=blade_content_type) return Intervention.objects.existing().filter(qs).distinct('pk')
def topology_interventions(cls, topology): topos = Topology.overlapping(topology).values_list('pk', flat=True) return cls.objects.existing().filter(topology__in=topos).distinct('pk')
def test_overlapping_return_sharing_path(self): overlaps = Topology.overlapping(self.topo1) self.assertTrue(self.topo1 in overlaps) self.assertTrue(self.topo2 in overlaps)
def test_overlapping_does_not_fail_if_no_records(self): from geotrek.trekking.models import Trek overlaps = Topology.overlapping(Trek.objects.all()) self.assertEqual(list(overlaps), [])
def test_overlapping_sorts_when_path_is_reversed(self): overlaps = Topology.overlapping(self.topo1) self.assertEqual( list(overlaps), [self.topo1, self.point2, self.point3, self.point1, self.topo2])
def test_overlapping_sorts_by_order_of_progression(self): overlaps = Topology.overlapping(self.topo2) self.assertEqual( list(overlaps), [self.topo2, self.point1, self.point3, self.point2, self.topo1])
def test_overlapping_does_not_fail_if_no_records(self): from geotrek.trekking.models import Trek overlaps = Topology.overlapping(Trek.objects.all()) self.assertEqual(list(overlaps), [])
def test_overlapping_sorts_when_path_is_reversed(self): overlaps = Topology.overlapping(self.topo1) self.assertEqual(list(overlaps), [self.topo1, self.point2, self.point3, self.point1, self.topo2])
def test_overlapping_sorts_by_order_of_progression(self): overlaps = Topology.overlapping(self.topo2) self.assertEqual(list(overlaps), [self.topo2, self.point1, self.point3, self.point2, self.topo1])
def test_overlapping_return_sharing_path(self): overlaps = Topology.overlapping(self.topo1) self.assertTrue(self.topo1 in overlaps) self.assertTrue(self.topo2 in overlaps)
def topology_interventions(cls, topology): topos = Topology.overlapping(topology).values_list('pk', flat=True) return cls.objects.existing().filter(topology__in=topos).distinct('pk')