Skip to content

Commit 98b592e

Browse files
authored
Merge pull request #354 from maykinmedia/fix/948-esuite-zaak-bsn-roles-query
[#948] Harden `fetch_roles_for_case_and_bsn()` to work with e-Suite
2 parents 348165a + f9f61fc commit 98b592e

File tree

3 files changed

+75
-45
lines changed

3 files changed

+75
-45
lines changed

src/open_inwoner/openzaak/cases.py

+15-22
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from requests import RequestException
55
from zds_client import ClientError
66
from zgw_consumers.api_models.base import factory
7-
from zgw_consumers.api_models.constants import RolOmschrijving
7+
from zgw_consumers.api_models.constants import RolOmschrijving, RolTypes
88
from zgw_consumers.api_models.zaken import Resultaat, Rol, Status, Zaak
99
from zgw_consumers.service import get_paginated_results
1010

@@ -170,31 +170,24 @@ def fetch_case_roles(
170170

171171

172172
def fetch_roles_for_case_and_bsn(case_url: str, bsn: str) -> List[Rol]:
173-
client = build_client("zaak")
174-
175-
if client is None:
176-
return []
173+
"""
174+
note we do a query on all case_roles and then manually filter our roles from the result,
175+
because e-Suite doesn't support querying on both "zaak" AND "betrokkeneIdentificatie__natuurlijkPersoon__inpBsn"
177176
178-
try:
179-
response = client.list(
180-
"rol",
181-
request_kwargs={
182-
"params": {
183-
"zaak": case_url,
184-
"betrokkeneIdentificatie__natuurlijkPersoon__inpBsn": bsn,
185-
}
186-
},
187-
)
188-
except RequestException as e:
189-
logger.exception("exception while making request", exc_info=e)
190-
return []
191-
except ClientError as e:
192-
logger.exception("exception while making request", exc_info=e)
177+
see Taiga #948
178+
"""
179+
case_roles = fetch_case_roles(case_url)
180+
if not case_roles:
193181
return []
194182

195-
roles = factory(Rol, response["results"])
183+
bsn_roles = []
184+
for role in case_roles:
185+
if role.betrokkene_type == RolTypes.natuurlijk_persoon:
186+
inp_bsn = role.betrokkene_identificatie.get("inp_bsn")
187+
if inp_bsn and inp_bsn == bsn:
188+
bsn_roles.append(role)
196189

197-
return roles
190+
return bsn_roles
198191

199192

200193
def fetch_case_information_objects_for_case_and_info(

src/open_inwoner/openzaak/tests/test_case_detail.py

+27-13
Original file line numberDiff line numberDiff line change
@@ -151,15 +151,29 @@ def setUpTestData(self):
151151
volgnummer=2,
152152
is_eindstatus=False,
153153
)
154-
self.role = generate_oas_component(
154+
self.user_role = generate_oas_component(
155155
"zrc",
156156
"schemas/Rol",
157-
url=f"{ZAKEN_ROOT}rollen/f33153aa-adnatuurlijk_persoon2c-4a07-ae75-15add5891",
157+
url=f"{ZAKEN_ROOT}rollen/f33153aa-ad2c-4a07-ae75-15add5891",
158+
omschrijvingGeneriek=RolOmschrijving.initiator,
158159
betrokkeneType=RolTypes.natuurlijk_persoon,
159160
betrokkeneIdentificatie={
160-
"geslachtsnaam": "Bazz",
161-
"voorvoegselGeslachtsnaam": "van der",
161+
"inpBsn": "900222086",
162162
"voornamen": "Foo Bar",
163+
"voorvoegselGeslachtsnaam": "van der",
164+
"geslachtsnaam": "Bazz",
165+
},
166+
)
167+
self.not_our_user_role = generate_oas_component(
168+
"zrc",
169+
"schemas/Rol",
170+
url=f"{ZAKEN_ROOT}rollen/aa353aa-ad2c-4a07-ae75-15add5822",
171+
omschrijvingGeneriek=RolOmschrijving.behandelaar,
172+
betrokkeneType=RolTypes.natuurlijk_persoon,
173+
betrokkeneIdentificatie={
174+
"inpBsn": "123456789",
175+
"voornamen": "Somebody",
176+
"geslachtsnaam": "Else",
163177
},
164178
)
165179
self.result = generate_oas_component(
@@ -253,12 +267,12 @@ def _setUpMocks(self, m):
253267
json=paginated_response([self.status1, self.status2]),
254268
)
255269
m.get(
256-
f"{ZAKEN_ROOT}rollen?zaak={self.zaak['url']}&omschrijvingGeneriek={RolOmschrijving.initiator}",
257-
json=paginated_response([self.role]),
270+
f"{ZAKEN_ROOT}rollen?zaak={self.zaak['url']}",
271+
json=paginated_response([self.user_role, self.not_our_user_role]),
258272
)
259273
m.get(
260-
f"{ZAKEN_ROOT}rollen?zaak={self.zaak['url']}&betrokkeneIdentificatie__natuurlijkPersoon__inpBsn={self.user.bsn}",
261-
json=paginated_response([self.role]),
274+
f"{ZAKEN_ROOT}rollen?zaak={self.zaak['url']}&omschrijvingGeneriek={RolOmschrijving.initiator}",
275+
json=paginated_response([self.user_role]),
262276
)
263277
m.get(
264278
f"{ZAKEN_ROOT}resultaten/a44153aa-ad2c-6a07-be75-15add5113",
@@ -422,9 +436,9 @@ def test_no_access_when_no_roles_are_found_for_user_bsn(self, m):
422436
json=paginated_response([self.status1, self.status2]),
423437
)
424438
m.get(
425-
f"{ZAKEN_ROOT}rollen?zaak={self.zaak['url']}&betrokkeneIdentificatie__natuurlijkPersoon__inpBsn={self.user.bsn}",
426-
# no roles found
427-
json=paginated_response([]),
439+
f"{ZAKEN_ROOT}rollen?zaak={self.zaak['url']}",
440+
# no roles for our user found
441+
json=paginated_response([self.not_our_user_role]),
428442
)
429443
response = self.app.get(
430444
reverse(
@@ -480,8 +494,8 @@ def test_no_access_when_case_is_confidential(self, m):
480494
mock_service_oas_get(m, CATALOGI_ROOT, "ztc")
481495
m.get(self.zaak_invisible["url"], json=self.zaak_invisible)
482496
m.get(
483-
f"{ZAKEN_ROOT}rollen?zaak={self.zaak_invisible['url']}&betrokkeneIdentificatie__natuurlijkPersoon__inpBsn={self.user.bsn}",
484-
json=paginated_response([self.role]),
497+
f"{ZAKEN_ROOT}rollen?zaak={self.zaak_invisible['url']}",
498+
json=paginated_response([self.user_role, self.not_our_user_role]),
485499
)
486500

487501
response = self.app.get(

src/open_inwoner/openzaak/tests/test_documents.py

+33-10
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33

44
import requests_mock
55
from django_webtest import WebTest
6-
from zgw_consumers.api_models.constants import VertrouwelijkheidsAanduidingen
6+
from zgw_consumers.api_models.constants import (
7+
RolOmschrijving,
8+
RolTypes,
9+
VertrouwelijkheidsAanduidingen,
10+
)
711
from zgw_consumers.constants import APITypes
812
from zgw_consumers.test import generate_oas_component, mock_service_oas_get
913

@@ -75,11 +79,30 @@ def setUpTestData(self):
7579
beschrijving="",
7680
registratiedatum="2021-01-12",
7781
)
78-
self.role = generate_oas_component(
82+
self.user_role = generate_oas_component(
7983
"zrc",
8084
"schemas/Rol",
8185
url=f"{ZAKEN_ROOT}rollen/f33153aa-ad2c-4a07-ae75-15add5891",
82-
betrokkene_identificatie="foo",
86+
omschrijvingGeneriek=RolOmschrijving.initiator,
87+
betrokkeneType=RolTypes.natuurlijk_persoon,
88+
betrokkeneIdentificatie={
89+
"inpBsn": "900222086",
90+
"voornamen": "Foo Bar",
91+
"voorvoegselGeslachtsnaam": "van der",
92+
"geslachtsnaam": "Bazz",
93+
},
94+
)
95+
self.not_our_user_role = generate_oas_component(
96+
"zrc",
97+
"schemas/Rol",
98+
url=f"{ZAKEN_ROOT}rollen/aa353aa-ad2c-4a07-ae75-15add5822",
99+
omschrijvingGeneriek=RolOmschrijving.behandelaar,
100+
betrokkeneType=RolTypes.natuurlijk_persoon,
101+
betrokkeneIdentificatie={
102+
"inpBsn": "123456789",
103+
"voornamen": "Somebody",
104+
"geslachtsnaam": "Else",
105+
},
83106
)
84107
self.informatie_object_content = "my document content".encode("utf8")
85108
self.informatie_object = generate_oas_component(
@@ -117,8 +140,8 @@ def _setUpAccessMocks(self, m):
117140
self._setUpOASMocks(m)
118141
m.get(self.zaak["url"], json=self.zaak)
119142
m.get(
120-
f"{ZAKEN_ROOT}rollen?zaak={self.zaak['url']}&betrokkeneIdentificatie__natuurlijkPersoon__inpBsn={self.user.bsn}",
121-
json=paginated_response([self.role]),
143+
f"{ZAKEN_ROOT}rollen?zaak={self.zaak['url']}",
144+
json=paginated_response([self.user_role, self.not_our_user_role]),
122145
)
123146
m.get(
124147
f"{ZAKEN_ROOT}zaakinformatieobjecten?zaak={self.zaak['url']}&informatieobject={self.informatie_object['url']}",
@@ -225,18 +248,18 @@ def test_no_data_is_retrieved_when_no_related_roles_are_found_for_user_bsn(self,
225248
self._setUpOASMocks(m)
226249
m.get(self.zaak["url"], json=self.zaak)
227250
m.get(
228-
f"{ZAKEN_ROOT}rollen?zaak={self.zaak['url']}&betrokkeneIdentificatie__natuurlijkPersoon__inpBsn={self.user.bsn}",
229-
# no roles found
230-
json=paginated_response([]),
251+
f"{ZAKEN_ROOT}rollen?zaak={self.zaak['url']}",
252+
# no roles for our user found
253+
json=paginated_response([self.not_our_user_role]),
231254
)
232255
self.app.get(self.informatie_object_file.url, user=self.user, status=403)
233256

234257
def test_no_data_is_retrieved_when_no_matching_case_info_object_is_found(self, m):
235258
self._setUpOASMocks(m)
236259
m.get(self.zaak["url"], json=self.zaak)
237260
m.get(
238-
f"{ZAKEN_ROOT}rollen?zaak={self.zaak['url']}&betrokkeneIdentificatie__natuurlijkPersoon__inpBsn={self.user.bsn}",
239-
json=paginated_response([self.role]),
261+
f"{ZAKEN_ROOT}rollen?zaak={self.zaak['url']}",
262+
json=paginated_response([self.user_role, self.not_our_user_role]),
240263
)
241264
m.get(self.informatie_object["url"], json=self.informatie_object)
242265
m.get(

0 commit comments

Comments
 (0)