diff --git a/sv/managers.py b/sv/managers.py index 810a356..c9c90e9 100644 --- a/sv/managers.py +++ b/sv/managers.py @@ -70,3 +70,6 @@ def optimized_for_details(self): def get_all_not_in_fiche_zone_delimitee(self): return self.filter(zone_infestee__isnull=True, hors_zone_infestee__isnull=True).order_by("numero") + + def with_fiche_zone_delimitee_numero(self): + return self.select_related("hors_zone_infestee__numero", "zone_infestee__fiche_zone_delimitee__numero") diff --git a/sv/models.py b/sv/models.py index 73a1648..df07c32 100644 --- a/sv/models.py +++ b/sv/models.py @@ -556,6 +556,12 @@ def can_user_access(self, user): def is_linked_to_fiche_zone_delimitee(self): return self.hors_zone_infestee is not None or self.zone_infestee is not None + def get_fiche_zone_delimitee(self) -> "FicheZoneDelimitee": + if self.hors_zone_infestee: + return self.hors_zone_infestee + if self.zone_infestee and self.zone_infestee.fiche_zone_delimitee: + return self.zone_infestee.fiche_zone_delimitee + class ZoneInfestee(models.Model): class UnitesSurfaceInfesteeTotale(TextChoices): diff --git a/sv/templates/sv/fichedetection_detail.html b/sv/templates/sv/fichedetection_detail.html index 36534c0..3622e6c 100644 --- a/sv/templates/sv/fichedetection_detail.html +++ b/sv/templates/sv/fichedetection_detail.html @@ -23,6 +23,9 @@
Déclaré AC
{% endif %} + {% if fiche_zone_delimitee %} + zone {{ fiche_zone_delimitee.numero }} + {% endif %}diff --git a/sv/tests/test_fichedetection_detail.py b/sv/tests/test_fichedetection_detail.py index 1705ea7..39c0c18 100644 --- a/sv/tests/test_fichedetection_detail.py +++ b/sv/tests/test_fichedetection_detail.py @@ -1,4 +1,4 @@ -from sv.models import Lieu, Prelevement +from sv.models import Lieu, Prelevement, FicheZoneDelimitee, ZoneInfestee from model_bakery import baker from playwright.sync_api import expect @@ -157,3 +157,26 @@ def test_prelevement_officiel_details(live_server, page, fiche_detection): expect(page.get_by_test_id("prelevement-1-laboratoire-confirmation-officielle")).to_contain_text( prelevement.laboratoire_confirmation_officielle.nom ) + + +def test_have_link_to_fiche_zone_delimitee_if_hors_zone_infestee(live_server, page, fiche_detection): + "Si une fiche détection est liée à une hors zone infestée d'une fiche zone délimitée, un lien vers cette fiche zone délimitée doit être présent" + fiche_zone_delimitee = baker.make(FicheZoneDelimitee) + fiche_detection.hors_zone_infestee = fiche_zone_delimitee + fiche_detection.save() + page.goto(f"{live_server.url}{fiche_detection.get_absolute_url()}") + link = page.get_by_role("link", name=f"zone {fiche_zone_delimitee.numero}") + expect(link).to_be_visible() + expect(link).to_have_attribute("href", fiche_zone_delimitee.get_absolute_url()) + + +def test_have_link_to_fiche_zone_delimitee_if_zone_infestee(live_server, page, fiche_detection): + "Si une fiche détection est liée à une zone infestée d'une fiche zone délimitée, un lien vers cette fiche zone délimitée doit être présent" + fiche_zone_delimitee = baker.make(FicheZoneDelimitee) + zone_infestee = baker.make(ZoneInfestee, fiche_zone_delimitee=fiche_zone_delimitee) + fiche_detection.zone_infestee = zone_infestee + fiche_detection.save() + page.goto(f"{live_server.url}{fiche_detection.get_absolute_url()}") + link = page.get_by_role("link", name=f"zone {fiche_zone_delimitee.numero}") + expect(link).to_be_visible() + expect(link).to_have_attribute("href", fiche_zone_delimitee.get_absolute_url()) diff --git a/sv/views.py b/sv/views.py index 7e9acc2..f6ce7af 100644 --- a/sv/views.py +++ b/sv/views.py @@ -89,7 +89,7 @@ class FicheDetectionDetailView( DetailView, ): model = FicheDetection - queryset = FicheDetection.objects.all().optimized_for_details() + queryset = FicheDetection.objects.all().optimized_for_details().with_fiche_zone_delimitee_numero() def get_object(self, queryset=None): if hasattr(self, "object"): @@ -130,6 +130,7 @@ def get_context_data(self, **kwargs): context["can_update_visibilite"] = self.get_object().can_update_visibilite(self.request.user) context["visibilite_form"] = FicheDetectionVisibiliteUpdateForm(obj=self.get_object()) context["rattachement_detection_form"] = RattachementDetectionForm() + context["fiche_zone_delimitee"] = self.get_object().get_fiche_zone_delimitee() return context def test_func(self) -> bool | None: