Skip to content

Commit

Permalink
[#243] Fix expand query parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
SonnyBA authored Nov 22, 2024
1 parent 60d0bfb commit 3300c91
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
from rest_framework import status
from vng_api_common.tests import reverse

from openklant.components.klantinteracties.models.constants import SoortPartij
from openklant.components.klantinteracties.models.partijen import Partij
from openklant.components.klantinteracties.models.tests.factories.digitaal_adres import (
DigitaalAdresFactory,
)
Expand Down Expand Up @@ -1797,6 +1799,49 @@ def test_destroy_partij(self):
data = response.json()
self.assertEqual(data["count"], 0)

def test_digitale_adressen_inclusion_param(self):
persoon = PersoonFactory(partij__soort_partij=SoortPartij.persoon)

persoon_with_adressen = PersoonFactory(partij__soort_partij=SoortPartij.persoon)
digitaal_adres = DigitaalAdresFactory(partij=persoon_with_adressen.partij)

def _get_detail_url(partij: Partij) -> str:
return reverse(
"klantinteracties:partij-detail", kwargs={"uuid": str(partij.uuid)}
)

# request the partij *without* any digitale adressen
response = self.client.get(
_get_detail_url(persoon.partij), data=dict(expand="digitaleAdressen")
)

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

response_data: dict = response.json()

self.assertEqual(response_data["_expand"], {"digitaleAdressen": []})

# request the partij *with* digitale adressen
response = self.client.get(
_get_detail_url(persoon_with_adressen.partij),
data=dict(expand="digitaleAdressen"),
)

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

response_data: dict = response.json()

received_adressen = response_data["_expand"]["digitaleAdressen"]
expected_url = reverse(
"klantinteracties:digitaaladres-detail",
kwargs=dict(uuid=digitaal_adres.uuid),
)

self.assertEqual(len(received_adressen), 1)
self.assertEqual(
received_adressen[0]["url"], f"http://testserver{expected_url}"
)


class PartijIdentificatorTests(APITestCase):
def test_list_partij_indetificator(self):
Expand Down
55 changes: 43 additions & 12 deletions src/openklant/components/utils/expansion.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,16 +64,26 @@ def display_children(self) -> dict:
return dict where children are grouped by their label
"""
results = {}

for child in self._children:
child_result = child.display()
if child.many:
results.setdefault(child.label, []).append(child_result)
else:
child_result: Optional[dict] = child.display()

if not child.many:
results[child.label] = child_result
continue

child_results: list = results.setdefault(child.label, [])

if child_result is None:
continue

if child_result is not None:
child_results.append(child_result)

return results

def display(self) -> dict:
data = self.value.copy()
def display(self) -> Optional[dict]:
data = self.value.copy() if self.value is not None else None
if self._children:
data[EXPAND_KEY] = self.display_children()
return data
Expand Down Expand Up @@ -111,6 +121,7 @@ def display_tree(self) -> dict:

for node in root_nodes:
result[node.id] = node.display_children()

return result


Expand Down Expand Up @@ -168,15 +179,24 @@ def inclusions_dict(self, serializer: Serializer) -> dict:
entries = self._inclusions((), serializer, serializer.instance)

for obj, inclusion_serializer, parent, path, many in entries:
data = inclusion_serializer(instance=obj, context=serializer.context).data
tree.add_node(
id=data["url"],
value=data,
tree_kwargs = dict(
id=None,
value=None,
label=path[-1],
many=many,
parent_id=parent.get_absolute_api_url(request=request),
)

if obj:
serializer = inclusion_serializer(
instance=obj, context=serializer.context
)
data: dict | list = serializer.data

tree_kwargs.update(dict(value=data, id=data["url"]))

tree.add_node(**tree_kwargs)

result = tree.display_tree()

return result
Expand Down Expand Up @@ -204,11 +224,17 @@ def _field_inclusions(
self,
path: Tuple[str, ...],
field: Field,
instance: models.Model,
instance: Optional[models.Model],
name: str,
inclusion_serializers: Dict[str, Union[str, Type[Serializer]]],
) -> Iterator[
Tuple[models.Model, Type[Serializer], models.Model, Tuple[str, ...], bool]
Tuple[
Optional[models.Model],
Type[Serializer],
models.Model,
Tuple[str, ...],
bool,
]
]:
"""
change return of this generator from (obj, serializer_class) to
Expand Down Expand Up @@ -237,6 +263,8 @@ def _field_inclusions(
True if hasattr(field, "child_relation") else getattr(field, "many", False)
)

obj: Optional[models.Model] = None

for obj in self._some_related_field_inclusions(
new_path, field, instance, inclusion_serializer
):
Expand All @@ -250,6 +278,9 @@ def _field_inclusions(
inclusion_serializers,
):
yield entry
else:
if new_path in self.allowed_paths:
yield obj, inclusion_serializer, instance, new_path, many

def _some_related_field_inclusions(
self,
Expand Down

0 comments on commit 3300c91

Please sign in to comment.