From 086aa0b8ee6dcbed40fae8f9957edb10e0705035 Mon Sep 17 00:00:00 2001 From: Paul Schilling Date: Fri, 18 Oct 2024 13:00:42 +0200 Subject: [PATCH] [#2821] Implement provisional configuration for OpenKlant2 service + tests --- src/open_inwoner/openklant/models.py | 27 ++++++++++++ src/open_inwoner/openklant/services.py | 24 ++++++----- src/open_inwoner/openklant/tests/helpers.py | 12 ++++++ .../tests/test_openklant2_service.py | 41 +++++++++++++++++-- src/openklant2/client.py | 6 +-- src/openklant2/tests/helpers.py | 11 ++--- 6 files changed, 96 insertions(+), 25 deletions(-) diff --git a/src/open_inwoner/openklant/models.py b/src/open_inwoner/openklant/models.py index 587cb09631..90912745f4 100644 --- a/src/open_inwoner/openklant/models.py +++ b/src/open_inwoner/openklant/models.py @@ -1,3 +1,6 @@ +from dataclasses import dataclass +from urllib.parse import urljoin + from django.db import models from django.utils.translation import gettext_lazy as _ @@ -184,3 +187,27 @@ class Meta: verbose_name = _("KlantContactMoment") verbose_name_plural = _("KlantContactMomenten") unique_together = [["user", "contactmoment_url"]] + + +@dataclass +class OpenKlant2Config: + api_root: str + api_path: str + api_token: str + + # Question/Answer settings + mijn_vragen_kanaal: str + mijn_vragen_organisatie_naam: str + interne_taak_gevraagde_handeling: str + interne_taak_toelichting: str + + @property + def api_url(self): + return urljoin(self.api_root, self.api_path) + + @classmethod + def from_django_settings(cls): + from django.conf import settings + + if config := getattr(settings, "OPENKLANT2_CONFIG", None): + return cls(**config) diff --git a/src/open_inwoner/openklant/services.py b/src/open_inwoner/openklant/services.py index c182e3eaa3..8a7dd28067 100644 --- a/src/open_inwoner/openklant/services.py +++ b/src/open_inwoner/openklant/services.py @@ -13,6 +13,7 @@ from open_inwoner.configurations.models import SiteConfiguration from open_inwoner.openklant.api_models import Klant from open_inwoner.openklant.clients import build_klanten_client +from open_inwoner.openklant.models import OpenKlant2Config from open_inwoner.utils.logentry import system_action from openklant2.client import OpenKlant2Client from openklant2.types.resources.digitaal_adres import DigitaalAdres @@ -144,19 +145,20 @@ def from_klantcontact_and_answer( class OpenKlant2Service: - + config: OpenKlant2Config client: OpenKlant2Client mijn_vragen_actor: uuid.UUID | None - MIJN_VRAGEN_KANAAL: str = "oip_mijn_vragen" def __init__( - self, client: OpenKlant2Client, mijn_vragen_actor: str | uuid.UUID | None = None + self, + config: OpenKlant2Config | None = None, + mijn_vragen_actor: str | uuid.UUID | None = None, ): - if not isinstance(client, OpenKlant2Client): - raise ValueError( - f"`client` must be an instance of {type(OpenKlant2Client)}" - ) - self.client = client + self.config = config or OpenKlant2Config.from_django_settings() + self.client = OpenKlant2Client( + api_url=self.config.api_url, + api_token=self.config.api_token, + ) if mijn_vragen_actor: self.mijn_vragen_actor = ( uuid.UUID(mijn_vragen_actor) @@ -466,7 +468,7 @@ def create_question( "inhoud": question, "onderwerp": subject, "taal": "nld", - "kanaal": self.MIJN_VRAGEN_KANAAL, + "kanaal": self.config.mijn_vragen_kanaal, "vertrouwelijk": False, "plaatsgevondenOp": timezone.now().isoformat(), } @@ -513,7 +515,7 @@ def create_answer( "inhoud": answer, "onderwerp": question_klantcontact["onderwerp"], "taal": "nld", - "kanaal": self.MIJN_VRAGEN_KANAAL, + "kanaal": self.config.mijn_vragen_kanaal, "vertrouwelijk": False, "plaatsgevondenOp": timezone.now().isoformat(), } @@ -555,7 +557,7 @@ def klantcontacten_for_partij(self, partij: Partij) -> Iterable[KlantContact]: "hadBetrokkenen", "hadBetrokkenen.wasPartij", ], - "kanaal": self.MIJN_VRAGEN_KANAAL, + "kanaal": self.config.mijn_vragen_kanaal, } ) diff --git a/src/open_inwoner/openklant/tests/helpers.py b/src/open_inwoner/openklant/tests/helpers.py index 6dc69434ae..31793f2429 100644 --- a/src/open_inwoner/openklant/tests/helpers.py +++ b/src/open_inwoner/openklant/tests/helpers.py @@ -42,3 +42,15 @@ def _get_vcr(self, **kwargs): "query", ] return vcr + + @property + def openklant2_api_root(self): + return self._service._api_root + + @property + def openklant2_api_path(self): + return self._service._api_path + + @property + def openklant2_api_token(self): + return self._service._api_token diff --git a/src/open_inwoner/openklant/tests/test_openklant2_service.py b/src/open_inwoner/openklant/tests/test_openklant2_service.py index 3600787852..bd83a077f4 100644 --- a/src/open_inwoner/openklant/tests/test_openklant2_service.py +++ b/src/open_inwoner/openklant/tests/test_openklant2_service.py @@ -6,6 +6,7 @@ from open_inwoner.accounts.models import User from open_inwoner.accounts.tests.factories import UserFactory +from open_inwoner.openklant.models import OpenKlant2Config from open_inwoner.openklant.services import OpenKlant2Question, OpenKlant2Service from open_inwoner.openklant.tests.helpers import Openklant2ServiceTestCase from openklant2.factories.partij import CreatePartijPersoonDataFactory @@ -16,7 +17,16 @@ class PartijGetOrCreateTestCase(Openklant2ServiceTestCase): def setUp(self): super().setUp() - self.service = OpenKlant2Service(self.openklant_client) + self.openklant2_config = OpenKlant2Config( + api_root="http://localhost:8338", + api_path="/klantinteracties/api/v1", + api_token="b2eb1da9861da88743d72a3fb4344288fe2cba44", + mijn_vragen_kanaal="oip_mijn_vragen", + mijn_vragen_organisatie_naam="Open Inwoner Platform", + interne_taak_gevraagde_handeling="Beantwoorden vraag Mijn Omgeving", + interne_taak_toelichting="Beantwoorden vraag", + ) + self.service = OpenKlant2Service(config=self.openklant2_config) self.user = UserFactory(first_name="John", last_name="Doe") def test_get_or_create_persoon(self): @@ -185,7 +195,16 @@ def test_get_or_create_organisatie_with_vestiging(self): class Openklant2ServiceTest(Openklant2ServiceTestCase): def setUp(self): super().setUp() - self.service = OpenKlant2Service(self.openklant_client) + self.openklant2_config = OpenKlant2Config( + api_root="http://localhost:8338", + api_path="/klantinteracties/api/v1", + api_token="b2eb1da9861da88743d72a3fb4344288fe2cba44", + mijn_vragen_kanaal="oip_mijn_vragen", + mijn_vragen_organisatie_naam="Open Inwoner Platform", + interne_taak_gevraagde_handeling="Beantwoorden vraag Mijn Omgeving", + interne_taak_toelichting="Beantwoorden vraag", + ) + self.service = OpenKlant2Service(config=self.openklant2_config) self.persoon = self.openklant_client.partij.create_persoon( data={ @@ -314,8 +333,20 @@ def setUp(self): "soortActor": "organisatorische_eenheid", } ) + + self.openklant2_config = OpenKlant2Config( + api_root="http://localhost:8338", + api_path="/klantinteracties/api/v1", + api_token="b2eb1da9861da88743d72a3fb4344288fe2cba44", + mijn_vragen_kanaal="oip_mijn_vragen", + mijn_vragen_organisatie_naam="Open Inwoner Platform", + interne_taak_gevraagde_handeling="Beantwoorden vraag Mijn Omgeving", + interne_taak_toelichting="Beantwoorden vraag", + ) + # self.service = OpenKlant2Service(config=self.openklant2_config) self.service = OpenKlant2Service( - self.openklant_client, mijn_vragen_actor=self.designated_actor["uuid"] + config=self.openklant2_config, + mijn_vragen_actor=self.designated_actor["uuid"], ) def test_designated_actor_is_required_to_create_question(self): @@ -350,7 +381,9 @@ def test_create_question(self): (betrokkene,) = self.service.client.betrokkene.list_iter() (taak,) = self.service.client.interne_taak.list_iter() - self.assertEqual(klantcontact["kanaal"], self.service.MIJN_VRAGEN_KANAAL) + self.assertEqual( + klantcontact["kanaal"], self.openklant2_config.mijn_vragen_kanaal + ) self.assertEqual(betrokkene["hadKlantcontact"]["uuid"], klantcontact["uuid"]) self.assertEqual(betrokkene["wasPartij"]["uuid"], self.een_persoon["uuid"]) self.assertEqual( diff --git a/src/openklant2/client.py b/src/openklant2/client.py index 5bf7e71092..efa6b5d183 100644 --- a/src/openklant2/client.py +++ b/src/openklant2/client.py @@ -14,10 +14,10 @@ class OpenKlant2Client: http_client: APIClient partij: PartijResource - def __init__(self, token: str, api_root: str): + def __init__(self, api_url: str, api_token: str): self.http_client = APIClient( - request_kwargs={"headers": {"Authorization": f"Token {token}"}}, - base_url=api_root, + request_kwargs={"headers": {"Authorization": f"Token {api_token}"}}, + base_url=api_url, ) self.partij = PartijResource(self.http_client) diff --git a/src/openklant2/tests/helpers.py b/src/openklant2/tests/helpers.py index e0022cd500..fd6ef2f110 100644 --- a/src/openklant2/tests/helpers.py +++ b/src/openklant2/tests/helpers.py @@ -143,16 +143,13 @@ def tearDown(self): self._in_server_context = False @property - def api_root(self): - return urljoin( - self._api_root, - self._api_path, - ) + def api_url(self): + return urljoin(self._api_root, self._api_path) def client_factory(self): return OpenKlant2Client( - api_root=self.api_root, - token=self._api_token, + api_url=self.api_url, + api_token=self._api_token, ) def clean_state(self):