Skip to content

Commit 9b8b3e9

Browse files
authored
Merge pull request #4 from maykinmedia/feature/maak-klant-contact-suggestions
Reorganize convenience methods into their own namespace
2 parents fbcde0c + 2c892ec commit 9b8b3e9

File tree

12 files changed

+184
-12
lines changed

12 files changed

+184
-12
lines changed

openklant_client/_methods/__init__.py

Whitespace-only changes.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from typing import cast
2+
3+
from ape_pie import APIClient
4+
5+
from openklant_client._resources.base import ConvenienceMethodMixin
6+
from openklant_client.types.methods.maak_klant_contact import (
7+
MaakKlantContactCreateData,
8+
MaakKlantContactResponse,
9+
)
10+
11+
12+
class MaakKlantContactConvenienceMethod(ConvenienceMethodMixin):
13+
"""
14+
Convenience endpoint to create of KlantContact, Betrokkene and OnderwerpObject
15+
"""
16+
17+
http_client: APIClient
18+
base_path: str = "maak-klantcontact"
19+
20+
def __call__(
21+
self,
22+
*,
23+
data: MaakKlantContactCreateData,
24+
) -> MaakKlantContactResponse:
25+
response = self._post(self.base_path, data=data)
26+
return cast(MaakKlantContactResponse, self.process_response(response))

openklant_client/_resources/base.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,3 +239,15 @@ def inner(*args: P.args, **kwargs: P.kwargs) -> Generator[T, Any, None]:
239239
return self._paginator(f(*args, **kwargs))
240240

241241
return inner
242+
243+
244+
class ConvenienceMethodMixin(ResourceMixin):
245+
http_client: APIClient
246+
247+
def __init__(self, http_client: APIClient):
248+
self.http_client = http_client
249+
250+
def __call__(self):
251+
raise NotImplementedError(
252+
"You must implement the _call__ method to invoke the convenience method"
253+
)

openklant_client/client.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
from dataclasses import dataclass
12
from typing import Any
23

34
from ape_pie import APIClient
45
from ape_pie.typing import ConfigAdapter
56

7+
from openklant_client._methods.maak_klant_contact import (
8+
MaakKlantContactConvenienceMethod,
9+
)
610
from openklant_client._resources.actor import ActorResource
711
from openklant_client._resources.betrokkene import BetrokkeneResource
812
from openklant_client._resources.digitaal_adres import DigitaalAdresResource
@@ -13,6 +17,13 @@
1317
from openklant_client._resources.partij_identificator import PartijIdentificatorResource
1418

1519

20+
@dataclass
21+
class ConvenienceMethods:
22+
"""Container for non-resource centric, convenience method endpoints."""
23+
24+
maak_klant_contact: MaakKlantContactConvenienceMethod
25+
26+
1627
class OpenKlantClient(APIClient):
1728
partij: PartijResource
1829
partij_identificator: PartijIdentificatorResource
@@ -22,6 +33,7 @@ class OpenKlantClient(APIClient):
2233
actor: ActorResource
2334
interne_taak: InterneTaakResource
2435
betrokkene: BetrokkeneResource
36+
methods: ConvenienceMethods
2537

2638
def __init__(
2739
self,
@@ -48,6 +60,9 @@ def __init__(
4860
self.actor = ActorResource(self)
4961
self.interne_taak = InterneTaakResource(self)
5062
self.betrokkene = BetrokkeneResource(self)
63+
self.methods = ConvenienceMethods(
64+
maak_klant_contact=MaakKlantContactConvenienceMethod(self)
65+
)
5166

5267
@classmethod
5368
def configure_from(cls, adapter: ConfigAdapter, **kwargs):

openklant_client/types/methods/__init__.py

Whitespace-only changes.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from typing import NotRequired, TypedDict
2+
3+
from openklant_client.types.resources.betrokkene import (
4+
Betrokkene,
5+
BetrokkeneBaseCreateData,
6+
)
7+
from openklant_client.types.resources.klant_contact import (
8+
CreateKlantContactData,
9+
KlantContact,
10+
)
11+
from openklant_client.types.resources.onderwerp_object import (
12+
OnderwerpObject,
13+
OnderwerpObjectBaseCreateData,
14+
)
15+
16+
17+
class MaakKlantContactCreateData(TypedDict):
18+
klantcontact: CreateKlantContactData
19+
betrokkene: NotRequired[BetrokkeneBaseCreateData]
20+
onderwerpobject: NotRequired[OnderwerpObjectBaseCreateData]
21+
22+
23+
class MaakKlantContactResponse(TypedDict):
24+
klantcontact: KlantContact
25+
betrokkene: Betrokkene | None
26+
onderwerpobject: OnderwerpObject | None

openklant_client/types/resources/betrokkene.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ class CreateContactnaam(TypedDict):
1414
achternaam: str
1515

1616

17-
class BetrokkeneCreateData(TypedDict):
18-
wasPartij: ForeignKeyRef | None
19-
hadKlantcontact: ForeignKeyRef | None
17+
class BetrokkeneBaseCreateData(TypedDict):
18+
wasPartij: NotRequired[ForeignKeyRef | None]
2019
bezoekadres: NotRequired[Adres]
2120
correspondentieadres: NotRequired[Adres]
2221
contactnaam: NotRequired[CreateContactnaam | None]
@@ -25,6 +24,10 @@ class BetrokkeneCreateData(TypedDict):
2524
initiator: bool
2625

2726

27+
class BetrokkeneCreateData(BetrokkeneBaseCreateData):
28+
hadKlantcontact: ForeignKeyRef
29+
30+
2831
class Betrokkene(TypedDict):
2932
uuid: str
3033
url: str

openklant_client/types/resources/onderwerp_object.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,13 @@ class OnderwerpObjectIdentificator(TypedDict):
1212
codeSoortObjectId: str
1313

1414

15-
class BetrokkeneBase(TypedDict):
16-
uuid: str
17-
url: str
15+
class OnderwerpObjectBaseCreateData(TypedDict):
16+
wasKlantcontact: NotRequired[ForeignKeyRef | None]
17+
onderwerpobjectidentificator: NotRequired[OnderwerpObjectIdentificator | None]
1818

1919

20-
class CreateOnderwerpObjectData(TypedDict):
21-
wasKlantcontact: ForeignKeyRef | None
22-
klantcontact: ForeignKeyRef | None
23-
onderwerpobjectidentificator: NotRequired[OnderwerpObjectIdentificator | None]
20+
class CreateOnderwerpObjectData(OnderwerpObjectBaseCreateData):
21+
klantcontact: NotRequired[ForeignKeyRef | None]
2422

2523

2624
class OnderwerpObject(TypedDict):
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
interactions:
2+
- request:
3+
body: '{"klantcontact": {"kanaal": "contactformulier", "onderwerp": "vraag", "inhoud":
4+
"Dit is een vraag", "taal": "nld", "vertrouwelijk": true}}'
5+
headers:
6+
Authorization:
7+
- Token b2eb1da9861da88743d72a3fb4344288fe2cba44
8+
Content-Length:
9+
- '138'
10+
Content-Type:
11+
- application/json
12+
method: POST
13+
uri: http://localhost:8338/klantinteracties/api/v1/maak-klantcontact
14+
response:
15+
body:
16+
string: '{"klantcontact":{"uuid":"e2c6eeae-a899-4258-840b-82dd3cdd4576","url":"http://localhost:8338/klantinteracties/api/v1/klantcontacten/e2c6eeae-a899-4258-840b-82dd3cdd4576","gingOverOnderwerpobjecten":[],"hadBetrokkenActoren":[],"omvatteBijlagen":[],"hadBetrokkenen":[],"leiddeTotInterneTaken":[],"nummer":"0000000001","kanaal":"contactformulier","onderwerp":"vraag","inhoud":"Dit
17+
is een vraag","indicatieContactGelukt":null,"taal":"nld","vertrouwelijk":true,"plaatsgevondenOp":"2025-11-21T12:08:44.795383Z"},"betrokkene":null,"onderwerpobject":null}'
18+
headers:
19+
API-version:
20+
- 0.4.1
21+
Allow:
22+
- POST, OPTIONS
23+
Content-Length:
24+
- '546'
25+
Content-Security-Policy:
26+
- 'img-src ''self'' data: cdn.redoc.ly; style-src ''self'' ''unsafe-inline''
27+
fonts.googleapis.com; form-action ''self''; object-src ''none''; script-src
28+
''self'' ''unsafe-inline''; base-uri ''self''; worker-src ''self'' blob:;
29+
frame-src ''self''; font-src ''self'' fonts.gstatic.com; default-src ''self'';
30+
frame-ancestors ''none'''
31+
Content-Type:
32+
- application/json
33+
Cross-Origin-Opener-Policy:
34+
- same-origin
35+
Referrer-Policy:
36+
- same-origin
37+
Vary:
38+
- origin
39+
X-Content-Type-Options:
40+
- nosniff
41+
X-Frame-Options:
42+
- DENY
43+
status:
44+
code: 201
45+
message: Created
46+
version: 1

tests/helpers.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class OpenKlantServiceManager:
2121
_api_root: str = "http://localhost:8338"
2222
_api_path: str = "/klantinteracties/api/v1"
2323
_api_token: str = "b2eb1da9861da88743d72a3fb4344288fe2cba44"
24-
_docker_compose_project_name: str = "openklant2-api-test"
24+
_docker_compose_project_name: str = "openklant-api-test"
2525
_docker_compose_path: Path = BASE_DIR / "docker-compose.yaml"
2626

2727
def _docker_compose(
@@ -34,7 +34,8 @@ def _docker_compose(
3434
try:
3535
return subprocess.run(
3636
args=[
37-
"docker-compose",
37+
"docker",
38+
"compose",
3839
"-f",
3940
str(self._docker_compose_path),
4041
"-p",

0 commit comments

Comments
 (0)