Skip to content

Commit

Permalink
[#2098] Implement redirect from contactmoment in case detail view
Browse files Browse the repository at this point in the history
  • Loading branch information
pi-sigma committed Mar 6, 2024
1 parent 623d61d commit 8f120d5
Show file tree
Hide file tree
Showing 10 changed files with 154 additions and 79 deletions.
1 change: 1 addition & 0 deletions src/open_inwoner/accounts/views/contactmoments.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ def get_context_data(self, **kwargs):
ctx["zaak"] = getattr(ocm, "object", None)

contactmoment: KCMDict = self.get_kcm_data(kcm)

ctx["contactmoment"] = contactmoment
ctx["metrics"] = [
{
Expand Down
74 changes: 49 additions & 25 deletions src/open_inwoner/cms/cases/tests/test_contactform.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from unittest.mock import patch

from django.conf import settings
from django.core import mail
from django.test import override_settings
Expand Down Expand Up @@ -296,15 +298,6 @@ def _setUpExtraMocks(self, m):
antwoord="",
text="hey!\n\nwaddup?",
)
self.objectcontactmoment = generate_oas_component_cached(
"cmc",
"schemas/ObjectContactMoment",
uuid="77880671-b88a-44ed-ba24-dc2ae688c2ec",
url=f"{CONTACTMOMENTEN_ROOT}objectcontactmomenten/77880671-b88a-44ed-ba24-dc2ae688c2ec",
object=self.zaak["url"],
object_type="zaak",
contactmoment=self.contactmoment["url"],
)
self.klant_contactmoment = generate_oas_component_cached(
"cmc",
"schemas/KlantContactMoment",
Expand Down Expand Up @@ -332,15 +325,16 @@ def _setUpExtraMocks(self, m):
self.contactmoment["url"],
json=self.contactmoment,
)
m.get(
f"{CONTACTMOMENTEN_ROOT}objectcontactmomenten?object={self.zaak['url']}",
json=paginated_response([self.objectcontactmoment]),
)

def test_form_is_shown_if_open_klant_api_configured(self, m):
@patch(
"open_inwoner.cms.cases.views.status.InnerCaseDetailView.get_objectcontactmomenten"
)
def test_form_is_shown_if_open_klant_api_configured(self, m, ocm_mock):
self._setUpMocks(m)
self._setUpExtraMocks(m)

ocm_mock.return_value = []

self.assertTrue(self.ok_config.has_api_configuration())

response = self.app.get(self.case_detail_url, user=self.user)
Expand All @@ -349,10 +343,15 @@ def test_form_is_shown_if_open_klant_api_configured(self, m):
self.assertTrue(response.context["case"]["contact_form_enabled"])
self.assertTrue(contact_form)

def test_form_is_shown_if_open_klant_email_configured(self, m):
@patch(
"open_inwoner.cms.cases.views.status.InnerCaseDetailView.get_objectcontactmomenten"
)
def test_form_is_shown_if_open_klant_email_configured(self, m, ocm_mock):
self._setUpMocks(m)
self._setUpExtraMocks(m)

ocm_mock.return_value = []

self.ok_config.register_email = "example@example.com"
self.ok_config.register_contact_moment = False
self.ok_config.save()
Expand All @@ -366,10 +365,15 @@ def test_form_is_shown_if_open_klant_email_configured(self, m):
self.assertTrue(response.context["case"]["contact_form_enabled"])
self.assertTrue(contact_form)

def test_form_is_shown_if_open_klant_email_and_api_configured(self, m):
@patch(
"open_inwoner.cms.cases.views.status.InnerCaseDetailView.get_objectcontactmomenten"
)
def test_form_is_shown_if_open_klant_email_and_api_configured(self, m, ocm_mock):
self._setUpMocks(m)
self._setUpExtraMocks(m)

ocm_mock.return_value = []

self.ok_config.register_email = "example@example.com"
self.ok_config.save()

Expand Down Expand Up @@ -402,10 +406,15 @@ def test_no_form_shown_if_open_klant_not_configured(self, m):
self.assertFalse(response.context["case"]["contact_form_enabled"])
self.assertFalse(contact_form)

def test_no_form_shown_if_contact_form_disabled(self, m):
@patch(
"open_inwoner.cms.cases.views.status.InnerCaseDetailView.get_objectcontactmomenten"
)
def test_no_form_shown_if_contact_form_disabled(self, m, ocm_mock):
self._setUpMocks(m)
self._setUpExtraMocks(m)

ocm_mock.return_value = []

CatalogusConfig.objects.all().delete()
self.zaak_type_config.delete()
self.zaak_type_config = ZaakTypeConfigFactory(
Expand All @@ -420,10 +429,15 @@ def test_no_form_shown_if_contact_form_disabled(self, m):
self.assertFalse(response.context["case"]["contact_form_enabled"])
self.assertFalse(contact_form)

def test_form_success_with_api(self, m):
@patch(
"open_inwoner.cms.cases.views.status.InnerCaseDetailView.get_objectcontactmomenten"
)
def test_form_success_with_api(self, m, ocm_mock):
self._setUpMocks(m)
self._setUpExtraMocks(m)

ocm_mock.return_value = []

response = self.app.get(self.case_detail_url, user=self.user)
form = response.forms["contact-form"]
form.action = reverse(
Expand Down Expand Up @@ -456,10 +470,15 @@ def test_form_success_with_api(self, m):
},
)

def test_form_success_with_api_eherkenning_user(self, m):
@patch(
"open_inwoner.cms.cases.views.status.InnerCaseDetailView.get_objectcontactmomenten"
)
def test_form_success_with_api_eherkenning_user(self, m, ocm_mock):
self._setUpMocks(m)
self._setUpExtraMocks(m)

ocm_mock.return_value = []

for use_rsin_for_innNnpId_query_parameter in [True, False]:
with self.subTest(
use_rsin_for_innNnpId_query_parameter=use_rsin_for_innNnpId_query_parameter
Expand Down Expand Up @@ -521,14 +540,14 @@ def test_form_success_with_api_eherkenning_user(self, m):
},
)

def test_form_success_with_email(self, m):
@patch(
"open_inwoner.cms.cases.views.status.InnerCaseDetailView.get_objectcontactmomenten"
)
def test_form_success_with_email(self, m, ocm_mock):
self._setUpMocks(m)
self._setUpExtraMocks(m)

m.get(
f"{CONTACTMOMENTEN_ROOT}objectcontactmomenten?object={self.zaak['url']}",
json=paginated_response([self.objectcontactmoment]),
)
ocm_mock.return_value = []

self.ok_config.register_email = "example@example.com"
self.ok_config.register_contact_moment = False
Expand Down Expand Up @@ -559,10 +578,15 @@ def test_form_success_with_email(self, m):
_("Contact formulier inzending vanaf Open Inwoner Platform"),
)

def test_form_success_with_both_email_and_api(self, m):
@patch(
"open_inwoner.cms.cases.views.status.InnerCaseDetailView.get_objectcontactmomenten"
)
def test_form_success_with_bearth_email_and_api(self, m, ocm_mock):
self._setUpMocks(m)
self._setUpExtraMocks(m)

ocm_mock.return_value = []

self.ok_config.register_email = "example@example.com"
self.ok_config.save()

Expand Down
20 changes: 5 additions & 15 deletions src/open_inwoner/cms/cases/tests/test_htmx.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,15 +277,6 @@ def setUp(self) -> None:
antwoord="",
text="hey!\n\nwaddup?",
)
self.objectcontactmoment = generate_oas_component_cached(
"cmc",
"schemas/ObjectContactMoment",
uuid="77880671-b88a-44ed-ba24-dc2ae688c2ec",
url=f"{CONTACTMOMENTEN_ROOT}objectcontactmomenten/77880671-b88a-44ed-ba24-dc2ae688c2ec",
object=self.zaak["url"],
object_type="zaak",
contactmoment=self.contactmoment["url"],
)
self.klant_contactmoment = generate_oas_component_cached(
"cmc",
"schemas/KlantContactMoment",
Expand Down Expand Up @@ -329,7 +320,6 @@ def _setUpMocks(self, m):
self.status_type_new,
self.status_type_finish,
self.contactmoment,
self.objectcontactmoment,
]:
m.get(resource["url"], json=resource)

Expand Down Expand Up @@ -417,13 +407,13 @@ def _setUpMocks(self, m):
),
]

def test_cases(self, m):
@patch(
"open_inwoner.cms.cases.views.status.InnerCaseDetailView.get_objectcontactmomenten"
)
def test_cases(self, m, ocm_mock):
self._setUpMocks(m)

m.get(
f"{CONTACTMOMENTEN_ROOT}objectcontactmomenten?object={self.zaak['url']}",
json=paginated_response([self.objectcontactmoment]),
)
ocm_mock.return_value = []

context = self.browser.new_context(storage_state=self.user_login_state)

Expand Down
6 changes: 6 additions & 0 deletions src/open_inwoner/cms/cases/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
CaseDocumentUploadFormView,
InnerCaseDetailView,
InnerCaseListView,
KCM_RedirectView,
OuterCaseDetailView,
OuterCaseListView,
)
Expand All @@ -28,6 +29,11 @@
KlantContactMomentDetailView.as_view(),
name="contactmoment_detail",
),
path(
"contactmoment/<str:uuid>/",
KCM_RedirectView.as_view(),
name="kcm_redirect",
),
path(
"<str:object_id>/document/<str:info_id>/",
CaseDocumentDownloadView.as_view(),
Expand Down
2 changes: 2 additions & 0 deletions src/open_inwoner/cms/cases/views/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
CaseDocumentDownloadView,
CaseDocumentUploadFormView,
InnerCaseDetailView,
KCM_RedirectView,
OuterCaseDetailView,
)

Expand All @@ -15,4 +16,5 @@
"CaseDocumentUploadFormView",
"InnerCaseDetailView",
"OuterCaseDetailView",
"KCM_RedirectView",
]
39 changes: 33 additions & 6 deletions src/open_inwoner/cms/cases/views/status.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from django.conf import settings
from django.contrib import messages
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.http import Http404, StreamingHttpResponse
from django.http import Http404, HttpResponseRedirect, StreamingHttpResponse
from django.urls import reverse
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _
Expand All @@ -20,6 +20,7 @@
from view_breadcrumbs import BaseBreadcrumbMixin
from zgw_consumers.api_models.constants import RolOmschrijving

from open_inwoner.accounts.views.contactmoments import KlantContactMomentAccessMixin
from open_inwoner.openklant.api_models import ObjectContactMoment
from open_inwoner.openklant.clients import (
ContactmomentenClient,
Expand Down Expand Up @@ -183,9 +184,6 @@ def get_context_data(self, **kwargs):
hooks.case_status_seen(self.request.user, self.case)
hooks.case_documents_seen(self.request.user, self.case)

# TODO: remove
from .. import dev_snippets

context["case"] = {
"id": str(self.case.uuid),
"identification": self.case.identification,
Expand All @@ -212,8 +210,7 @@ def get_context_data(self, **kwargs):
"created",
dt.timedelta(days=settings.DOCUMENT_RECENT_DAYS),
),
# "questions": [ocm.contactmoment for ocm in objectcontactmomenten],
"questions": dev_snippets.questions,
"questions": [ocm.contactmoment for ocm in objectcontactmomenten],
}
context["case"].update(self.get_upload_info_context(self.case))
context["anchors"] = self.get_anchors(statuses, documents)
Expand Down Expand Up @@ -646,6 +643,36 @@ def get_anchors(self, statuses, documents):
return anchors


class KCM_RedirectView(KlantContactMomentAccessMixin, View):
"""
Redirect to `KlantContactMomentDetailView` on the basis of contactmoment uuid
Case-related questions ("objectcontactmomenten") in the template contain links
to the contactmoment detail under "mijn-aanvragen/contactmomenten". For this,
we need to fetch the klantcontactomment uuid and pass it to the relevant view.
"""

def get(self, request, *args, **kwargs):
klanten_client = build_client_openklant("klanten")
contactmoment_client = build_client_openklant("contactmomenten")

klant = klanten_client.retrieve_klant(**get_fetch_parameters(self.request))
kcms = contactmoment_client.retrieve_klantcontactmomenten_for_klant(klant)

if not kcms:
raise Http404

contactmoment_uuid = kwargs["uuid"]
kcm = next((kcm for kcm in kcms if kcm.uuid == contactmoment_uuid))

if not kcm:
raise Http404

return HttpResponseRedirect(
reverse("cases:contactmoment_detail", kwargs={"kcm_uuid": kcm.uuid})
)


class CaseDocumentDownloadView(LogMixin, CaseAccessMixin, View):
def get(self, request, *args, **kwargs):
if not self.case:
Expand Down
25 changes: 2 additions & 23 deletions src/open_inwoner/openklant/tests/factories.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import factory
from zgw_consumers.api_models.base import factory as zgw_factory

from open_inwoner.openklant.api_models import ContactMoment

Expand All @@ -12,26 +13,4 @@ class Meta:


def make_contactmoment(contact_moment_data: dict):
return ContactMoment(
url=contact_moment_data["url"],
bronorganisatie=contact_moment_data["bronorganisatie"],
registratiedatum=contact_moment_data.get("registratiedatum", None),
kanaal=contact_moment_data.get("kanaal", ""),
tekst=contact_moment_data.get("tekst", ""),
medewerker_identificatie=contact_moment_data.get(
"medewerker_identificatie", None
),
identificatie=contact_moment_data.get("identificatie", ""),
type=contact_moment_data.get("type", ""),
onderwerp=contact_moment_data.get("onderwerp", ""),
status=contact_moment_data.get("status", ""),
antwoord=contact_moment_data.get("antwoord", ""),
# open-klant OAS
voorkeurskanaal=contact_moment_data.get("voorkeurskanaal", ""),
voorkeurstaal=contact_moment_data.get("voorkeurstaal", ""),
vorig_contactmoment=contact_moment_data.get("vorigContactmoment", None),
volgend_contactmoment=contact_moment_data.get("volgendContactmoment", None),
onderwerp_links=contact_moment_data.get("onderwerpLinks"),
initiatiefnemer=contact_moment_data.get("initiatiefnemer", ""),
medewerker=contact_moment_data.get("medewerker", ""),
)
return zgw_factory(ContactMoment, contact_moment_data)
Loading

0 comments on commit 8f120d5

Please sign in to comment.