Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#243] Fix expand query parameter #286

Merged
merged 6 commits into from
Nov 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading