diff --git a/src/open_inwoner/openklant/models.py b/src/open_inwoner/openklant/models.py index 587cb09631..8334940da5 100644 --- a/src/open_inwoner/openklant/models.py +++ b/src/open_inwoner/openklant/models.py @@ -1,3 +1,7 @@ +import uuid +from dataclasses import dataclass +from urllib.parse import urljoin + from django.db import models from django.utils.translation import gettext_lazy as _ @@ -184,3 +188,28 @@ 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 + mijn_vragen_actor: str | uuid.UUID | None + 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..a5b8b9e0e3 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,20 +145,16 @@ 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 - ): - if not isinstance(client, OpenKlant2Client): - raise ValueError( - f"`client` must be an instance of {type(OpenKlant2Client)}" - ) - self.client = client - if mijn_vragen_actor: + + def __init__(self, config: OpenKlant2Config | None = None): + 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 := getattr(config, "mijn_vragen_actor", None): self.mijn_vragen_actor = ( uuid.UUID(mijn_vragen_actor) if isinstance(mijn_vragen_actor, str) @@ -466,7 +463,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 +510,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 +552,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..9f1c7a2f06 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,17 @@ class PartijGetOrCreateTestCase(Openklant2ServiceTestCase): def setUp(self): super().setUp() - self.service = OpenKlant2Service(self.openklant_client) + self.openklant2_config = OpenKlant2Config( + api_root=self.openklant2_api_root, + api_path=self.openklant2_api_path, + api_token=self.openklant2_api_token, + mijn_vragen_kanaal="oip_mijn_vragen", + mijn_vragen_organisatie_naam="Open Inwoner Platform", + mijn_vragen_actor="ca0783a1-1d74-4e07-b3e0-185b1d2fccd4", + 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 +196,17 @@ 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=self.openklant2_api_root, + api_path=self.openklant2_api_path, + api_token=self.openklant2_api_token, + mijn_vragen_kanaal="oip_mijn_vragen", + mijn_vragen_organisatie_naam="Open Inwoner Platform", + mijn_vragen_actor="ca0783a1-1d74-4e07-b3e0-185b1d2fccd4", + 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,9 +335,18 @@ def setUp(self): "soortActor": "organisatorische_eenheid", } ) - self.service = OpenKlant2Service( - self.openklant_client, mijn_vragen_actor=self.designated_actor["uuid"] + + self.openklant2_config = OpenKlant2Config( + api_root=self.openklant2_api_root, + api_path=self.openklant2_api_path, + api_token=self.openklant2_api_token, + mijn_vragen_kanaal="oip_mijn_vragen", + mijn_vragen_organisatie_naam="Open Inwoner Platform", + mijn_vragen_actor="ca0783a1-1d74-4e07-b3e0-185b1d2fccd4", + interne_taak_gevraagde_handeling="Beantwoorden vraag Mijn Omgeving", + interne_taak_toelichting="Beantwoorden vraag", ) + self.service = OpenKlant2Service(config=self.openklant2_config) def test_designated_actor_is_required_to_create_question(self): self.service.mijn_vragen_actor = None @@ -350,7 +380,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):