Skip to content

Commit 7ad3588

Browse files
committed
[#4821] Fixed email digest for BRK and addressNL component
We want the email digest to report problems (broken configuration) for the addressNL component only when a valid BRK service and the validator are defined/configured. Backport-of: #4952
1 parent 2d29b9b commit 7ad3588

File tree

6 files changed

+179
-34
lines changed

6 files changed

+179
-34
lines changed

src/openforms/contrib/brk/service.py

+17-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,28 @@
1+
from glom import glom
2+
13
from openforms.forms.models.form import Form
24
from openforms.plugins.exceptions import InvalidPluginConfiguration
35

46
from .checks import BRKValidatorCheck
7+
from .models import BRKConfig
8+
from .validators import BRK_ZAKELIJK_GERECHTIGD_VALIDATOR_ID
59

610

711
def check_brk_config_for_addressNL() -> str:
812
live_forms = Form.objects.live()
913

10-
if any(form.has_component("addressNL") for form in live_forms):
11-
try:
12-
BRKValidatorCheck.check_config()
13-
except InvalidPluginConfiguration as e:
14-
return e.args[0]
14+
for form in live_forms:
15+
components = form.iter_components()
16+
for component in components:
17+
if (
18+
component["type"] == "addressNL"
19+
and (plugins := glom(component, "validate.plugins", default=[]))
20+
and BRK_ZAKELIJK_GERECHTIGD_VALIDATOR_ID in plugins
21+
and BRKConfig.get_solo().service
22+
):
23+
try:
24+
BRKValidatorCheck.check_config()
25+
except InvalidPluginConfiguration as e:
26+
return e.args[0]
1527

1628
return ""

src/openforms/contrib/brk/tests/base.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,18 @@
1212

1313
BRK_SERVICE = ServiceFactory.build(
1414
api_root="https://api.brk.kadaster.nl/esd-eto-apikey/bevragen/v2/",
15-
oas="https://api.brk.kadaster.nl/esd-eto-apikey/bevragen/v2/", # ignored/unused
1615
api_type=APITypes.orc,
1716
auth_type=AuthTypes.api_key,
1817
header_key="X-Api-Key",
1918
header_value=BRK_API_KEY,
2019
)
2120

21+
INVALID_BRK_SERVICE = ServiceFactory.build(
22+
api_root="https://api.brk.kadaster.nl/invalid",
23+
api_type=APITypes.orc,
24+
auth_type=AuthTypes.api_key,
25+
)
26+
2227

2328
class BRKTestMixin:
2429
api_root = BRK_SERVICE.api_root

src/openforms/contrib/brk/validators.py

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
logger = logging.getLogger(__name__)
2323

24+
BRK_ZAKELIJK_GERECHTIGD_VALIDATOR_ID = "brk-zakelijk-gerechtigd"
25+
2426

2527
@contextmanager
2628
def suppress_api_errors(error_message: str) -> Iterator[None]:

src/openforms/emails/tests/test_digest_functions.py

+140-20
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from zgw_consumers.test.factories import ServiceFactory
1515

1616
from openforms.contrib.brk.models import BRKConfig
17-
from openforms.contrib.brk.tests.base import BRK_SERVICE
17+
from openforms.contrib.brk.tests.base import BRK_SERVICE, INVALID_BRK_SERVICE
1818
from openforms.contrib.kadaster.models import KadasterApiConfig
1919
from openforms.forms.tests.factories import (
2020
FormFactory,
@@ -244,12 +244,119 @@ def test_timestamp_constraint_returns_no_results(self):
244244
@override_settings(LANGUAGE_CODE="en")
245245
class BrokenConfigurationTests(TestCase):
246246

247+
def test_no_addressNL_component_not_collected(self):
248+
FormFactory.create(
249+
generate_minimal_setup=True,
250+
formstep__form_definition__configuration={
251+
"components": [
252+
{
253+
"key": "textField",
254+
"type": "textfield",
255+
"label": "Text Field",
256+
}
257+
],
258+
},
259+
)
260+
261+
broken_configuration = collect_broken_configurations()
262+
263+
self.assertEqual(broken_configuration, [])
264+
265+
@patch(
266+
"openforms.contrib.brk.client.BRKConfig.get_solo",
267+
return_value=BRKConfig(service=None),
268+
)
269+
def test_no_brk_conf_for_addressnl_and_missing_validator_not_collected(self, m):
270+
FormFactory.create(
271+
generate_minimal_setup=True,
272+
formstep__form_definition__configuration={
273+
"components": [
274+
{
275+
"key": "addressNl",
276+
"type": "addressNL",
277+
"label": "AddressNL",
278+
"defaultValue": {
279+
"postcode": "",
280+
"houseLetter": "",
281+
"houseNumber": "",
282+
"houseNumberAddition": "",
283+
},
284+
}
285+
],
286+
},
287+
)
288+
289+
broken_configuration = collect_broken_configurations()
290+
291+
self.assertEqual(broken_configuration, [])
292+
293+
@patch(
294+
"openforms.contrib.brk.client.BRKConfig.get_solo",
295+
return_value=BRKConfig(service=None),
296+
)
297+
def test_no_brk_conf_for_addressnl_and_existing_validator_not_collected(self, m):
298+
FormFactory.create(
299+
generate_minimal_setup=True,
300+
formstep__form_definition__configuration={
301+
"components": [
302+
{
303+
"key": "addressNl",
304+
"type": "addressNL",
305+
"label": "AddressNL",
306+
"defaultValue": {
307+
"postcode": "",
308+
"houseLetter": "",
309+
"houseNumber": "",
310+
"houseNumberAddition": "",
311+
},
312+
"validate": {"plugins": ["brk-zakelijk-gerechtigd"]},
313+
}
314+
],
315+
},
316+
)
317+
318+
broken_configuration = collect_broken_configurations()
319+
320+
self.assertEqual(broken_configuration, [])
321+
322+
@patch(
323+
"openforms.contrib.brk.client.BRKConfig.get_solo",
324+
return_value=BRKConfig(service=BRK_SERVICE),
325+
)
326+
def test_valid_brk_conf_for_addressnl_and_missing_validator_not_collected(
327+
self, brk_config
328+
):
329+
FormFactory.create(
330+
generate_minimal_setup=True,
331+
formstep__form_definition__configuration={
332+
"components": [
333+
{
334+
"key": "addressNl",
335+
"type": "addressNL",
336+
"label": "AddressNL",
337+
"defaultValue": {
338+
"postcode": "",
339+
"houseLetter": "",
340+
"houseNumber": "",
341+
"houseNumberAddition": "",
342+
},
343+
}
344+
],
345+
},
346+
)
347+
348+
broken_configuration = collect_broken_configurations()
349+
350+
self.assertEqual(broken_configuration, [])
351+
247352
@patch(
248353
"openforms.contrib.brk.client.BRKConfig.get_solo",
249354
return_value=BRKConfig(service=BRK_SERVICE),
250355
)
251356
@requests_mock.Mocker()
252-
def test_valid_brk_congiguration_for_addressNL_not_collected(self, brk_config, m):
357+
def test_valid_brk_conf_for_addressnl_and_existing_validator_not_collected(
358+
self, brk_config, m
359+
):
253360
FormFactory.create(
254361
generate_minimal_setup=True,
255362
formstep__form_definition__configuration={
@@ -264,6 +371,7 @@ def test_valid_brk_congiguration_for_addressNL_not_collected(self, brk_config, m
264371
"houseNumber": "",
265372
"houseNumberAddition": "",
266373
},
374+
"validate": {"plugins": ["brk-zakelijk-gerechtigd"]},
267375
}
268376
],
269377
},
@@ -280,9 +388,11 @@ def test_valid_brk_congiguration_for_addressNL_not_collected(self, brk_config, m
280388

281389
@patch(
282390
"openforms.contrib.brk.client.BRKConfig.get_solo",
283-
return_value=BRKConfig(service=None),
391+
return_value=BRKConfig(service=INVALID_BRK_SERVICE),
284392
)
285-
def test_invalid_brk_configuration_for_addressNL_is_collected(self, brk_config):
393+
def test_invalid_brk_conf_for_addressnl_and_missing_validator_not_collected(
394+
self, brk_config
395+
):
286396
FormFactory.create(
287397
generate_minimal_setup=True,
288398
formstep__form_definition__configuration={
@@ -304,30 +414,45 @@ def test_invalid_brk_configuration_for_addressNL_is_collected(self, brk_config):
304414

305415
broken_configuration = collect_broken_configurations()
306416

307-
self.assertEqual(len(broken_configuration), 1)
308-
self.assertEqual(broken_configuration[0].config_name, "BRK Client")
417+
self.assertEqual(broken_configuration, [])
309418

310419
@patch(
311420
"openforms.contrib.brk.client.BRKConfig.get_solo",
312-
return_value=BRKConfig(service=None),
421+
return_value=BRKConfig(service=INVALID_BRK_SERVICE),
313422
)
314-
def test_invalid_brk_congiguration_but_unused_not_collected(self, brk_config):
423+
@requests_mock.Mocker()
424+
def test_invalid_brk_conf_for_addressnl_and_existing_validator_collected(
425+
self, brk_config, m
426+
):
315427
FormFactory.create(
316428
generate_minimal_setup=True,
317429
formstep__form_definition__configuration={
318430
"components": [
319431
{
320-
"key": "textField",
321-
"type": "textfield",
322-
"label": "Text Field",
432+
"key": "addressNl",
433+
"type": "addressNL",
434+
"label": "AddressNL",
435+
"defaultValue": {
436+
"postcode": "",
437+
"houseLetter": "",
438+
"houseNumber": "",
439+
"houseNumberAddition": "",
440+
},
441+
"validate": {"plugins": ["brk-zakelijk-gerechtigd"]},
323442
}
324443
],
325444
},
326445
)
327446

447+
m.get(
448+
"https://api.brk.kadaster.nl/invalid/kadastraalonroerendezaken?postcode=1234AB&huisnummer=1",
449+
status_code=400,
450+
)
451+
328452
broken_configuration = collect_broken_configurations()
329453

330-
self.assertEqual(broken_configuration, [])
454+
self.assertEqual(len(broken_configuration), 1)
455+
self.assertEqual(broken_configuration[0].config_name, "BRK Client")
331456

332457
@patch(
333458
"openforms.contrib.kadaster.models.KadasterApiConfig.get_solo",
@@ -464,10 +589,8 @@ def test_invalid_bag_configuration_for_address_nl_component_is_collected(
464589

465590
broken_configuration = collect_broken_configurations()
466591

467-
self.assertEqual(len(broken_configuration), 2)
468-
self.assertIn(
469-
"BAG Client", [config.config_name for config in broken_configuration]
470-
)
592+
self.assertEqual(len(broken_configuration), 1)
593+
self.assertEqual(broken_configuration[0].config_name, "BAG Client")
471594

472595
@patch("openforms.contrib.kadaster.models.KadasterApiConfig.get_solo")
473596
def test_invalid_bag_configuration_for_address_nl_component_not_collected_when_disabled(
@@ -491,10 +614,7 @@ def test_invalid_bag_configuration_for_address_nl_component_not_collected_when_d
491614

492615
broken_configuration = collect_broken_configurations()
493616

494-
self.assertEqual(len(broken_configuration), 1)
495-
self.assertNotIn(
496-
"BAG Client", [config.config_name for config in broken_configuration]
497-
)
617+
self.assertEqual(len(broken_configuration), 0)
498618

499619

500620
@override_settings(LANGUAGE_CODE="en")

src/openforms/emails/tests/test_tasks_integration.py

+14-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from django.test import TestCase, override_settings
88
from django.urls import reverse
99

10+
import requests_mock
1011
from django_yubin.models import Message
1112
from freezegun import freeze_time
1213
from furl import furl
@@ -15,6 +16,7 @@
1516

1617
from openforms.config.models import GlobalConfiguration
1718
from openforms.contrib.brk.models import BRKConfig
19+
from openforms.contrib.brk.tests.base import INVALID_BRK_SERVICE
1820
from openforms.forms.tests.factories import (
1921
FormFactory,
2022
FormLogicFactory,
@@ -118,11 +120,14 @@ def test_no_email_sent_if_no_recipients(self, mock_global_config):
118120

119121
@patch(
120122
"openforms.contrib.brk.client.BRKConfig.get_solo",
121-
return_value=BRKConfig(service=None),
123+
return_value=BRKConfig(service=INVALID_BRK_SERVICE),
122124
)
123125
@freeze_time("2023-01-03T01:00:00+01:00")
124126
@override_settings(BASE_URL="http://testserver")
125-
def test_email_sent_when_there_are_failures(self, mock_global_config, brk_config):
127+
@requests_mock.Mocker()
128+
def test_email_sent_when_there_are_failures(
129+
self, mock_global_config, brk_config, m
130+
):
126131
"""Integration test for all the possible failures
127132
128133
- failed emails
@@ -147,6 +152,7 @@ def test_email_sent_when_there_are_failures(self, mock_global_config, brk_config
147152
"houseNumber": "",
148153
"houseNumberAddition": "",
149154
},
155+
"validate": {"plugins": ["brk-zakelijk-gerechtigd"]},
150156
}
151157
],
152158
},
@@ -200,6 +206,11 @@ def test_email_sent_when_there_are_failures(self, mock_global_config, brk_config
200206
)
201207
ServiceFactory.create(client_certificate=certificate)
202208

209+
m.get(
210+
"https://api.brk.kadaster.nl/invalid/kadastraalonroerendezaken?postcode=1234AB&huisnummer=1",
211+
status_code=400,
212+
)
213+
203214
# send the email digest
204215
send_email_digest()
205216
sent_email = mail.outbox[-1]
@@ -250,7 +261,7 @@ def test_email_sent_when_there_are_failures(self, mock_global_config, brk_config
250261

251262
with self.subTest("broken configuration"):
252263
self.assertIn(
253-
"The configuration for 'BRK Client' is invalid (KVK endpoint is not configured).",
264+
"The configuration for 'BRK Client' is invalid",
254265
sent_email.body,
255266
)
256267

src/openforms/forms/models/form.py

-5
Original file line numberDiff line numberDiff line change
@@ -629,11 +629,6 @@ def deactivate(self):
629629
logger.debug("Deactivating form %s", self.admin_name)
630630
self.save(update_fields=["active", "deactivate_on"])
631631

632-
def has_component(self, component_type: str) -> bool:
633-
return any(
634-
component["type"] == component_type for component in self.iter_components()
635-
)
636-
637632

638633
class FormsExportQuerySet(DeleteFilesQuerySetMixin, models.QuerySet):
639634
pass

0 commit comments

Comments
 (0)