96 lines
3.3 KiB
Python

from django.contrib.auth import get_user_model
from django.contrib.auth import login
from rest_framework.authtoken.serializers import AuthTokenSerializer
from rest_framework.permissions import AllowAny
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from knox.auth import TokenAuthentication
from knox.views import LoginView as KnoxLoginView
from knox.views import LogoutView as KnoxLogoutView
from knox.views import LogoutAllView as KnoxLogoutAllView
from settings.puckoviews import PuckoView
from settings.puckolizers import Message_Serializer
from .serializer import Pucko_CreateUser_Serializer
from .serializer import Pucko_Renew_Serializer
from .serializer import Pucko_User_Serializer
from .serializer import Pucko_Login_Serializer
from .serializer import Change_Password_Serializer
class LoginView(KnoxLoginView):
permission_classes = (AllowAny,)
serializer_class = Pucko_Login_Serializer
def post(self, request, format=None):
"""
Creates a new token for user in Authorization header
or from username/password sent in post request.
"""
serializer = AuthTokenSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
login(request, user)
return super(LoginView, self).post(request, format=None)
class AccountInfoView(PuckoView):
permission_classes = (IsAuthenticated,)
serializer_class = Pucko_User_Serializer
def user_info(self, request, format=None):
serializer = self.serializer_class(request.user)
return Response(serializer.data, status=200)
class RenewView(KnoxLoginView):
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
serializer_class = Pucko_Renew_Serializer
def post(self, request, format=None):
try:
login_token = request.headers["Authorization"].split(" ")[1]
except Exception:
return Response({"message", "you need to be logged in."}, status="204")
return super(RenewView, self).post(request, format=None)
class LogoutView(KnoxLogoutView):
"""
Logout from current session.
"""
pass
class LogoutAllView(KnoxLogoutAllView):
"""
Logout from all devices.
"""
pass
class RegisterView(CreateAPIView):
"""
Create a user.
"""
queryset = get_user_model().objects.all()
permission_classes = (AllowAny,)
serializer_class = Pucko_CreateUser_Serializer
class ChangePasswordView(PuckoView):
permission_classes = (IsAuthenticated,)
serializer_class = Change_Password_Serializer
def change_password(self, request):
old_password = request.data["old_password"]
new_password = request.data["new_password"]
user = request.user
if not user.check_password(raw_password=old_password):
serializer = Message_Serializer({"message": "Error: Could not change password. old password does not match."})
return Response(serializer.data, status=403)
user.set_password(new_password)
user.save()
serializer = Message_Serializer({"message": "password is updated"})
return Response(serializer.data, status=200)