85 lines
3.3 KiB
Python

from django.contrib.auth import update_session_auth_hash
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from django.core.exceptions import PermissionDenied
from authentication.serializers import (UserSerializer,
UserUpdateSerializer,
UserRegisterSerializer,
PasswordUpdateSerializer)
class UserCreateView(APIView):
"""
Allow user registration for anyone
"""
def post(self, request):
"""
Creates a new user
Requires :
username->str, email->str, password->str, password2->str, age->int,
can_be_contacted->bool, can_data_be_shared->bool
"""
serializer = UserRegisterSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
response = {
"detail": "User created successfully",
"data": serializer.data
}
return Response(data=response, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class PasswordUpdateView(APIView):
permission_classes = [IsAuthenticated]
def put(self, request):
user = request.user
serializer = PasswordUpdateSerializer(data=request.data)
if serializer.is_valid():
if not user.check_password(serializer.data.get("old_password")):
return Response({"old_password": "Wrong password"},
status=status.HTTP_400_BAD_REQUEST)
user.set_password(serializer.data.get('new_password'))
user.save()
update_session_auth_hash(request, user)
response = {
"detail": "Password updated successfully."
}
return Response(response, status=status.HTTP_204_NO_CONTENT)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class UserView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, *args, **kwargs):
return Response(UserSerializer(request.user).data)
def patch(self, request):
user = request.user
serializer = UserUpdateSerializer(user, data=request.data)
if serializer.is_valid():
serializer.save()
response = {
"detail": "Data updated",
"data": serializer.data
}
return Response(response, status=status.HTTP_201_CREATED)
response = {"detail": "Data error"}
return Response(response, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request):
user = request.user
username = request.user.username
if 'user' in request.data:
if username == request.data['user']:
user.delete()
response = {"detail": f"User {username} deleted."}
return Response(response, status=status.HTTP_204_NO_CONTENT)
raise PermissionDenied()
response = {"detail": "Username to delete must be given in data"}
return Response(response, status=status.HTTP_400_BAD_REQUEST)