3
3
4
4
from django .http import Http404
5
5
from rest_framework import status
6
+ from rest_framework .exceptions import PermissionDenied , MethodNotAllowed
6
7
from rest_framework .generics import get_object_or_404
7
- from rest_framework .request import Request
8
8
from rest_framework .response import Response
9
9
from rest_framework .viewsets import ModelViewSet
10
10
11
11
from metax_api .exceptions import Http403
12
+ from metax_api .permissions import ServicePermissions
12
13
from metax_api .services import CommonService as CS , ApiErrorService
13
14
from metax_api .utils import RedisSentinelCache
14
15
@@ -23,6 +24,9 @@ class CommonViewSet(ModelViewSet):
23
24
which include fields like modified and created timestamps, uuid, active flags etc.
24
25
"""
25
26
27
+ authentication_classes = ()
28
+ permission_classes = (ServicePermissions ,)
29
+
26
30
lookup_field_internal = None
27
31
cache = RedisSentinelCache ()
28
32
@@ -50,7 +54,7 @@ def handle_exception(self, exc):
50
54
Store request and response data to disk for later inspection
51
55
"""
52
56
response = super (CommonViewSet , self ).handle_exception (exc )
53
- if type (exc ) not in (Http403 , Http404 ):
57
+ if type (exc ) not in (Http403 , Http404 , PermissionDenied , MethodNotAllowed ):
54
58
ApiErrorService .store_error_details (self .request , response , exc )
55
59
return response
56
60
@@ -199,22 +203,10 @@ def initialize_request(self, request, *args, **kwargs):
199
203
Overrided from rest_framework to preserve the username set during
200
204
identifyapicaller middleware.
201
205
"""
202
- username = request .user .username
203
-
204
- # original ->
205
- parser_context = self .get_parser_context (request )
206
-
207
- req = Request (
208
- request ,
209
- parsers = self .get_parsers (),
210
- authenticators = self .get_authenticators (),
211
- negotiator = self .get_content_negotiator (),
212
- parser_context = parser_context
213
- )
214
- # ^ original
215
-
216
- req .user .username = username
217
- return req
206
+ username = request .user .username if hasattr (request .user , 'username' ) else None
207
+ drf_req = super (CommonViewSet , self ).initialize_request (request , * args , ** kwargs )
208
+ drf_req .user .username = username
209
+ return drf_req
218
210
219
211
def set_json_schema (self , view_file ):
220
212
"""
@@ -238,3 +230,12 @@ def _check_and_store_bulk_error(self, request, response):
238
230
"""
239
231
if 'failed' in response .data and len (response .data ['failed' ]):
240
232
ApiErrorService .store_error_details (request , response , other = { 'bulk_request' : True })
233
+
234
+ def get_api_name (self ):
235
+ """
236
+ Return api name, example: DatasetViewSet -> datasets.
237
+ Some views where the below formula does not produce a sensible result
238
+ (for example, directories-api), will inherit this and return a customized
239
+ result.
240
+ """
241
+ return '%ss' % self .__class__ .__name__ .split ('ViewSet' )[0 ].lower ()
0 commit comments