Skip to content

Commit 0d82080

Browse files
authored
Merge pull request #1490 from maykinmedia/task/2862-openklant2-detail-view
[#2862] Integrate OpenKlant2 service with detail views
2 parents f03df81 + 96fb5c0 commit 0d82080

File tree

18 files changed

+749
-426
lines changed

18 files changed

+749
-426
lines changed

src/open_inwoner/accounts/views/contactmoments.py

+35-26
Original file line numberDiff line numberDiff line change
@@ -91,18 +91,18 @@ class KlantContactMomentBaseView(
9191
CommonPageMixin, BaseBreadcrumbMixin, KlantContactMomentAccessMixin, TemplateView
9292
):
9393
def get_service(self, service_type: KlantenServiceType) -> VragenService | None:
94+
if service_type == KlantenServiceType.OPENKLANT2:
95+
try:
96+
return OpenKlant2Service()
97+
except ImproperlyConfigured:
98+
logger.error("OpenKlant2 configuration missing")
9499
if service_type == KlantenServiceType.ESUITE:
95100
try:
96101
return eSuiteVragenService()
97102
except ImproperlyConfigured:
98103
logger.error("eSuiteVragenService configuration missing")
99-
elif service_type == KlantenServiceType.OPENKLANT2:
100-
try:
101-
return OpenKlant2Service()
102-
except ImproperlyConfigured:
103-
logger.error("OpenKlant2 configuration missing")
104104
except RuntimeError:
105-
logger.error("Failed to build OpenKlant2Service")
105+
logger.error("Failed to build eSuiteVragenService")
106106

107107
def get_context_data(self, **kwargs):
108108
ctx = super().get_context_data(**kwargs)
@@ -146,24 +146,24 @@ def get_context_data(self, **kwargs):
146146
ctx = super().get_context_data(**kwargs)
147147

148148
questions = []
149-
if esuite_service := self.get_service(service_type=KlantenServiceType.ESUITE):
149+
if ok2_service := self.get_service(service_type=KlantenServiceType.OPENKLANT2):
150150
questions.extend(
151-
esuite_service.list_questions(
152-
fetch_params=self.get_fetch_params(esuite_service),
151+
ok2_service.list_questions(
152+
self.get_fetch_params(ok2_service),
153153
user=self.request.user,
154154
)
155155
)
156-
if ok2_service := self.get_service(service_type=KlantenServiceType.OPENKLANT2):
156+
if esuite_service := self.get_service(service_type=KlantenServiceType.ESUITE):
157157
questions.extend(
158-
ok2_service.list_questions(
159-
self.get_fetch_params(ok2_service),
158+
esuite_service.list_questions(
159+
fetch_params=self.get_fetch_params(esuite_service),
160160
user=self.request.user,
161161
)
162162
)
163163
questions.sort(key=lambda q: q["registered_date"], reverse=True)
164-
ctx["contactmomenten"] = questions
164+
ctx["questions"] = questions
165165

166-
paginator_dict = self.paginate_with_context(ctx["contactmomenten"])
166+
paginator_dict = self.paginate_with_context(ctx["questions"])
167167
ctx.update(paginator_dict)
168168

169169
return ctx
@@ -187,25 +187,28 @@ def get_anchors(self) -> list:
187187

188188
def get_context_data(self, **kwargs):
189189
ctx = super().get_context_data(**kwargs)
190-
service = self.get_service(service_type=KlantenServiceType.ESUITE)
191190

192-
kcm, zaak = service.retrieve_question(
191+
if KlantenServiceType.ESUITE.value in self.request.path:
192+
service = self.get_service(service_type=KlantenServiceType.ESUITE)
193+
elif KlantenServiceType.OPENKLANT2.value in self.request.path:
194+
service = self.get_service(service_type=KlantenServiceType.OPENKLANT2)
195+
196+
question, zaak = service.retrieve_question(
193197
self.get_fetch_params(service), kwargs["kcm_uuid"], user=self.request.user
194198
)
195-
if not kcm:
199+
if not question:
196200
raise Http404()
197201

198-
QuestionValidator.validate_python(kcm)
202+
QuestionValidator.validate_python(question)
199203

200204
local_kcm, created = KlantContactMomentAnswer.objects.get_or_create( # noqa
201-
user=self.request.user, contactmoment_url=kcm["case_detail_url"]
205+
user=self.request.user, contactmoment_url=question["api_source_url"]
202206
)
203207
if not local_kcm.is_seen:
204208
local_kcm.is_seen = True
205209
local_kcm.save()
206210

207-
contactmoment = kcm
208-
ctx["contactmoment"] = contactmoment
211+
ctx["question"] = question
209212
ctx["zaak"] = zaak.zaak if zaak else None
210213
case_url = (
211214
reverse(
@@ -221,19 +224,19 @@ def get_context_data(self, **kwargs):
221224
ctx["metrics"] = [
222225
{
223226
"label": _("Status: "),
224-
"value": contactmoment["status"],
227+
"value": question["status"].capitalize(),
225228
},
226229
{
227230
"label": _("Ingediend op: "),
228-
"value": contactmoment["registered_date"],
231+
"value": question["registered_date"],
229232
},
230233
{
231234
"label": _("Vraag nummer: "),
232-
"value": contactmoment["identification"],
235+
"value": question["identification"],
233236
},
234237
{
235238
"label": _("Contact gehad via: "),
236-
"value": contactmoment["channel"],
239+
"value": question["channel"].capitalize(),
237240
},
238241
]
239242
origin = self.request.headers.get("Referer")
@@ -284,5 +287,11 @@ def get(self, request, *args, **kwargs):
284287
raise Http404
285288

286289
return HttpResponseRedirect(
287-
reverse("cases:contactmoment_detail", kwargs={"kcm_uuid": kcm.uuid})
290+
reverse(
291+
"cases:contactmoment_detail",
292+
kwargs={
293+
"api_service": KlantenServiceType.ESUITE.value,
294+
"kcm_uuid": kcm.uuid,
295+
},
296+
)
288297
)

src/open_inwoner/cms/cases/urls.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
name="contactmoment_list",
2727
),
2828
path(
29-
"contactmomenten/<str:kcm_uuid>/",
29+
"contactmomenten/<str:api_service>/<str:kcm_uuid>/",
3030
KlantContactMomentDetailView.as_view(),
3131
name="contactmoment_detail",
3232
),

src/open_inwoner/cms/cases/views/status.py

+53-38
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,15 @@
33
import logging
44
from collections import defaultdict
55
from datetime import datetime
6+
from typing import Iterable, Protocol
67

78
from django.conf import settings
89
from django.contrib import messages
9-
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
10+
from django.core.exceptions import (
11+
ImproperlyConfigured,
12+
ObjectDoesNotExist,
13+
PermissionDenied,
14+
)
1015
from django.http import (
1116
Http404,
1217
HttpRequest,
@@ -20,19 +25,21 @@
2025
from django.views.generic import FormView, TemplateView
2126

2227
from django_htmx.http import HttpResponseClientRedirect
23-
from glom import glom
2428
from mail_editor.helpers import find_template
2529
from view_breadcrumbs import BaseBreadcrumbMixin
2630
from zgw_consumers.api_models.constants import RolOmschrijving
2731

32+
from open_inwoner.accounts.models import User
2833
from open_inwoner.mail.service import send_contact_confirmation_mail
34+
from open_inwoner.openklant.constants import KlantenServiceType
2935
from open_inwoner.openklant.models import OpenKlantConfig
30-
from open_inwoner.openklant.services import eSuiteKlantenService, eSuiteVragenService
31-
from open_inwoner.openklant.wrap import (
32-
contactmoment_has_new_answer,
33-
get_fetch_parameters,
34-
get_kcm_answer_mapping,
36+
from open_inwoner.openklant.services import (
37+
OpenKlant2Service,
38+
Question,
39+
eSuiteKlantenService,
40+
eSuiteVragenService,
3541
)
42+
from open_inwoner.openklant.wrap import get_fetch_parameters
3643
from open_inwoner.openzaak.api_models import Status, StatusType, Zaak
3744
from open_inwoner.openzaak.clients import CatalogiClient, ZakenClient
3845
from open_inwoner.openzaak.documents import (
@@ -67,6 +74,15 @@ class SimpleFile:
6774
created: datetime | None = None
6875

6976

77+
class VragenService(Protocol):
78+
def list_questions_for_zaak(
79+
self,
80+
zaak: Zaak,
81+
user: User | None = None,
82+
) -> Iterable[Question]: # noqa: E704
83+
...
84+
85+
7086
class OuterCaseDetailView(
7187
OuterCaseAccessMixin, CommonPageMixin, BaseBreadcrumbMixin, TemplateView
7288
):
@@ -110,6 +126,20 @@ class InnerCaseDetailView(
110126
contact_form_class = CaseContactForm
111127
case: Zaak | None = None
112128

129+
def get_service(self, service_type: KlantenServiceType) -> VragenService | None:
130+
if service_type == KlantenServiceType.OPENKLANT2:
131+
try:
132+
return OpenKlant2Service()
133+
except ImproperlyConfigured:
134+
logger.error("OpenKlant2 configuration missing")
135+
if service_type == KlantenServiceType.ESUITE:
136+
try:
137+
return eSuiteVragenService()
138+
except ImproperlyConfigured:
139+
logger.error("eSuiteVragenService configuration missing")
140+
except RuntimeError:
141+
logger.error("Failed to build eSuiteVragenService")
142+
113143
def store_statustype_mapping(self, zaaktype_identificatie):
114144
# Filter on ZaakType identificatie to avoid eSuite situation where one statustype
115145
# is linked to multiple zaaktypes
@@ -151,7 +181,6 @@ def get_context_data(self, **kwargs):
151181
self.log_access_case_detail(self.case)
152182

153183
openzaak_config = OpenZaakConfig.get_solo()
154-
openklant_config = OpenKlantConfig.get_solo()
155184

156185
api_group = ZGWApiGroupConfig.objects.get(pk=self.kwargs["api_group_id"])
157186
zaken_client = api_group.zaken_client
@@ -162,38 +191,24 @@ def get_context_data(self, **kwargs):
162191
self.store_statustype_mapping(self.case.zaaktype.identificatie)
163192
self.store_resulttype_mapping(self.case.zaaktype.identificatie)
164193

165-
# questions/E-suite contactmomenten
166-
try:
167-
service = eSuiteVragenService(config=openklant_config)
168-
except RuntimeError:
169-
logger.error("Failed to build eSuiteVragenService")
170-
objectcontactmomenten = []
171-
else:
172-
objectcontactmomenten = service.retrieve_objectcontactmomenten_for_zaak(
173-
self.case
174-
)
175-
176194
questions = []
177-
for ocm in objectcontactmomenten:
178-
question = getattr(ocm, "contactmoment", None)
179-
if question:
180-
questions.append(question)
181-
questions.sort(key=lambda q: q.registratiedatum, reverse=True)
182-
183-
kcm_answer_mapping = get_kcm_answer_mapping(questions, self.request.user)
184-
for question in questions:
185-
question.new_answer_available = contactmoment_has_new_answer(
186-
question, kcm_answer_mapping
195+
if ok2_service := self.get_service(
196+
service_type=KlantenServiceType.OPENKLANT2
197+
):
198+
questions.extend(
199+
ok2_service.list_questions_for_zaak(
200+
self.case, user=self.request.user
201+
)
187202
)
188-
189-
# filter questions
190-
openklant_config = OpenKlantConfig.get_solo()
191-
if exclude_range := openklant_config.exclude_contactmoment_kanalen:
192-
questions = [
193-
item
194-
for item in questions
195-
if glom(item, "kanaal") not in exclude_range
196-
]
203+
if esuite_service := self.get_service(
204+
service_type=KlantenServiceType.ESUITE
205+
):
206+
questions.extend(
207+
esuite_service.list_questions_for_zaak(
208+
self.case, user=self.request.user
209+
)
210+
)
211+
questions.sort(key=lambda q: q["registered_date"], reverse=True)
197212

198213
statustypen = []
199214
catalogi_client = api_group.catalogi_client

0 commit comments

Comments
 (0)