diff --git a/dora/services/search.py b/dora/services/search.py index 14a7cb05..04a9fd04 100644 --- a/dora/services/search.py +++ b/dora/services/search.py @@ -15,6 +15,7 @@ from dora import data_inclusion from dora.admin_express.models import City from dora.core.constants import WGS84 +from dora.structures.models import Structure from .serializers import SearchResultSerializer from .utils import filter_services_by_city_code @@ -234,6 +235,11 @@ def _get_dora_results( ) ) + # Par souci de qualité des données, + # les services DORA rattachés à une structure orpheline + # sont filtrés lors de la recherche. + services = services.exclude(structure__in=Structure.objects.orphans()) + if kinds: services = services.filter(kinds__value__in=kinds) diff --git a/dora/services/tests/test_search.py b/dora/services/tests/test_search.py new file mode 100644 index 00000000..05e105a1 --- /dev/null +++ b/dora/services/tests/test_search.py @@ -0,0 +1,51 @@ +import pytest +from model_bakery import baker + +from dora.admin_express.models import AdminDivisionType +from dora.core.test_utils import make_service, make_structure, make_user +from dora.services.enums import ServiceStatus + + +@pytest.fixture +def service(): + # service devant sortir lors d'une recherche globale + service = make_service( + status=ServiceStatus.PUBLISHED, + diffusion_zone_type=AdminDivisionType.COUNTRY, + ) + return service + + +@pytest.fixture +def structure_with_user(): + return make_structure(user=make_user()) + + +def test_search_services_with_orphan_structure( + api_client, service, structure_with_user +): + # les services rattachés à une structure orpheline + # doivent être filtrés lors de la recherche + + # le paramètre `city` est nécessaire a minima + city = baker.make("City") + response = api_client.get(f"/search/?city={city.code}") + + assert response.status_code == 200 + assert not response.data[ + "services" + ], "aucun service ne devrait être trouvé (structure orpheline)" + + # on ajoute une structure au service + service.structure = structure_with_user + service.save() + response = api_client.get(f"/search/?city={city.code}") + + assert response.status_code == 200 + assert response.data[ + "services" + ], "un service ne devrait être trouvé (structure avec utilisateur)" + + [found] = response.data["services"] + + assert found["slug"] == service.slug diff --git a/dora/structures/models.py b/dora/structures/models.py index 9426e0e2..b388c7ce 100644 --- a/dora/structures/models.py +++ b/dora/structures/models.py @@ -175,6 +175,8 @@ def create_from_establishment( return structure def orphans(self): + # structures "orphelines" : + # pas de membres enregistrés, ni en attente d'enregistrement return self.filter(membership=None, putative_membership=None)