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

[#2821] Implement provisional configuration for OpenKlant2 service #1452

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
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
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)
39 changes: 24 additions & 15 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 @@ -147,20 +148,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 @@ -465,7 +462,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 @@ -512,7 +509,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 @@ -561,6 +558,18 @@ def klantcontacten_for_partij(
# Partij (see https://github.com/maykinmedia/open-klant/issues/256). So
# unfortunately, we have to fetch all rows and do the filtering client
# side.
klantcontacten = self.client.klant_contact.list_iter(
params={
"expand": [
"leiddeTotInterneTaken",
"gingOverOnderwerpobjecten",
"hadBetrokkenen",
"hadBetrokkenen.wasPartij",
],
"kanaal": self.config.mijn_vragen_kanaal,
}
)

klantcontacten_for_partij = filter(
lambda row: partij_uuid
in glom.glom(
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):
pi-sigma marked this conversation as resolved.
Show resolved Hide resolved
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
Loading