Skip to content

Commit 175c0cd

Browse files
committed
🎨 [#165] changed expand snake_case query params to camelCase
1 parent c952db1 commit 175c0cd

File tree

5 files changed

+83
-28
lines changed

5 files changed

+83
-28
lines changed

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def setUp(self):
4343

4444
def test_list_single_expansion(self):
4545
list_url = reverse("klantinteracties:klantcontact-list")
46-
response = self.client.get(list_url, {"expand": "had_betrokkenen"})
46+
response = self.client.get(list_url, {"expand": "hadBetrokkenen"})
4747

4848
self.assertEqual(response.status_code, status.HTTP_200_OK)
4949

@@ -94,7 +94,7 @@ def test_list_single_expansion(self):
9494
def test_list_multiple_level_expansion(self):
9595
list_url = reverse("klantinteracties:klantcontact-list")
9696
response = self.client.get(
97-
list_url, {"expand": "had_betrokkenen,had_betrokkenen.was_partij"}
97+
list_url, {"expand": "hadBetrokkenen,hadBetrokkenen.wasPartij"}
9898
)
9999

100100
self.assertEqual(response.status_code, status.HTTP_200_OK)
@@ -185,7 +185,7 @@ def test_detail_single_expansion(self):
185185
"klantinteracties:klantcontact-detail",
186186
kwargs={"uuid": str(self.klantcontact.uuid)},
187187
)
188-
response = self.client.get(detail_url, {"expand": "had_betrokkenen"})
188+
response = self.client.get(detail_url, {"expand": "hadBetrokkenen"})
189189

190190
self.assertEqual(response.status_code, status.HTTP_200_OK)
191191

@@ -235,7 +235,7 @@ def test_detail_multiple_level_expansion(self):
235235
kwargs={"uuid": str(self.klantcontact.uuid)},
236236
)
237237
response = self.client.get(
238-
detail_url, {"expand": "had_betrokkenen,had_betrokkenen.was_partij"}
238+
detail_url, {"expand": "hadBetrokkenen,hadBetrokkenen.wasPartij"}
239239
)
240240

241241
self.assertEqual(response.status_code, status.HTTP_200_OK)

src/openklant/components/klantinteracties/openapi.yaml

+27-22
Original file line numberDiff line numberDiff line change
@@ -1199,23 +1199,23 @@ paths:
11991199
items:
12001200
type: string
12011201
enum:
1202-
- ging_over_onderwerpobjecten
1203-
- had_betrokken_actoren
1204-
- had_betrokkenen
1205-
- had_betrokkenen.digitale_adressen
1206-
- had_betrokkenen.was_partij
1207-
- leidde_tot_interne_taken
1208-
- omvatte_bijlagen
1202+
- gingOverOnderwerpobjecten
1203+
- hadBetrokkenActoren
1204+
- hadBetrokkenen
1205+
- hadBetrokkenen.DigitaleAdressen
1206+
- hadBetrokkenen.WasPartij
1207+
- leiddeTotInterneTaken
1208+
- omvatteBijlagen
12091209
description: |-
12101210
Sluit de gespecifieerde gerelateerde resources in in het antwoord.
12111211
1212-
* `had_betrokkenen` - had_betrokkenen
1213-
* `had_betrokken_actoren` - had_betrokken_actoren
1214-
* `leidde_tot_interne_taken` - leidde_tot_interne_taken
1215-
* `ging_over_onderwerpobjecten` - ging_over_onderwerpobjecten
1216-
* `omvatte_bijlagen` - omvatte_bijlagen
1217-
* `had_betrokkenen.was_partij` - had_betrokkenen.was_partij
1218-
* `had_betrokkenen.digitale_adressen` - had_betrokkenen.digitale_adressen
1212+
* `hadBetrokkenen` - had_betrokkenen
1213+
* `hadBetrokkenActoren` - had_betrokken_actoren
1214+
* `leiddeTotInterneTaken` - leidde_tot_interne_taken
1215+
* `gingOverOnderwerpobjecten` - ging_over_onderwerpobjecten
1216+
* `omvatteBijlagen` - omvatte_bijlagen
1217+
* `hadBetrokkenen.WasPartij` - had_betrokkenen.was_partij
1218+
* `hadBetrokkenen.DigitaleAdressen` - had_betrokkenen.digitale_adressen
12191219
explode: false
12201220
style: form
12211221
- in: query
@@ -1714,6 +1714,11 @@ paths:
17141714
name: bezoekadres_nummeraanduiding_id
17151715
schema:
17161716
type: string
1717+
- in: query
1718+
name: categorierelatie__categorie__naam
1719+
schema:
1720+
type: string
1721+
description: Zoek partij object op basis van categorie namen.
17171722
- in: query
17181723
name: correspondentieadres_adresregel1
17191724
schema:
@@ -1742,18 +1747,18 @@ paths:
17421747
type: string
17431748
enum:
17441749
- betrokkenen
1745-
- betrokkenen.had_klantcontact
1746-
- betrokkenen.had_klantcontact.had_betrokken_actoren
1747-
- categorie_relaties
1748-
- digitale_adressen
1750+
- betrokkenen.hadKlantcontact
1751+
- betrokkenen.hadKlantcontact.HadBetrokkenActoren
1752+
- categorieRelaties
1753+
- digitaleAdressen
17491754
description: |-
17501755
Sluit de gespecifieerde gerelateerde resources in in het antwoord.
17511756
1752-
* `digitale_adressen` - digitale_adressen
1757+
* `digitaleAdressen` - digitale_adressen
17531758
* `betrokkenen` - betrokkenen
1754-
* `categorie_relaties` - categorie_relaties
1755-
* `betrokkenen.had_klantcontact` - betrokkenen.had_klantcontact
1756-
* `betrokkenen.had_klantcontact.had_betrokken_actoren` - betrokkenen.had_klantcontact.had_betrokken_actoren
1759+
* `categorieRelaties` - categorie_relaties
1760+
* `betrokkenen.hadKlantcontact` - betrokkenen.had_klantcontact
1761+
* `betrokkenen.hadKlantcontact.HadBetrokkenActoren` - betrokkenen.had_klantcontact.had_betrokken_actoren
17571762
explode: false
17581763
style: form
17591764
- in: query

src/openklant/components/utils/expansion.py

+26-2
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,14 @@
1616
from rest_framework_inclusions.core import InclusionLoader
1717
from rest_framework_inclusions.renderer import (
1818
InclusionJSONRenderer,
19-
get_allowed_paths,
2019
should_skip_inclusions,
2120
)
2221

22+
from openklant.utils.converters import (
23+
camel_to_snake_converter,
24+
snake_to_camel_converter,
25+
)
26+
2327
from .camilize import CamelCaseJSONRenderer
2428

2529
logger = logging.getLogger(__name__)
@@ -355,12 +359,32 @@ def _render_inclusions(self, data, renderer_context):
355359
return render_data
356360

357361

362+
# Added camelCase to snake_case converter
363+
def get_allowed_paths(request, view=None):
364+
if getattr(view, "get_requested_inclusions", None):
365+
include = view.get_requested_inclusions(request)
366+
else:
367+
include = request.GET.get("include") if request else None
368+
369+
if include is None:
370+
# nothing is allowed
371+
return set()
372+
if include == "*":
373+
# everything is allowed
374+
return None
375+
376+
include = camel_to_snake_converter(include)
377+
return [tuple(entry.split(".")) for entry in include.split(",")]
378+
379+
358380
def get_expand_options_for_serializer(
359381
serializer_class: Type[Serializer],
360382
) -> List[tuple]:
361383
choices = [
362384
(
363-
opt,
385+
".".join(
386+
snake_to_camel_converter(field_name) for field_name in opt.split(".")
387+
),
364388
opt,
365389
)
366390
for opt in serializer_class.inclusion_serializers

src/openklant/utils/converters.py

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import re
2+
3+
4+
def camel_to_snake_converter(value):
5+
pattern = re.compile(r"(?<!^)(?=[A-Z])")
6+
return pattern.sub("_", value).lower()
7+
8+
9+
def snake_to_camel_converter(value):
10+
init, *temp = value.split("_")
11+
return "".join([init.lower(), *map(str.title, temp)])
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from django.test import TestCase
2+
3+
from ..converters import camel_to_snake_converter, snake_to_camel_converter
4+
5+
6+
class ConverterTests(TestCase):
7+
def test_camel_to_snake_converter(self):
8+
self.assertEqual(
9+
camel_to_snake_converter("snakeCaseTestString"), "snake_case_test_string"
10+
)
11+
12+
def test_snake_to_camel_converter(self):
13+
self.assertEqual(
14+
snake_to_camel_converter("camel_case_test_string"), "camelCaseTestString"
15+
)

0 commit comments

Comments
 (0)