diff --git a/src/open_inwoner/berichten/api_models.py b/src/open_inwoner/berichten/api_models.py index 117bb9dd02..42f78d11d3 100644 --- a/src/open_inwoner/berichten/api_models.py +++ b/src/open_inwoner/berichten/api_models.py @@ -7,7 +7,7 @@ from datetime import date from typing import List, Optional -from pydantic import AnyUrl, BaseModel, Field, constr +from pydantic import BaseModel, Field, constr from typing_extensions import Literal @@ -19,7 +19,7 @@ class Identificatie(BaseModel): class Bericht(BaseModel): object_uuid: str = Field(..., description="UUID van het onderliggende object") onderwerp: str = Field(..., description="Onderwerp van het bericht") - berichtTekst: str = Field( + bericht_tekst: str = Field( ..., description="Tekst van het bericht. Mag URL bevatten en /r/n voor newline. Geen verdere opmaak mogelijk.", ) @@ -27,7 +27,7 @@ class Bericht(BaseModel): ..., description="Tijdstip van verwerken van het bericht of de PublicatieDatum indien deze is ingevuld", ) - einddatumHandelingstermijn: Optional[date] = Field( + einddatum_handelingstermijn: Optional[date] = Field( None, description="Termijn waarbinnen de geadresseerde moet reageren" ) referentie: Optional[str] = Field(None, description="TODO") @@ -38,11 +38,12 @@ class Bericht(BaseModel): ..., description="Het bericht is door de geadresseerde geopend of nog niet geopend", ) - berichtType: Literal[ + bericht_type: Literal[ "notificatie", "betaalverzoek", "uitnodiging", "verzoek", "TODO" ] = Field(..., description="Type bericht") identificatie: Identificatie = Field(..., description="TODO") - bijlages: List[AnyUrl] = Field( + # TODO: Should be AnyUrl + bijlages: List[str] = Field( ..., description="TODO", examples=[["https://documenten.nl/api/v1/enkelvoudiginformatieobjecten/1"]], diff --git a/src/open_inwoner/berichten/mock_data.py b/src/open_inwoner/berichten/mock_data.py deleted file mode 100644 index e0ddc1d394..0000000000 --- a/src/open_inwoner/berichten/mock_data.py +++ /dev/null @@ -1,63 +0,0 @@ -import uuid -from datetime import date - -from open_inwoner.berichten.api_models import Bericht - -MOCK_BERICHT_1 = { - "onderwerp": "Besluit 1", - "berichtTekst": "Hallo,\neen\nbericht 1", - "publicatiedatum": date.fromisoformat("2024-01-01"), - "referentie": "TODO", - "handelingsperspectief": "TODO", - "einddatumHandelingstermijn": date.fromisoformat("2024-12-01"), - "geopend": False, - "berichtType": "TODO", - "identificatie": {"type": "bsn", "value": "999991954"}, - "bijlages": [ - "https://documenten.nl/api/v1/enkelvoudiginformatieobjecten/1", - "https://documenten.nl/api/v1/enkelvoudiginformatieobjecten/2", - ], -} - -MOCK_BERICHT_2 = { - "onderwerp": "Voorbeeld onderwerp", - "berichtTekst": "Goedendag,\nwederom een\n2e bericht", - "publicatiedatum": date.fromisoformat("2024-01-02"), - "referentie": "notificatie", - "handelingsperspectief": "informatie ontvangen", - "einddatumHandelingstermijn": date.fromisoformat("2024-12-02"), - "geopend": False, - "berichtType": "notificatie", - "identificatie": {"type": "bsn", "value": "999991955"}, - "bijlages": [ - "https://documenten.nl/api/v1/enkelvoudiginformatieobjecten/3", - "https://documenten.nl/api/v1/enkelvoudiginformatieobjecten/4", - ], -} - -MOCK_BERICHT_3 = { - "onderwerp": "Betalen van uw parkeerbon", - "berichtTekst": "Hallo,\neen\nbericht 3", - "publicatiedatum": date.fromisoformat("2024-01-03"), - "referentie": "TODO 3", - "handelingsperspectief": "betalen", - "einddatumHandelingstermijn": date.fromisoformat("2024-12-03"), - "geopend": True, - "berichtType": "betaalverzoek", - "identificatie": {"type": "bsn", "value": "999991956"}, - "bijlages": [ - "https://documenten.nl/api/v1/enkelvoudiginformatieobjecten/5", - "https://documenten.nl/api/v1/enkelvoudiginformatieobjecten/6", - ], -} - -MOCK_BERICHTEN = [ - Bericht.model_validate(MOCK_BERICHT_1 | {"object_uuid": str(uuid.uuid4())}), - Bericht.model_validate(MOCK_BERICHT_2 | {"object_uuid": str(uuid.uuid4())}), - Bericht.model_validate(MOCK_BERICHT_3 | {"object_uuid": str(uuid.uuid4())}), -] - -MOCK_BERICHTEN *= (25 // len(MOCK_BERICHTEN)) + 1 - -# Slice -MOCK_BERICHTEN = MOCK_BERICHTEN[:25] diff --git a/src/open_inwoner/berichten/services.py b/src/open_inwoner/berichten/services.py new file mode 100644 index 0000000000..f499147bc6 --- /dev/null +++ b/src/open_inwoner/berichten/services.py @@ -0,0 +1,41 @@ +from typing import Literal + +from objectsapiclient.client import Client as ObjectenClient +from objectsapiclient.models import Configuration + +from open_inwoner.berichten.api_models import Bericht + + +class BerichtenService: + + client: ObjectenClient + + def __init__(self, client: ObjectenClient | None = None): + self.client = client or Configuration.get_solo().client + + def fetch_berichten_for_bsn(self, bsn: str): + return self.fetch_berichten_for_identificatie("bsn", bsn) + + def fetch_berichten_for_kvk(self, kvk: str): + return self.fetch_berichten_for_identificatie("kvk", kvk) + + def fetch_berichten_for_identificatie( + self, identificatie_type: Literal["bsn", "kvk"], identificatie_value: str + ): + objects = self.client.get_objects( + object_type_uuid="98b9b5dd-9c2c-44ba-b5bf-13edaed668f9", + data_attrs=[ + f"identificatie__type__exact__{identificatie_type}", + f"identificatie__value__exact__{identificatie_value}", + ], + ) + + return [ + Bericht.model_validate(obj.record["data"] | {"object_uuid": obj.uuid}) + for obj in objects + ] + + def fetch_bericht(self, uuid: str): + obj = self.client.get_object(uuid) + + return Bericht.model_validate(obj.record["data"] | {"object_uuid": obj.uuid}) diff --git a/src/open_inwoner/berichten/views/bericht_detail.py b/src/open_inwoner/berichten/views/bericht_detail.py index 828f037fae..715ace9b31 100644 --- a/src/open_inwoner/berichten/views/bericht_detail.py +++ b/src/open_inwoner/berichten/views/bericht_detail.py @@ -7,7 +7,7 @@ from view_breadcrumbs import BaseBreadcrumbMixin -from open_inwoner.berichten.mock_data import MOCK_BERICHTEN +from open_inwoner.berichten.services import BerichtenService from open_inwoner.utils.views import CommonPageMixin logger = logging.getLogger(__name__) @@ -29,5 +29,6 @@ def page_title(self): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context["bericht"] = MOCK_BERICHTEN[0] + service = BerichtenService() + context["bericht"] = service.fetch_bericht(self.kwargs["object_uuid"]) return context diff --git a/src/open_inwoner/berichten/views/bericht_list.py b/src/open_inwoner/berichten/views/bericht_list.py index 698b3e5e5e..8c10a6f9f1 100644 --- a/src/open_inwoner/berichten/views/bericht_list.py +++ b/src/open_inwoner/berichten/views/bericht_list.py @@ -7,7 +7,7 @@ from view_breadcrumbs import BaseBreadcrumbMixin -from open_inwoner.berichten.mock_data import MOCK_BERICHTEN +from open_inwoner.berichten.services import BerichtenService from open_inwoner.utils.views import CommonPageMixin logger = logging.getLogger(__name__) @@ -28,5 +28,8 @@ def page_title(self): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context["berichten"] = MOCK_BERICHTEN + service = BerichtenService() + if self.request.user.is_authenticated and (bsn := self.request.user.bsn): + context["berichten"] = service.fetch_berichten_for_bsn(bsn) + return context diff --git a/src/open_inwoner/templates/pages/berichten/detail.html b/src/open_inwoner/templates/pages/berichten/detail.html index 87ef61adb9..83bd3da0d5 100644 --- a/src/open_inwoner/templates/pages/berichten/detail.html +++ b/src/open_inwoner/templates/pages/berichten/detail.html @@ -35,7 +35,7 @@

berichtTekst:
- {{ bericht.berichtTekst|linebreaks }}

+ {{ bericht.bericht_tekst|linebreaks }}

handelingsperspectief: {{ bericht.handelingsperspectief }}
@@ -67,7 +67,7 @@

Bijlagen