Skip to content

Commit

Permalink
Merge pull request #1106 from maykinmedia/feature/2106-contact-confir…
Browse files Browse the repository at this point in the history
…mation-email

[#2106, #2203] Implemented 'contactform_confirmation' email
  • Loading branch information
alextreme authored Apr 18, 2024
2 parents 62ca15a + 07e9dbd commit 5fb2e4e
Show file tree
Hide file tree
Showing 10 changed files with 296 additions and 49 deletions.
92 changes: 82 additions & 10 deletions src/open_inwoner/cms/cases/tests/test_contactform.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from unittest.mock import patch
from unittest.mock import ANY, patch

from django.conf import settings
from django.core import mail
Expand Down Expand Up @@ -42,6 +42,9 @@


@requests_mock.Mocker()
@patch(
"open_inwoner.cms.cases.views.status.send_contact_confirmation_mail", autospec=True
)
@patch.object(
ContactmomentenClient,
"retrieve_objectcontactmomenten_for_zaak",
Expand Down Expand Up @@ -81,6 +84,7 @@ def setUp(self):

# openklant config
self.ok_config = OpenKlantConfig.get_solo()
self.ok_config.send_email_confirmation = True
self.ok_config.register_contact_moment = True
self.ok_config.register_bronorganisatie_rsin = "123456788"
self.ok_config.register_type = "Melding"
Expand Down Expand Up @@ -330,7 +334,9 @@ def _setUpExtraMocks(self, m):
json=self.contactmoment,
)

def test_form_is_shown_if_open_klant_api_configured(self, m, contactmoment_mock):
def test_form_is_shown_if_open_klant_api_configured(
self, m, mock_contactmoment, mock_send_confirm
):
self._setUpMocks(m)
self._setUpExtraMocks(m)

Expand All @@ -342,7 +348,11 @@ def test_form_is_shown_if_open_klant_api_configured(self, m, contactmoment_mock)
self.assertTrue(response.context["case"]["contact_form_enabled"])
self.assertTrue(contact_form)

def test_form_is_shown_if_open_klant_email_configured(self, m, contactmoment_mock):
mock_send_confirm.assert_not_called()

def test_form_is_shown_if_open_klant_email_configured(
self, m, mock_contactmoment, mock_send_confirm
):
self._setUpMocks(m)
self._setUpExtraMocks(m)

Expand All @@ -359,8 +369,10 @@ def test_form_is_shown_if_open_klant_email_configured(self, m, contactmoment_moc
self.assertTrue(response.context["case"]["contact_form_enabled"])
self.assertTrue(contact_form)

mock_send_confirm.assert_not_called()

def test_form_is_shown_if_open_klant_email_and_api_configured(
self, m, contactmoment_mock
self, m, mock_contactmoment, mock_send_confirm
):
self._setUpMocks(m)
self._setUpExtraMocks(m)
Expand All @@ -377,7 +389,11 @@ def test_form_is_shown_if_open_klant_email_and_api_configured(
self.assertTrue(response.context["case"]["contact_form_enabled"])
self.assertTrue(contact_form)

def test_no_form_shown_if_open_klant_not_configured(self, m, contactmoment_mock):
mock_send_confirm.assert_not_called()

def test_no_form_shown_if_open_klant_not_configured(
self, m, mock_contactmoment, mock_send_confirm
):
self._setUpMocks(m)

# reset
Expand All @@ -397,7 +413,11 @@ def test_no_form_shown_if_open_klant_not_configured(self, m, contactmoment_mock)
self.assertFalse(response.context["case"]["contact_form_enabled"])
self.assertFalse(contact_form)

def test_no_form_shown_if_contact_form_disabled(self, m, contactmoment_mock):
mock_send_confirm.assert_not_called()

def test_no_form_shown_if_contact_form_disabled(
self, m, mock_contactmoment, mock_send_confirm
):
self._setUpMocks(m)
self._setUpExtraMocks(m)

Expand All @@ -415,7 +435,9 @@ def test_no_form_shown_if_contact_form_disabled(self, m, contactmoment_mock):
self.assertFalse(response.context["case"]["contact_form_enabled"])
self.assertFalse(contact_form)

def test_form_success_with_api(self, m, contactmoment_mock):
mock_send_confirm.assert_not_called()

def test_form_success_with_api(self, m, mock_contactmoment, mock_send_confirm):
self._setUpMocks(m)
self._setUpExtraMocks(m)

Expand Down Expand Up @@ -450,8 +472,11 @@ def test_form_success_with_api(self, m, contactmoment_mock):
"type": "Melding",
},
)
mock_send_confirm.assert_called_once_with("[email protected]", ANY)

def test_form_success_with_api_eherkenning_user(self, m, contactmoment_mock):
def test_form_success_with_api_eherkenning_user(
self, m, mock_contactmoment, mock_send_confirm
):
self._setUpMocks(m)
self._setUpExtraMocks(m)

Expand Down Expand Up @@ -515,8 +540,12 @@ def test_form_success_with_api_eherkenning_user(self, m, contactmoment_mock):
"type": "Melding",
},
)
# user was modified in loop
eherkenning_user.refresh_from_db()
mock_send_confirm.assert_called_once_with(eherkenning_user.email, ANY)
mock_send_confirm.reset_mock()

def test_form_success_with_email(self, m, contactmoment_mock):
def test_form_success_with_email(self, m, mock_contactmoment, mock_send_confirm):
self._setUpMocks(m)
self._setUpExtraMocks(m)

Expand Down Expand Up @@ -548,8 +577,11 @@ def test_form_success_with_email(self, m, contactmoment_mock):
message.subject,
_("Contact formulier inzending vanaf Open Inwoner Platform"),
)
mock_send_confirm.assert_called_once_with("[email protected]", ANY)

def test_form_success_with_both_email_and_api(self, m, contactmoment_mock):
def test_form_success_with_both_email_and_api(
self, m, mock_contactmoment, mock_send_confirm
):
self._setUpMocks(m)
self._setUpExtraMocks(m)

Expand All @@ -575,3 +607,43 @@ def test_form_success_with_both_email_and_api(self, m, contactmoment_mock):
self.assertEqual(redirect_messages[0].message, _("Vraag verstuurd!"))
self.assertMockMatchersCalled(self.extra_matchers)
self.assertEqual(len(mail.outbox), 1)

mock_send_confirm.assert_called_once_with("[email protected]", ANY)

def test_send_email_confirmation_is_configurable__send_enabled(
self, m, mock_contactmoment, mock_send_confirm
):
self._setUpMocks(m)
self._setUpExtraMocks(m)

config = OpenKlantConfig.get_solo()
config.send_email_confirmation = True
config.save()

response = self.app.get(self.case_detail_url, user=self.user)
form = response.forms["contact-form"]
form.action = reverse(
"cases:case_detail_contact_form", kwargs={"object_id": self.zaak["uuid"]}
)
form["question"] = "Sample text"
response = form.submit()
mock_send_confirm.assert_called_once()

def test_send_email_confirmation_is_configurable__send_disabled(
self, m, mock_contactmoment, mock_send_confirm
):
self._setUpMocks(m)
self._setUpExtraMocks(m)

config = OpenKlantConfig.get_solo()
config.send_email_confirmation = False
config.save()

response = self.app.get(self.case_detail_url, user=self.user)
form = response.forms["contact-form"]
form.action = reverse(
"cases:case_detail_contact_form", kwargs={"object_id": self.zaak["uuid"]}
)
form["question"] = "Sample text"
response = form.submit()
mock_send_confirm.assert_not_called()
33 changes: 22 additions & 11 deletions src/open_inwoner/cms/cases/views/status.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from view_breadcrumbs import BaseBreadcrumbMixin
from zgw_consumers.api_models.constants import RolOmschrijving

from open_inwoner.mail.service import send_contact_confirmation_mail
from open_inwoner.openklant.clients import build_client as build_client_openklant
from open_inwoner.openklant.models import OpenKlantConfig
from open_inwoner.openklant.wrap import (
Expand Down Expand Up @@ -831,18 +832,30 @@ def post(self, request, *args, **kwargs):
if form.is_valid():
config = OpenKlantConfig.get_solo()

success = True
email_success = False
api_success = False
send_confirmation = False

if config.register_email:
form.cleaned_data[
"question"
] += f"\n\nCase number: {self.case.identificatie}"
success = (
self.register_by_email(form, config.register_email) and success
)
email_success = self.register_by_email(form, config.register_email)
send_confirmation = email_success

if config.register_contact_moment:
success = self.register_by_api(form, config) and success
api_success = self.register_by_api(form, config)
if api_success:
send_confirmation = config.send_email_confirmation
# else keep the send_confirmation if email set it

if send_confirmation:
subject = _("Case: {case_identification}").format(
case_identification=self.case.identificatie
)
send_contact_confirmation_mail(self.request.user.email, subject)

self.get_result_message(success=success)
self.set_result_message(email_success or api_success)

return HttpResponseClientRedirect(
reverse("cases:case_detail", kwargs={"object_id": str(self.case.uuid)})
Expand All @@ -855,13 +868,11 @@ def get_success_url(self):
"cases:case_detail_contact_form", kwargs={"object_id": str(self.case.uuid)}
)

def get_result_message(self, success=False):
def set_result_message(self, success: bool):
if success:
return messages.add_message(
self.request, messages.SUCCESS, _("Vraag verstuurd!")
)
messages.add_message(self.request, messages.SUCCESS, _("Vraag verstuurd!"))
else:
return messages.add_message(
messages.add_message(
self.request,
messages.ERROR,
_("Probleem bij versturen van de vraag."),
Expand Down
1 change: 1 addition & 0 deletions src/open_inwoner/cms/footer/tests/test_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ def setUp(self):
config.register_bronorganisatie_rsin = ""
config.register_type = ""
config.register_employee_id = ""
config.send_email_confirmation = True
config.save()

def test_no_form_link_shown_in_footer_if_not_has_configuration(self):
Expand Down
9 changes: 9 additions & 0 deletions src/open_inwoner/mail/service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from mail_editor.helpers import find_template


def send_contact_confirmation_mail(recipient_email: str, form_subject: str):
template = find_template("contactform_confirmation")
context = {
"subject": form_subject,
}
template.send_email([recipient_email], context=context)
18 changes: 18 additions & 0 deletions src/open_inwoner/mail/tests/test_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from django.core import mail
from django.test import TestCase

from open_inwoner.mail.service import send_contact_confirmation_mail


class TestServices(TestCase):
def test_send_contact_confirmation_mail(self):
send_contact_confirmation_mail("[email protected]", "My subject")

self.assertEqual(len(mail.outbox), 1)

sent_mail = mail.outbox[0]
html_body = sent_mail.alternatives[0][0]

self.assertIn("Vraag ontvangen op ", sent_mail.subject)
self.assertEqual(sent_mail.to, ["[email protected]"])
self.assertIn("My subject", html_body)
1 change: 1 addition & 0 deletions src/open_inwoner/openklant/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ class OpenKlantConfigAdmin(OrderedInlineModelAdminMixin, SingletonModelAdmin):
"register_channel",
"register_employee_id",
"use_rsin_for_innNnpId_query_parameter",
"send_email_confirmation",
],
},
),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 4.2.11 on 2024-04-18 07:57

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
(
"openklant",
"0011_alter_openklantconfig_use_rsin_for_innnnpid_query_parameter",
),
]

operations = [
migrations.AddField(
model_name="openklantconfig",
name="send_email_confirmation",
field=models.BooleanField(
default=False,
help_text="If enabled the 'contactform_confirmation' email template will be sent. If disabled the external API will send a confirmation email.",
verbose_name="Stuur contactformulier e-mailbevestiging",
),
),
]
8 changes: 8 additions & 0 deletions src/open_inwoner/openklant/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,14 @@ class OpenKlantConfig(SingletonModel):
),
default=False,
)
send_email_confirmation = models.BooleanField(
verbose_name=_("Stuur contactformulier e-mailbevestiging"),
help_text=_(
"If enabled the 'contactform_confirmation' email template will be sent. "
"If disabled the external API will send a confirmation email."
),
default=False,
)

register_api_required_fields = (
"register_contact_moment",
Expand Down
Loading

0 comments on commit 5fb2e4e

Please sign in to comment.