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)