diff --git a/src/openklant/components/klantinteracties/api/filterset/actoren.py b/src/openklant/components/klantinteracties/api/filterset/actoren.py index 4f4b634a..b866be10 100644 --- a/src/openklant/components/klantinteracties/api/filterset/actoren.py +++ b/src/openklant/components/klantinteracties/api/filterset/actoren.py @@ -8,7 +8,7 @@ class ActorenFilterSet(FilterSet): naam = filters.CharFilter( lookup_expr="icontains", - help_text=_("Zoek klantcontacten met specifieke tekst in inhoud"), + help_text=_("Zoek klantcontacten met specifieke tekst in inhoud."), ) class Meta: diff --git a/src/openklant/components/klantinteracties/api/filterset/digitaal_adres.py b/src/openklant/components/klantinteracties/api/filterset/digitaal_adres.py new file mode 100644 index 00000000..3546765e --- /dev/null +++ b/src/openklant/components/klantinteracties/api/filterset/digitaal_adres.py @@ -0,0 +1,87 @@ +import uuid + +from django.utils.translation import gettext_lazy as _ + +from django_filters.rest_framework import FilterSet, filters + +from openklant.components.klantinteracties.models.digitaal_adres import DigitaalAdres + + +class DigitaalAdresFilterSet(FilterSet): + verstrekt_door_betrokkene__uuid = filters.UUIDFilter( + help_text=_( + "Zoek digitaal adres(sen) object(s) op basis van de betrokkene uuid." + ), + field_name="betrokkene__uuid", + ) + verstrekt_door_betrokkene__url = filters.CharFilter( + help_text=_( + "Zoek digitaal adres(sen) object(s) op basis van de betrokkene url." + ), + method="filter_betrokkene_url", + ) + verstrekt_door_betrokkene__rol = filters.ChoiceFilter( + help_text=_( + "Zoek digitaal adres(sen) object(s) op basis van de betrokkene rol." + ), + field_name="betrokkene__rol", + ) + verstrekt_door_partij__uuid = filters.UUIDFilter( + help_text=_("Zoek digitaal adres(sen) object(s) op basis van de partij uuid."), + field_name="betrokkene__uuid", + ) + verstrekt_door_partij__url = filters.CharFilter( + help_text=_("Zoek digitaal adres(sen) object(s) op basis van de partij url."), + method="filter_partij_url", + ) + verstrekt_door_partij__soort_partij = filters.ChoiceFilter( + help_text=_("Zoek digitaal adres(sen) object(s) op basis van de partij soort."), + field_name="partij__soort_partij", + ) + adres = filters.CharFilter( + lookup_expr="exact", + help_text=_( + "Zoek digitaal adres(sen) object(s) op basis van adres die de exacte waarden bevat." + ), + ) + adres__icontains = filters.CharFilter( + lookup_expr="icontains", + help_text=_( + "Zoek digitaal adres(sen) object(s) op basis van adres die de opgegeven waarden bevat." + ), + ) + omschrijving = filters.CharFilter( + lookup_expr="icontains", + help_text=_( + "Zoek digitaal adres(sen) object(s) op basis van omschijving die de opgegeven waarden bevat." + ), + ) + + class Meta: + model = DigitaalAdres + fields = ( + "verstrekt_door_betrokkene__uuid", + "verstrekt_door_betrokkene__url", + "verstrekt_door_betrokkene__rol", + "verstrekt_door_partij__uuid", + "verstrekt_door_partij__url", + "verstrekt_door_partij__soort_partij", + "adres", + "adres__icontains", + "soort_digitaal_adres", + "omschrijving", + ) + + def filter_betrokkene_url(self, queryset, name, value): + try: + url_uuid = uuid.UUID(value.split("/")[-1]) + return queryset.filter(betrokkene__uuid=url_uuid) + except ValueError: + return queryset.none() + + def filter_partij_url(self, queryset, name, value): + try: + url_uuid = uuid.UUID(value.split("/")[-1]) + return queryset.filter(partij__uuid=url_uuid) + except ValueError: + return queryset.none() diff --git a/src/openklant/components/klantinteracties/api/filterset/internetaken.py b/src/openklant/components/klantinteracties/api/filterset/internetaken.py index 49239120..ea3685e6 100644 --- a/src/openklant/components/klantinteracties/api/filterset/internetaken.py +++ b/src/openklant/components/klantinteracties/api/filterset/internetaken.py @@ -9,22 +9,22 @@ class InternetaakFilterSet(FilterSet): toegewezen_aan_actor__uuid = filters.UUIDFilter( - help_text=_("Zoek internetaak object op basis van het toegewezen actor uuid"), + help_text=_("Zoek internetaak object op basis van het toegewezen actor uuid."), field_name="actor__uuid", ) toegewezen_aan_actor__url = filters.CharFilter( - help_text=_("Zoek internetaak object op basis van het toegewezen actor url"), + help_text=_("Zoek internetaak object op basis van het toegewezen actor url."), method="filter_toegewezen_aan_actor_url", ) aanleidinggevend_klantcontact__uuid = filters.UUIDFilter( help_text=_( - "Zoek internetaak object op basis van het aanleidingevende klantcontact uuid" + "Zoek internetaak object op basis van het aanleidingevende klantcontact uuid." ), field_name="klantcontact__uuid", ) aanleidinggevend_klantcontact__url = filters.CharFilter( help_text=_( - "Zoek internetaak object op basis van het aanleidingevende klantcontact url" + "Zoek internetaak object op basis van het aanleidingevende klantcontact url." ), method="filter_aanleidinggevend_klantcontact_url", ) diff --git a/src/openklant/components/klantinteracties/api/filterset/klantcontacten.py b/src/openklant/components/klantinteracties/api/filterset/klantcontacten.py index 9f70a0ca..7bdae8ec 100644 --- a/src/openklant/components/klantinteracties/api/filterset/klantcontacten.py +++ b/src/openklant/components/klantinteracties/api/filterset/klantcontacten.py @@ -21,30 +21,30 @@ class KlantcontactDetailFilterSet(FilterSet): class KlantcontactFilterSet(FilterSet): had_betrokkene__url = filters.CharFilter( - help_text=_("Zoek klantcontact object op basis van het betrokkene url"), + help_text=_("Zoek klantcontact object op basis van het betrokkene url."), method="filter_betrokkene_url", ) had_betrokkene__uuid = filters.UUIDFilter( - help_text=_("Zoek klantcontact object op basis van het betrokkene uuid"), + help_text=_("Zoek klantcontact object op basis van het betrokkene uuid."), field_name="betrokkene__uuid", ) onderwerpobject__url = filters.CharFilter( - help_text=_("Zoek klantcontact object op basis van het onderwerpobject url"), + help_text=_("Zoek klantcontact object op basis van het onderwerpobject url."), method="filter_onderwerpobject_url", ) was_onderwerpobject__url = filters.CharFilter( help_text=_( - "Zoek was klantcontact object op basis van het onderwerpobject url" + "Zoek was klantcontact object op basis van het onderwerpobject url." ), method="filter_was_onderwerpobject_url", ) inhoud = filters.CharFilter( lookup_expr="icontains", - help_text=_("Zoek klantcontacten met specifieke tekst in inhoud"), + help_text=_("Zoek klantcontacten met specifieke tekst in inhoud."), ) onderwerp = filters.CharFilter( lookup_expr="icontains", - help_text=_("Zoek klantcontacten met specifieke tekst in onderwerp"), + help_text=_("Zoek klantcontacten met specifieke tekst in onderwerp."), ) expand = ExpandFilter(serializer_class=KlantcontactSerializer) diff --git a/src/openklant/components/klantinteracties/api/filterset/partijen.py b/src/openklant/components/klantinteracties/api/filterset/partijen.py index 72e123a4..e78e8ff6 100644 --- a/src/openklant/components/klantinteracties/api/filterset/partijen.py +++ b/src/openklant/components/klantinteracties/api/filterset/partijen.py @@ -22,35 +22,37 @@ class PartijDetailFilterSet(FilterSet): class PartijFilterSet(FilterSet): vertegenwoordigde_partij__uuid = filters.UUIDFilter( help_text=_( - "Zoek partij object op basis van het vertegenwoordigde partij uuid" + "Zoek partij object op basis van het vertegenwoordigde partij uuid." ), field_name="vertegenwoordigde__vertegenwoordigende_partij__uuid", ) vertegenwoordigde_partij__url = filters.CharFilter( - help_text=_("Zoek partij object op basis van het vertegenwoordigde partij url"), + help_text=_( + "Zoek partij object op basis van het vertegenwoordigde partij url." + ), method="filter_vertegenwoordigde_partij_url", ) partij_identificator__code_objecttype = filters.CharFilter( help_text=_( - "Zoek partij object op basis van het partij identificator objecttype" + "Zoek partij object op basis van het partij identificator objecttype." ), method="filter_identificator_code_objecttype", ) partij_identificator__code_soort_object_id = filters.CharFilter( help_text=_( - "Zoek partij object op basis van het partij identificator soort object ID" + "Zoek partij object op basis van het partij identificator soort object ID." ), method="filter_identificator_code_soort_object_id", ) partij_identificator__object_id = filters.CharFilter( help_text=_( - "Zoek partij object op basis van het partij identificator object ID" + "Zoek partij object op basis van het partij identificator object ID." ), method="filter_identificator_object_id", ) partij_identificator__code_register = filters.CharFilter( help_text=_( - "Zoek partij object op basis van het partij identificator register" + "Zoek partij object op basis van het partij identificator register." ), method="filter_identificator_code_register", ) @@ -142,13 +144,13 @@ def filter_categorierelatie_categorie_naam(self, queryset, name, value): class VertegenwoordigdenFilterSet(FilterSet): vertegenwoordigende_partij__url = filters.CharFilter( help_text=_( - "Zoek Vertegenwoordigden object op basis van het vertegenwoordigende partij url" + "Zoek Vertegenwoordigden object op basis van het vertegenwoordigende partij url." ), method="filter_vertegenwoordigende_partij_url", ) vertegenwoordigde_partij__url = filters.CharFilter( help_text=_( - "Zoek Vertegenwoordigden object op basis van het vertegenwoordigde partij url" + "Zoek Vertegenwoordigden object op basis van het vertegenwoordigde partij url." ), method="filter_vertegenwoordigde_partij_url", ) @@ -179,15 +181,15 @@ def filter_vertegenwoordigde_partij_url(self, queryset, name, value): class CategorieRelatieFilterSet(FilterSet): partij__url = filters.CharFilter( - help_text=_("Zoek categorie relatie object op basis van de partij url"), + help_text=_("Zoek categorie relatie object op basis van de partij url."), method="filter_partij_url", ) partij__uuid = filters.CharFilter( - help_text=_("Zoek categorie relatie object op basis van de partij uuid"), + help_text=_("Zoek categorie relatie object op basis van de partij uuid."), method="filter_partij_uuid", ) partij__nummer = filters.CharFilter( - help_text=_("Zoek categorie relatie object op basis van het partij nummer"), + help_text=_("Zoek categorie relatie object op basis van het partij nummer."), method="filter_partij_nummer", ) categorie__naam = filters.CharFilter( diff --git a/src/openklant/components/klantinteracties/api/tests/test_filters.py b/src/openklant/components/klantinteracties/api/tests/test_filters.py index b0a0c5ba..f98cd229 100644 --- a/src/openklant/components/klantinteracties/api/tests/test_filters.py +++ b/src/openklant/components/klantinteracties/api/tests/test_filters.py @@ -1174,3 +1174,106 @@ def test_filter_aanleidinggevend_klantcontact_url(self): self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.json()["count"], 0) + + +class DigitaalAdresFilterSetTests(APITestCase): + url = reverse("klantinteracties:digitaaladres-list") + + def setUp(self): + super().setUp() + ( + self.betrokkene, + self.betrokkene2, + self.betrokkene3, + self.betrokkene4, + self.betrokkene5, + ) = BetrokkeneFactory.create_batch(5) + ( + self.partij, + self.partij2, + self.partij3, + self.partij4, + self.partij5, + ) = PartijFactory.create_batch(5) + self.digitaal_adres = DigitaalAdresFactory.create( + partij=self.partij, betrokkene=self.betrokkene + ) + self.digitaal_adres2 = DigitaalAdresFactory.create( + partij=self.partij2, betrokkene=self.betrokkene2 + ) + self.digitaal_adres3 = DigitaalAdresFactory.create( + partij=self.partij3, betrokkene=self.betrokkene3 + ) + self.digitaal_adres4 = DigitaalAdresFactory.create( + partij=self.partij4, betrokkene=self.betrokkene4 + ) + self.digitaal_adres5 = DigitaalAdresFactory.create( + partij=self.partij5, betrokkene=self.betrokkene5 + ) + + def test_filter_verstrekt_door_betrokkene_url(self): + betrokkene_url = f"http://testserver/klantinteracties/api/v1/betrokkenen/{str(self.betrokkene5.uuid)}" + response = self.client.get( + self.url, + {"verstrektDoorBetrokkene__url": betrokkene_url}, + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + data = response.json()["results"] + + self.assertEqual(1, len(data)) + self.assertEqual(str(self.digitaal_adres5.uuid), data[0]["uuid"]) + + with self.subTest("no_matches_found_return_nothing"): + betrokkene_url = ( + f"http://testserver/klantinteracties/api/v1/betrokkenen/{str(uuid4())}" + ) + response = self.client.get( + self.url, + {"verstrektDoorBetrokkene__url": betrokkene_url}, + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + self.assertEqual(response.json()["count"], 0) + + with self.subTest("invalid_value_returns_empty_query"): + response = self.client.get( + self.url, {"verstrektDoorBetrokkene__url": "ValueError"} + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + self.assertEqual(response.json()["count"], 0) + + def test_filter_verstrekt_door_partij_url(self): + partij_url = f"http://testserver/klantinteracties/api/v1/partijen/{str(self.partij5.uuid)}" + response = self.client.get( + self.url, + {"verstrektDoorPartij__url": partij_url}, + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + data = response.json()["results"] + + self.assertEqual(1, len(data)) + self.assertEqual(str(self.digitaal_adres5.uuid), data[0]["uuid"]) + + with self.subTest("no_matches_found_return_nothing"): + response = self.client.get( + self.url, + { + "verstrektDoorPartij__url": f"http://testserver/klantinteracties/api/v1/partijen/{str(uuid4())}" + }, + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + self.assertEqual(response.json()["count"], 0) + + with self.subTest("invalid_value_returns_empty_query"): + response = self.client.get( + self.url, {"verstrektDoorPartij__url": "ValueError"} + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + + self.assertEqual(response.json()["count"], 0) diff --git a/src/openklant/components/klantinteracties/api/viewsets/digitaal_adres.py b/src/openklant/components/klantinteracties/api/viewsets/digitaal_adres.py index 0a03303f..77a47d6f 100644 --- a/src/openklant/components/klantinteracties/api/viewsets/digitaal_adres.py +++ b/src/openklant/components/klantinteracties/api/viewsets/digitaal_adres.py @@ -2,6 +2,9 @@ from rest_framework import viewsets from rest_framework.pagination import PageNumberPagination +from openklant.components.klantinteracties.api.filterset.digitaal_adres import ( + DigitaalAdresFilterSet, +) from openklant.components.klantinteracties.api.serializers.digitaal_adres import ( DigitaalAdresSerializer, ) @@ -50,5 +53,6 @@ class DigitaalAdresViewSet(viewsets.ModelViewSet): serializer_class = DigitaalAdresSerializer lookup_field = "uuid" pagination_class = PageNumberPagination + filterset_class = DigitaalAdresFilterSet authentication_classes = (TokenAuthentication,) permission_classes = (TokenPermissions,) diff --git a/src/openklant/components/klantinteracties/openapi.yaml b/src/openklant/components/klantinteracties/openapi.yaml index 56e6055b..ffe949ad 100644 --- a/src/openklant/components/klantinteracties/openapi.yaml +++ b/src/openklant/components/klantinteracties/openapi.yaml @@ -42,7 +42,7 @@ paths: name: naam schema: type: string - description: Zoek klantcontacten met specifieke tekst in inhoud + description: Zoek klantcontacten met specifieke tekst in inhoud. - name: page required: false in: query @@ -771,17 +771,17 @@ paths: name: partij__nummer schema: type: string - description: Zoek categorie relatie object op basis van het partij nummer + description: Zoek categorie relatie object op basis van het partij nummer. - in: query name: partij__url schema: type: string - description: Zoek categorie relatie object op basis van de partij url + description: Zoek categorie relatie object op basis van de partij url. - in: query name: partij__uuid schema: type: string - description: Zoek categorie relatie object op basis van de partij uuid + description: Zoek categorie relatie object op basis van de partij uuid. tags: - categorie relaties security: @@ -1065,12 +1065,76 @@ paths: description: Alle digitale adressen opvragen. summary: Alle digitale adressen opvragen. parameters: + - in: query + name: adres + schema: + type: string + description: Zoek digitaal adres(sen) object(s) op basis van adres die de + exacte waarden bevat. + - in: query + name: adres__icontains + schema: + type: string + description: Zoek digitaal adres(sen) object(s) op basis van adres die de + opgegeven waarden bevat. + - in: query + name: omschrijving + schema: + type: string + description: Zoek digitaal adres(sen) object(s) op basis van omschijving die + de opgegeven waarden bevat. - name: page required: false in: query description: Een pagina binnen de gepagineerde set resultaten. schema: type: integer + - in: query + name: soortDigitaalAdres + schema: + type: string + - in: query + name: verstrektDoorBetrokkene__rol + schema: + type: string + enum: + - klant + - vertegenwoordiger + description: Zoek digitaal adres(sen) object(s) op basis van de betrokkene + rol. + - in: query + name: verstrektDoorBetrokkene__url + schema: + type: string + description: Zoek digitaal adres(sen) object(s) op basis van de betrokkene + url. + - in: query + name: verstrektDoorBetrokkene__uuid + schema: + type: string + format: uuid + description: Zoek digitaal adres(sen) object(s) op basis van de betrokkene + uuid. + - in: query + name: verstrektDoorPartij__soortPartij + schema: + type: string + enum: + - contactpersoon + - organisatie + - persoon + description: Zoek digitaal adres(sen) object(s) op basis van de partij soort. + - in: query + name: verstrektDoorPartij__url + schema: + type: string + description: Zoek digitaal adres(sen) object(s) op basis van de partij url. + - in: query + name: verstrektDoorPartij__uuid + schema: + type: string + format: uuid + description: Zoek digitaal adres(sen) object(s) op basis van de partij uuid. tags: - digitale adressen security: @@ -1214,14 +1278,14 @@ paths: schema: type: string description: Zoek internetaak object op basis van het aanleidingevende klantcontact - url + url. - in: query name: aanleidinggevendKlantcontact__uuid schema: type: string format: uuid description: Zoek internetaak object op basis van het aanleidingevende klantcontact - uuid + uuid. - in: query name: actor__naam schema: @@ -1259,13 +1323,13 @@ paths: name: toegewezenAanActor__url schema: type: string - description: Zoek internetaak object op basis van het toegewezen actor url + description: Zoek internetaak object op basis van het toegewezen actor url. - in: query name: toegewezenAanActor__uuid schema: type: string format: uuid - description: Zoek internetaak object op basis van het toegewezen actor uuid + description: Zoek internetaak object op basis van het toegewezen actor uuid. - in: query name: toegewezenOp schema: @@ -1431,13 +1495,13 @@ paths: name: hadBetrokkene__url schema: type: string - description: Zoek klantcontact object op basis van het betrokkene url + description: Zoek klantcontact object op basis van het betrokkene url. - in: query name: hadBetrokkene__uuid schema: type: string format: uuid - description: Zoek klantcontact object op basis van het betrokkene uuid + description: Zoek klantcontact object op basis van het betrokkene uuid. - in: query name: indicatieContactGelukt schema: @@ -1446,7 +1510,7 @@ paths: name: inhoud schema: type: string - description: Zoek klantcontacten met specifieke tekst in inhoud + description: Zoek klantcontacten met specifieke tekst in inhoud. - in: query name: kanaal schema: @@ -1459,7 +1523,7 @@ paths: name: onderwerp schema: type: string - description: Zoek klantcontacten met specifieke tekst in onderwerp + description: Zoek klantcontacten met specifieke tekst in onderwerp. - in: query name: onderwerpobject__onderwerpobjectidentificatorCodeObjecttype schema: @@ -1480,7 +1544,7 @@ paths: name: onderwerpobject__url schema: type: string - description: Zoek klantcontact object op basis van het onderwerpobject url + description: Zoek klantcontact object op basis van het onderwerpobject url. - in: query name: onderwerpobject__uuid schema: @@ -1522,7 +1586,7 @@ paths: schema: type: string description: Zoek was klantcontact object op basis van het onderwerpobject - url + url. - in: query name: wasOnderwerpobject__uuid schema: @@ -2095,24 +2159,24 @@ paths: name: partijIdentificator__codeObjecttype schema: type: string - description: Zoek partij object op basis van het partij identificator objecttype + description: Zoek partij object op basis van het partij identificator objecttype. - in: query name: partijIdentificator__codeRegister schema: type: string - description: Zoek partij object op basis van het partij identificator register + description: Zoek partij object op basis van het partij identificator register. - in: query name: partijIdentificator__codeSoortObjectId schema: type: string description: Zoek partij object op basis van het partij identificator soort - object ID + object ID. - in: query name: partijIdentificator__objectId schema: type: string description: Zoek partij object op basis van het partij identificator object - ID + ID. - in: query name: soortPartij schema: @@ -2129,14 +2193,14 @@ paths: schema: type: string description: Zoek partij object op basis van het vertegenwoordigde partij - url + url. - in: query name: vertegenwoordigdePartij__uuid schema: type: string format: uuid description: Zoek partij object op basis van het vertegenwoordigde partij - uuid + uuid. tags: - partijen security: @@ -2459,7 +2523,7 @@ paths: schema: type: string description: Zoek Vertegenwoordigden object op basis van het vertegenwoordigde - partij url + partij url. - in: query name: vertegenwoordigdePartij__uuid schema: @@ -2470,7 +2534,7 @@ paths: schema: type: string description: Zoek Vertegenwoordigden object op basis van het vertegenwoordigende - partij url + partij url. - in: query name: vertegenwoordigendePartij__uuid schema: