from django.contrib.auth import get_user_model from django.contrib.auth import login from rest_framework.authtoken.serializers import AuthTokenSerializer from rest_framework.authentication import BasicAuthentication 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 .serializer import Pucko_CreateUser_Serializer from .serializer import Pucko_Renew_Serializer from .serializer import Pucko_User_Serializer from .serializer import Pucko_Login_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 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