Skip to content

Commit

Permalink
[#2821] Implement provisional configuration for OpenKlant2 service + …
Browse files Browse the repository at this point in the history
…tests
  • Loading branch information
pi-sigma committed Oct 22, 2024
1 parent 16de4dc commit 3402ea1
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 31 deletions.
29 changes: 29 additions & 0 deletions src/open_inwoner/openklant/models.py
Original file line number Diff line number Diff line change
@@ -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 _

Expand Down Expand Up @@ -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)
29 changes: 13 additions & 16 deletions src/open_inwoner/openklant/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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(),
}
Expand Down Expand Up @@ -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(),
}
Expand Down Expand Up @@ -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,
}
)

Expand Down
12 changes: 12 additions & 0 deletions src/open_inwoner/openklant/tests/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
42 changes: 37 additions & 5 deletions src/open_inwoner/openklant/tests/test_openklant2_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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):
Expand Down Expand Up @@ -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={
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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(
Expand Down
6 changes: 3 additions & 3 deletions src/openklant2/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
11 changes: 4 additions & 7 deletions src/openklant2/tests/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down

0 comments on commit 3402ea1

Please sign in to comment.