1
1
import dataclasses
2
2
from typing import List
3
3
4
- from django .contrib .auth .mixins import LoginRequiredMixin , UserPassesTestMixin
4
+ from django .contrib .auth .mixins import AccessMixin
5
5
from django .core .cache import cache
6
6
from django .core .exceptions import PermissionDenied
7
7
from django .http import Http404 , StreamingHttpResponse
14
14
15
15
from view_breadcrumbs import BaseBreadcrumbMixin
16
16
17
+ from open_inwoner .openzaak .api_models import Zaak
17
18
from open_inwoner .openzaak .cases import (
18
19
fetch_case_information_objects ,
19
20
fetch_case_information_objects_for_case_and_info ,
37
38
from open_inwoner .openzaak .utils import filter_info_object_visibility
38
39
39
40
40
- class CaseListView (
41
- BaseBreadcrumbMixin , LoginRequiredMixin , UserPassesTestMixin , TemplateView
42
- ):
43
- template_name = "pages/cases/list.html"
41
+ class CaseAccessMixin (AccessMixin ):
42
+ """
43
+ Shared authorisation check
44
44
45
- @cached_property
46
- def crumbs (self ):
47
- return [(_ ("Mijn aanvragen" ), reverse ("accounts:my_cases" ))]
45
+ Base checks:
46
+ - user is authenticated
47
+ - user has a BSN
48
+
49
+ When retrieving a case :
50
+ - users BSN has a role for this case
51
+ """
52
+
53
+ case : Zaak = None
54
+
55
+ def dispatch (self , request , * args , ** kwargs ):
56
+ if not request .user .is_authenticated :
57
+ return self .handle_no_permission ()
58
+
59
+ if not request .user .bsn :
60
+ return self .handle_no_permission ()
61
+
62
+ if "object_id" in kwargs :
63
+ case_uuid = kwargs ["object_id" ]
64
+ self .case = fetch_single_case (case_uuid )
65
+
66
+ if self .case :
67
+ # check if we have a role in this case
68
+ if not fetch_roles_for_case_and_bsn (self .case .url , request .user .bsn ):
69
+ return self .handle_no_permission ()
48
70
49
- def test_func (self ):
50
- return self .request .user .bsn is not None
71
+ return super ().dispatch (request , * args , ** kwargs )
51
72
52
73
def handle_no_permission (self ):
53
74
if self .request .user .is_authenticated :
54
75
return redirect (reverse ("root" ))
55
76
56
77
return super ().handle_no_permission ()
57
78
79
+
80
+ class CaseListView (BaseBreadcrumbMixin , CaseAccessMixin , TemplateView ):
81
+ template_name = "pages/cases/list.html"
82
+
83
+ @cached_property
84
+ def crumbs (self ):
85
+ return [(_ ("Mijn aanvragen" ), reverse ("accounts:my_cases" ))]
86
+
58
87
def get_context_data (self , ** kwargs ):
59
88
context = super ().get_context_data (** kwargs )
60
89
@@ -124,9 +153,7 @@ class SimpleFile:
124
153
url : str
125
154
126
155
127
- class CaseDetailView (
128
- BaseBreadcrumbMixin , LoginRequiredMixin , UserPassesTestMixin , TemplateView
129
- ):
156
+ class CaseDetailView (BaseBreadcrumbMixin , CaseAccessMixin , TemplateView ):
130
157
template_name = "pages/cases/status.html"
131
158
132
159
@cached_property
@@ -139,44 +166,30 @@ def crumbs(self):
139
166
),
140
167
]
141
168
142
- def test_func (self ):
143
- return self .request .user .bsn is not None
144
-
145
- def handle_no_permission (self ):
146
- if self .request .user .is_authenticated :
147
- return redirect (reverse ("root" ))
148
-
149
- return super ().handle_no_permission ()
150
-
151
169
def get_context_data (self , ** kwargs ):
152
170
context = super ().get_context_data (** kwargs )
153
171
154
- case_uuid = context [ "object_id" ]
155
- case = fetch_single_case ( case_uuid )
172
+ if self . case :
173
+ documents = self . get_case_document_files ( self . case )
156
174
157
- if case :
158
- # check if we have a role in this case
159
- if not fetch_roles_for_case_and_bsn (case .url , self .request .user .bsn ):
160
- raise PermissionDenied ()
161
-
162
- documents = self .get_case_document_files (case )
163
-
164
- statuses = fetch_status_history (case .url )
175
+ statuses = fetch_status_history (self .case .url )
165
176
statuses .sort (key = lambda status : status .datum_status_gezet )
166
177
167
- case_type = fetch_single_case_type (case .zaaktype )
168
- status_types = fetch_status_types (case_type = case .zaaktype )
178
+ case_type = fetch_single_case_type (self . case .zaaktype )
179
+ status_types = fetch_status_types (case_type = self . case .zaaktype )
169
180
170
181
status_types_mapping = {st .url : st for st in status_types }
171
182
for status in statuses :
172
183
status_type = status_types_mapping [status .statustype ]
173
184
status .statustype = status_type
174
185
175
186
context ["case" ] = {
176
- "identification" : case .identificatie ,
177
- "start_date" : case .startdatum ,
178
- "end_date" : (case .einddatum if hasattr (case , "einddatum" ) else None ),
179
- "description" : case .omschrijving ,
187
+ "identification" : self .case .identificatie ,
188
+ "start_date" : self .case .startdatum ,
189
+ "end_date" : (
190
+ self .case .einddatum if hasattr (self .case , "einddatum" ) else None
191
+ ),
192
+ "description" : self .case .omschrijving ,
180
193
"type_description" : (
181
194
case_type .omschrijving if case_type else _ ("No data available" )
182
195
),
@@ -248,34 +261,19 @@ def get_anchors(self, statuses, documents):
248
261
return anchors
249
262
250
263
251
- class CaseDocumentDownloadView (LoginRequiredMixin , UserPassesTestMixin , View ):
252
- def test_func (self ):
253
- return self .request .user .bsn is not None
254
-
255
- def handle_no_permission (self ):
256
- if self .request .user .is_authenticated :
257
- return redirect (reverse ("root" ))
258
-
259
- return super ().handle_no_permission ()
260
-
261
- def get (self , * args , ** kwargs ):
262
- case_uuid = kwargs ["object_id" ]
263
- case = fetch_single_case (case_uuid )
264
- if not case :
264
+ class CaseDocumentDownloadView (CaseAccessMixin , View ):
265
+ def get (self , request , * args , ** kwargs ):
266
+ if not self .case :
265
267
raise Http404
266
268
267
- # check if we have a role this case
268
- if not fetch_roles_for_case_and_bsn (case .url , self .request .user .bsn ):
269
- raise PermissionDenied ()
270
-
271
269
info_object_uuid = kwargs ["info_id" ]
272
270
info_object = fetch_single_information_object (uuid = info_object_uuid )
273
271
if not info_object :
274
272
raise Http404
275
273
276
274
# check if this info_object belongs to this case
277
275
if not fetch_case_information_objects_for_case_and_info (
278
- case .url , info_object .url
276
+ self . case .url , info_object .url
279
277
):
280
278
raise PermissionDenied ()
281
279
@@ -286,6 +284,7 @@ def get(self, *args, **kwargs):
286
284
):
287
285
raise PermissionDenied ()
288
286
287
+ # retrieve and stream content
289
288
content_stream = download_document (info_object .inhoud )
290
289
if not content_stream :
291
290
raise Http404
@@ -297,3 +296,7 @@ def get(self, *args, **kwargs):
297
296
}
298
297
response = StreamingHttpResponse (content_stream , headers = headers )
299
298
return response
299
+
300
+ def handle_no_permission (self ):
301
+ # plain error and no redirect
302
+ raise PermissionDenied ()
0 commit comments