diff --git a/lemarche/siaes/models.py b/lemarche/siaes/models.py index d36d7394c..a9d6bc51c 100644 --- a/lemarche/siaes/models.py +++ b/lemarche/siaes/models.py @@ -274,7 +274,7 @@ def address_in_perimeter_list(self, perimeters: models.QuerySet): conditions |= get_region_filter(perimeter) return self.filter(conditions) - def geo_range_in_perimeter_list(self, perimeters: models.QuerySet, with_country=False): + def geo_range_in_perimeter_list(self, perimeters: models.QuerySet, with_country=False, include_country_area=False): """ Method to filter the Siaes depending on the perimeter filter. We filter on the Siae's address & geo_range fields. @@ -300,6 +300,8 @@ def geo_range_in_perimeter_list(self, perimeters: models.QuerySet, with_country= conditions |= get_department_filter(perimeter) if perimeter.kind == Perimeter.KIND_REGION: conditions |= get_region_filter(perimeter) + if include_country_area: + conditions = Q(geo_range=siae_constants.GEO_RANGE_COUNTRY) | conditions return self.filter(conditions) def within(self, point, distance_km=0): @@ -341,13 +343,19 @@ def filter_with_tender(self, tender): if tender.sectors.count(): qs = qs.filter_sectors(tender.sectors.all()) # filter by perimeters - if tender.is_country_area: + if tender.is_country_area: # for all country qs = qs.with_country_geo_range() else: - if tender.perimeters.count(): - qs = qs.geo_range_in_perimeter_list(tender.perimeters.all(), with_country=True) - if not tender.include_country_area: - qs = qs.exclude_country_geo_range() + if tender.perimeters.count() and tender.include_country_area: # perimeters and all country + qs = qs.geo_range_in_perimeter_list( + tender.perimeters.all(), with_country=False, include_country_area=True + ) + elif tender.perimeters.count(): # only perimeters + qs = qs.geo_range_in_perimeter_list( + tender.perimeters.all(), with_country=True + ).exclude_country_geo_range() + elif tender.include_country_area: + qs = qs.with_country_geo_range() # filter by presta_type if len(tender.presta_type): qs = qs.filter(presta_type__overlap=tender.presta_type) diff --git a/lemarche/www/tenders/tests.py b/lemarche/www/tenders/tests.py index f09436549..24f826e51 100644 --- a/lemarche/www/tenders/tests.py +++ b/lemarche/www/tenders/tests.py @@ -306,6 +306,31 @@ def test_matching_siae_perimeters_custom(self): siae_found_list = Siae.objects.filter_with_tender(tender_2) self.assertEqual(len(siae_found_list), 2 + 1) + def test_matching_siae_country(self): + # add Siae with geo_range_country + siae_country = SiaeFactory(is_active=True, geo_range=siae_constants.GEO_RANGE_COUNTRY) + siae_country_2 = SiaeFactory(is_active=True, geo_range=siae_constants.GEO_RANGE_COUNTRY) + siae_country.sectors.add(self.sectors[0]) + siae_country_2.sectors.add(self.sectors[0]) + # tender perimeter custom with is_country_area = False + tender_1 = TenderFactory(sectors=self.sectors, is_country_area=True) + siae_found_list_1 = Siae.objects.filter_with_tender(tender_1) + self.assertEqual(len(siae_found_list_1), 2) + # tender perimeter custom with include_country_area = True + tender_2 = TenderFactory(sectors=self.sectors, include_country_area=True) + siae_found_list_2 = Siae.objects.filter_with_tender(tender_2) + # we should have the same length of structures + self.assertEqual(len(siae_found_list_1), len(siae_found_list_2)) + # add perimeters + tender_2.perimeters.set(self.perimeters) + siae_found_list_2 = Siae.objects.filter_with_tender(tender_2) + self.assertEqual(len(siae_found_list_2), 2 + 2) + tender_2.is_country_area = True + tender_2.save() + siae_found_list_2 = Siae.objects.filter_with_tender(tender_2) + # we should have only siaes with country geo range + self.assertEqual(len(siae_found_list_2), 2 + 0) + def test_matching_siae_perimeters_custom_2(self): # add Siae with geo_range_department (75) siae_department = SiaeFactory(is_active=True, department="75", geo_range=siae_constants.GEO_RANGE_DEPARTMENT)