1
- from rest_framework import status
1
+ import platform
2
+ import time
3
+ from typing import Any , cast
4
+
5
+ import django
6
+ from rest_framework import __version__ as res_version
7
+ from rest_framework import serializers , status
2
8
from rest_framework .authtoken .views import ObtainAuthToken
9
+ from rest_framework .exceptions import AuthenticationFailed
3
10
from rest_framework .permissions import IsAuthenticated
11
+ from rest_framework .request import Request
4
12
from rest_framework .response import Response
5
13
from rest_framework .views import APIView
6
- from rest_framework import serializers
7
- from rest_framework .exceptions import AuthenticationFailed
8
14
15
+ from mreg .api .permissions import IsSuperOrNetworkAdminMember
9
16
from mreg .models .base import ExpiringToken
10
17
18
+ start_time = int (time .time ())
19
+
11
20
12
21
class ObtainExpiringAuthToken (ObtainAuthToken ):
13
22
14
- def post (self , request , * args , ** kwargs ):
15
- serializer = self .serializer_class (data = request .data ,
16
- context = {'request' : request })
23
+ def post (self , request : Request , * args : Any , ** kwargs : Any ):
24
+ serializer = self .serializer_class (data = request .data , context = {"request" : request })
17
25
try :
18
26
serializer .is_valid (raise_exception = True )
19
27
except serializers .ValidationError as err :
20
- if 'username' in request .POST and 'password' in request .POST :
28
+ if (
29
+ isinstance (request .POST , dict )
30
+ and "username" in request .POST
31
+ and "password" in request .POST
32
+ ):
21
33
raise AuthenticationFailed ()
22
34
else :
23
35
raise err
24
36
25
- user = serializer .validated_data ['user' ]
37
+ if (
38
+ not isinstance (serializer .validated_data , dict )
39
+ or "user" not in serializer .validated_data
40
+ ):
41
+ raise AuthenticationFailed ()
42
+
43
+ user = cast (str , serializer .validated_data ["user" ])
26
44
27
45
token , created = ExpiringToken .objects .get_or_create (user = user )
28
46
@@ -31,15 +49,41 @@ def post(self, request, *args, **kwargs):
31
49
ExpiringToken .objects .filter (user = user ).delete ()
32
50
token , _ = ExpiringToken .objects .get_or_create (user = user )
33
51
34
- return Response ({' token' : token .key })
52
+ return Response ({" token" : token .key })
35
53
36
54
37
55
class TokenLogout (APIView ):
38
56
39
- permission_classes = (IsAuthenticated , )
57
+ permission_classes = (IsAuthenticated ,)
40
58
41
- def post (self , request ):
59
+ def post (self , request : Request ):
42
60
# delete the user on logout to clean up the local user database and
43
61
# group memberships. As the user owns the token, it will also be deleted.
44
62
request .user .delete ()
45
63
return Response (status = status .HTTP_200_OK )
64
+
65
+
66
+ class MetaVersions (APIView ):
67
+
68
+ permission_classes = (IsSuperOrNetworkAdminMember ,)
69
+
70
+ def get (self , request : Request ):
71
+ data = {
72
+ "django_version" : django .get_version (),
73
+ "rest_framework_version" : res_version ,
74
+ "python_version" : platform .python_version (),
75
+ }
76
+ return Response (status = status .HTTP_200_OK , data = data )
77
+
78
+
79
+ class MetaHeartbeat (APIView ):
80
+
81
+ permission_classes = (IsAuthenticated ,)
82
+
83
+ def get (self , request : Request ):
84
+ uptime = int (start_time - time .time ())
85
+ data = {
86
+ "start_time" : start_time ,
87
+ "uptime" : uptime ,
88
+ }
89
+ return Response (status = status .HTTP_200_OK , data = data )
0 commit comments