Skip to content

Commit f662eb5

Browse files
committed
✨ [#69] added filter set to categorierelaties endpoint
1 parent e4f6a46 commit f662eb5

File tree

6 files changed

+320
-6
lines changed

6 files changed

+320
-6
lines changed

src/openklant/components/klantinteracties/api/filterset/partijen.py

+84-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
from openklant.components.klantinteracties.api.serializers.partijen import (
88
PartijSerializer,
99
)
10-
from openklant.components.klantinteracties.models.partijen import Partij
10+
from openklant.components.klantinteracties.models.partijen import (
11+
CategorieRelatie,
12+
Partij,
13+
)
1114
from openklant.components.utils.filters import ExpandFilter
1215

1316

@@ -138,3 +141,83 @@ def filter_identificator_register(self, queryset, name, value):
138141
)
139142
except ValueError:
140143
return queryset.none()
144+
145+
146+
class CategorieRelatieFilterSet(FilterSet):
147+
partij__url = filters.CharFilter(
148+
help_text=_("Zoek categorie relatie object op basis van de partij url"),
149+
method="filter_partij_url",
150+
)
151+
partij__uuid = filters.CharFilter(
152+
help_text=_("Zoek categorie relatie object op basis van de partij uuid"),
153+
method="filter_partij_uuid",
154+
)
155+
partij__nummer = filters.CharFilter(
156+
help_text=_("Zoek categorie relatie object op basis van het partij nummer"),
157+
method="filter_partij_nummer",
158+
)
159+
categorie__naam = filters.CharFilter(
160+
help_text=_("Zoek categorie relatie object op basis van de categorie naam."),
161+
method="filter_categorie_naam",
162+
)
163+
categorie__uuid = filters.CharFilter(
164+
help_text=_("Zoek categorie relatie object op basis van de categorie uuid."),
165+
method="filter_categorie_uuid",
166+
)
167+
categorie__url = filters.CharFilter(
168+
help_text=_("Zoek categorie relatie object op basis van de categorie url."),
169+
method="filter_categorie_url",
170+
)
171+
172+
class Meta:
173+
model = CategorieRelatie
174+
fields = (
175+
"partij__url",
176+
"partij__uuid",
177+
"partij__nummer",
178+
"categorie__url",
179+
"categorie__uuid",
180+
"categorie__naam",
181+
"begin_datum",
182+
"eind_datum",
183+
)
184+
185+
def filter_partij_uuid(self, queryset, name, value):
186+
try:
187+
partij_uuid = uuid.UUID(value)
188+
return queryset.filter(partij__uuid=partij_uuid)
189+
except ValueError:
190+
return queryset.none()
191+
192+
def filter_partij_url(self, queryset, name, value):
193+
try:
194+
url_uuid = uuid.UUID(value.split("/")[-1])
195+
return queryset.filter(partij__uuid=url_uuid)
196+
except ValueError:
197+
return queryset.none()
198+
199+
def filter_partij_nummer(self, queryset, name, value):
200+
try:
201+
return queryset.filter(partij__nummer=value)
202+
except ValueError:
203+
return queryset.none()
204+
205+
def filter_categorie_uuid(self, queryset, name, value):
206+
try:
207+
categorie_uuid = uuid.UUID(value)
208+
return queryset.filter(categorie__uuid=categorie_uuid)
209+
except ValueError:
210+
return queryset.none()
211+
212+
def filter_categorie_url(self, queryset, name, value):
213+
try:
214+
url_uuid = uuid.UUID(value.split("/")[-1])
215+
return queryset.filter(categorie__uuid=url_uuid)
216+
except ValueError:
217+
return queryset.none()
218+
219+
def filter_categorie_naam(self, queryset, name, value):
220+
try:
221+
return queryset.filter(categorie__naam=value)
222+
except ValueError:
223+
return queryset.none()

src/openklant/components/klantinteracties/api/serializers/partijen.py

+9-4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
)
2222
from openklant.components.klantinteracties.api.validators import (
2323
categorie_exists,
24+
categorie_relatie_exists,
2425
partij_exists,
2526
partij_identificator_exists,
2627
partij_is_organisatie,
@@ -92,16 +93,18 @@ class CategorieRelatieForeignKeySerializer(serializers.HyperlinkedModelSerialize
9293
)
9394

9495
class Meta:
95-
model = Categorie
96+
model = CategorieRelatie
9697
fields = (
9798
"uuid",
9899
"url",
99100
"categorie_naam",
101+
"begin_datum",
102+
"eind_datum",
100103
)
101104
extra_kwargs = {
102-
"uuid": {"required": True, "validators": [categorie_exists]},
105+
"uuid": {"required": True, "validators": [categorie_relatie_exists]},
103106
"url": {
104-
"view_name": "klantinteracties:categorie-detail",
107+
"view_name": "klantinteracties:categorierelatie-detail",
105108
"lookup_field": "uuid",
106109
"help_text": _("De unieke URL van deze categorie binnen deze API."),
107110
},
@@ -193,7 +196,9 @@ class CategorieRelatieSerializer(serializers.HyperlinkedModelSerializer):
193196
categorie = CategorieForeignKeySerializer(
194197
required=True,
195198
allow_null=True,
196-
help_text=_("De categorie waar de categorie relatie aan gelinkt is."),
199+
help_text=_(
200+
"De categorie waar de categorie relatie aan gelinkt is: Let op: Dit attribuut is EXPERIMENTEEL."
201+
),
197202
)
198203
begin_datum = serializers.DateField(
199204
allow_null=True,

src/openklant/components/klantinteracties/api/tests/test_filters.py

+194
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
KlantcontactFactory,
1212
)
1313
from openklant.components.klantinteracties.models.tests.factories.partijen import (
14+
CategorieFactory,
15+
CategorieRelatieFactory,
1416
PartijFactory,
1517
PartijIdentificatorFactory,
1618
)
@@ -568,3 +570,195 @@ def test_filter_identificator_register(self):
568570
self.assertEqual(response.status_code, status.HTTP_200_OK)
569571

570572
self.assertEqual(response.json()["count"], 0)
573+
574+
575+
class TestCategorieRelatieFilterset(APITestCase):
576+
url = reverse("klantinteracties:categorierelatie-list")
577+
578+
def setUp(self):
579+
super().setUp()
580+
self.partij = PartijFactory.create(nummer="1111111111")
581+
self.partij2 = PartijFactory.create(nummer="2222222222")
582+
self.partij3 = PartijFactory.create(nummer="3333333333")
583+
self.partij4 = PartijFactory.create(nummer="4444444444")
584+
self.partij5 = PartijFactory.create(nummer="5555555555")
585+
586+
self.categorie = CategorieFactory.create(naam="een")
587+
self.categorie2 = CategorieFactory.create(naam="twee")
588+
self.categorie3 = CategorieFactory.create(naam="drie")
589+
self.categorie4 = CategorieFactory.create(naam="vier")
590+
self.categorie5 = CategorieFactory.create(naam="vijf")
591+
592+
self.categorie_relatie = CategorieRelatieFactory.create(
593+
partij=self.partij, categorie=self.categorie
594+
)
595+
self.categorie_relatie2 = CategorieRelatieFactory.create(
596+
partij=self.partij2, categorie=self.categorie2
597+
)
598+
self.categorie_relatie3 = CategorieRelatieFactory.create(
599+
partij=self.partij3, categorie=self.categorie3
600+
)
601+
self.categorie_relatie4 = CategorieRelatieFactory.create(
602+
partij=self.partij4, categorie=self.categorie4
603+
)
604+
self.categorie_relatie5 = CategorieRelatieFactory.create(
605+
partij=self.partij5, categorie=self.categorie5
606+
)
607+
608+
def test_filter_partij_url(self):
609+
partij_url = f"http://testserver/klantinteracties/api/v1/partijen/{str(self.partij5.uuid)}"
610+
response = self.client.get(
611+
self.url,
612+
{"partij__url": partij_url},
613+
content_type="application/json",
614+
)
615+
self.assertEqual(response.status_code, status.HTTP_200_OK)
616+
617+
data = response.json()["results"]
618+
619+
self.assertEqual(1, len(data))
620+
self.assertEqual(str(self.categorie_relatie5.uuid), data[0]["uuid"])
621+
622+
with self.subTest("no_matches_found_return_nothing"):
623+
response = self.client.get(
624+
self.url,
625+
{
626+
"partij__url": f"http://testserver/klantinteracties/api/v1/partijen/{str(uuid4())}"
627+
},
628+
)
629+
self.assertEqual(response.status_code, status.HTTP_200_OK)
630+
631+
self.assertEqual(response.json()["count"], 0)
632+
633+
with self.subTest("invalid_value_returns_empty_query"):
634+
response = self.client.get(self.url, {"partij__url": "ValueError"})
635+
self.assertEqual(response.status_code, status.HTTP_200_OK)
636+
637+
self.assertEqual(response.json()["count"], 0)
638+
639+
def test_filter_partij_uuid(self):
640+
response = self.client.get(
641+
self.url,
642+
{"partij__uuid": str(self.partij5.uuid)},
643+
)
644+
self.assertEqual(response.status_code, status.HTTP_200_OK)
645+
646+
data = response.json()["results"]
647+
648+
self.assertEqual(1, len(data))
649+
self.assertEqual(str(self.categorie_relatie5.uuid), data[0]["uuid"])
650+
651+
with self.subTest("no_matches_found_return_nothing"):
652+
response = self.client.get(
653+
self.url,
654+
{"partij__uuid": str(uuid4())},
655+
)
656+
self.assertEqual(response.status_code, status.HTTP_200_OK)
657+
658+
self.assertEqual(response.json()["count"], 0)
659+
660+
with self.subTest("invalid_value_returns_empty_query"):
661+
response = self.client.get(self.url, {"partij__uuid": "ValueError"})
662+
self.assertEqual(response.status_code, status.HTTP_200_OK)
663+
664+
self.assertEqual(response.json()["count"], 0)
665+
666+
def test_filter_partij_nummer(self):
667+
response = self.client.get(
668+
self.url,
669+
{"partij__nummer": "5555555555"},
670+
)
671+
self.assertEqual(response.status_code, status.HTTP_200_OK)
672+
673+
data = response.json()["results"]
674+
675+
self.assertEqual(1, len(data))
676+
self.assertEqual(str(self.categorie_relatie5.uuid), data[0]["uuid"])
677+
678+
with self.subTest("no_matches_found_return_nothing"):
679+
response = self.client.get(
680+
self.url,
681+
{"partij__nummer": "8584395394"},
682+
)
683+
self.assertEqual(response.status_code, status.HTTP_200_OK)
684+
685+
self.assertEqual(response.json()["count"], 0)
686+
687+
def test_filter_categorie_url(self):
688+
categorie_url = f"http://testserver/klantinteracties/api/v1/categorieen/{str(self.categorie5.uuid)}"
689+
response = self.client.get(
690+
self.url,
691+
{"categorie__url": categorie_url},
692+
content_type="application/json",
693+
)
694+
self.assertEqual(response.status_code, status.HTTP_200_OK)
695+
696+
data = response.json()["results"]
697+
698+
self.assertEqual(1, len(data))
699+
self.assertEqual(str(self.categorie_relatie5.uuid), data[0]["uuid"])
700+
701+
with self.subTest("no_matches_found_return_nothing"):
702+
response = self.client.get(
703+
self.url,
704+
{
705+
"categorie__url": f"http://testserver/klantinteracties/api/v1/categorieen/{str(uuid4())}"
706+
},
707+
)
708+
self.assertEqual(response.status_code, status.HTTP_200_OK)
709+
710+
self.assertEqual(response.json()["count"], 0)
711+
712+
with self.subTest("invalid_value_returns_empty_query"):
713+
response = self.client.get(self.url, {"categorie__url": "ValueError"})
714+
self.assertEqual(response.status_code, status.HTTP_200_OK)
715+
716+
self.assertEqual(response.json()["count"], 0)
717+
718+
def test_filter_categorie_uuid(self):
719+
response = self.client.get(
720+
self.url,
721+
{"categorie__uuid": str(self.categorie5.uuid)},
722+
)
723+
self.assertEqual(response.status_code, status.HTTP_200_OK)
724+
725+
data = response.json()["results"]
726+
727+
self.assertEqual(1, len(data))
728+
self.assertEqual(str(self.categorie_relatie5.uuid), data[0]["uuid"])
729+
730+
with self.subTest("no_matches_found_return_nothing"):
731+
response = self.client.get(
732+
self.url,
733+
{"categorie__uuid": str(uuid4())},
734+
)
735+
self.assertEqual(response.status_code, status.HTTP_200_OK)
736+
737+
self.assertEqual(response.json()["count"], 0)
738+
739+
with self.subTest("invalid_value_returns_empty_query"):
740+
response = self.client.get(self.url, {"categorie__uuid": "ValueError"})
741+
self.assertEqual(response.status_code, status.HTTP_200_OK)
742+
743+
self.assertEqual(response.json()["count"], 0)
744+
745+
def test_filter_categorie_naam(self):
746+
response = self.client.get(
747+
self.url,
748+
{"categorie__naam": "vijf"},
749+
)
750+
self.assertEqual(response.status_code, status.HTTP_200_OK)
751+
752+
data = response.json()["results"]
753+
754+
self.assertEqual(1, len(data))
755+
self.assertEqual(str(self.categorie_relatie5.uuid), data[0]["uuid"])
756+
757+
with self.subTest("no_matches_found_return_nothing"):
758+
response = self.client.get(
759+
self.url,
760+
{"categorie__naam": "zes"},
761+
)
762+
self.assertEqual(response.status_code, status.HTTP_200_OK)
763+
764+
self.assertEqual(response.json()["count"], 0)

src/openklant/components/klantinteracties/api/tests/test_validators.py

+20
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
actor_is_valid_instance,
1010
betrokkene_exists,
1111
bijlage_exists,
12+
categorie_exists,
13+
categorie_relatie_exists,
1214
contactpersoon_exists,
1315
digitaal_adres_exists,
1416
internetaak_exists,
@@ -36,6 +38,8 @@
3638
OnderwerpobjectFactory,
3739
)
3840
from openklant.components.klantinteracties.models.tests.factories.partijen import (
41+
CategorieFactory,
42+
CategorieRelatieFactory,
3943
ContactpersoonFactory,
4044
OrganisatieFactory,
4145
PartijFactory,
@@ -78,6 +82,22 @@ def test_bijlage(self):
7882
with self.assertRaises(serializers.ValidationError):
7983
bijlage_exists(str(uuid4()))
8084

85+
def test_categorie(self):
86+
categorie = CategorieFactory.create()
87+
with self.subTest("exists"):
88+
self.assertIsNone(categorie_exists(categorie.uuid))
89+
with self.subTest("doesn't_exist"):
90+
with self.assertRaises(serializers.ValidationError):
91+
categorie_exists(str(uuid4()))
92+
93+
def test_categorie_relatie(self):
94+
categorie_relatie = CategorieRelatieFactory.create()
95+
with self.subTest("exists"):
96+
self.assertIsNone(categorie_relatie_exists(categorie_relatie.uuid))
97+
with self.subTest("doesn't_exist"):
98+
with self.assertRaises(serializers.ValidationError):
99+
categorie_relatie_exists(str(uuid4()))
100+
81101
def test_contactpersoon(self):
82102
contactpersoon = ContactpersoonFactory.create()
83103
with self.subTest("exists"):

0 commit comments

Comments
 (0)