150 lines
4.7 KiB
Python
150 lines
4.7 KiB
Python
from django.contrib.auth.models import User
|
||
from django.contrib.auth import authenticate, login
|
||
|
||
from rest_framework import generics
|
||
from rest_framework import permissions
|
||
from rest_framework.response import Response
|
||
from rest_framework.views import status
|
||
from rest_framework_jwt.settings import api_settings
|
||
|
||
from .decorators import validate_request_data
|
||
from .models import Songs
|
||
from .serializers import SongsSerializer, TokenSerializer, UserSerializer
|
||
|
||
import logging
|
||
import json
|
||
logger = logging.getLogger(__name__)
|
||
|
||
# Get the JWT settings
|
||
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
|
||
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
|
||
|
||
|
||
class ListCreateSongsView(generics.ListCreateAPIView):
|
||
"""
|
||
GET songs/
|
||
POST songs/
|
||
"""
|
||
queryset = Songs.objects.all()
|
||
serializer_class = SongsSerializer
|
||
permission_classes = (permissions.IsAuthenticated,)
|
||
|
||
@validate_request_data
|
||
def post(self, request, *args, **kwargs):
|
||
a_song = Songs.objects.create(
|
||
title=request.data["title"],
|
||
artist=request.data["artist"]
|
||
)
|
||
return Response(
|
||
data=SongsSerializer(a_song).data,
|
||
status=status.HTTP_201_CREATED
|
||
)
|
||
|
||
|
||
class SongsDetailView(generics.RetrieveUpdateDestroyAPIView):
|
||
"""
|
||
GET songs/:id/
|
||
PUT songs/:id/
|
||
DELETE songs/:id/
|
||
"""
|
||
queryset = Songs.objects.all()
|
||
serializer_class = SongsSerializer
|
||
|
||
def get(self, request, *args, **kwargs):
|
||
try:
|
||
a_song = self.queryset.get(pk=kwargs["pk"])
|
||
return Response(SongsSerializer(a_song).data)
|
||
except Songs.DoesNotExist:
|
||
return Response(
|
||
data={
|
||
"message": "Song with id: {} does not exist".format(kwargs["pk"])
|
||
},
|
||
status=status.HTTP_404_NOT_FOUND
|
||
)
|
||
|
||
@validate_request_data
|
||
def put(self, request, *args, **kwargs):
|
||
try:
|
||
a_song = self.queryset.get(pk=kwargs["pk"])
|
||
serializer = SongsSerializer()
|
||
updated_song = serializer.update(a_song, request.data)
|
||
return Response(SongsSerializer(updated_song).data)
|
||
except Songs.DoesNotExist:
|
||
return Response(
|
||
data={
|
||
"message": "Song with id: {} does not exist".format(kwargs["pk"])
|
||
},
|
||
status=status.HTTP_404_NOT_FOUND
|
||
)
|
||
|
||
def delete(self, request, *args, **kwargs):
|
||
try:
|
||
a_song = self.queryset.get(pk=kwargs["pk"])
|
||
a_song.delete()
|
||
return Response(status=status.HTTP_204_NO_CONTENT)
|
||
except Songs.DoesNotExist:
|
||
return Response(
|
||
data={
|
||
"message": "Song with id: {} does not exist".format(kwargs["pk"])
|
||
},
|
||
status=status.HTTP_404_NOT_FOUND
|
||
)
|
||
|
||
|
||
|
||
class LoginView(generics.CreateAPIView):
|
||
"""
|
||
POST auth/login/
|
||
"""
|
||
|
||
# This permission class will over ride the global permission
|
||
# class setting
|
||
permission_classes = (permissions.AllowAny,)
|
||
|
||
queryset = User.objects.all()
|
||
|
||
def post(self, request, *args, **kwargs):
|
||
logger.error('post LoginView')
|
||
username = request.data.get("username", "")
|
||
password = request.data.get("password", "")
|
||
user = authenticate(request, username=username, password=password)
|
||
if user is not None:
|
||
# login saves the user’s ID in the session,
|
||
# using Django’s session framework.
|
||
login(request, user)
|
||
serializer = TokenSerializer(data={
|
||
# using drf jwt utility functions to generate a token
|
||
"token": jwt_encode_handler(
|
||
jwt_payload_handler(user)
|
||
)})
|
||
serializer.is_valid()
|
||
return Response(serializer.data)
|
||
return Response(status=status.HTTP_401_UNAUTHORIZED)
|
||
|
||
|
||
class RegisterUsers(generics.CreateAPIView):
|
||
"""
|
||
POST auth/register/
|
||
"""
|
||
permission_classes = (permissions.AllowAny,)
|
||
|
||
def post(self, request, *args, **kwargs):
|
||
logger.error('post registerUsers')
|
||
username = request.data.get("username", "")
|
||
password = request.data.get("password", "")
|
||
email = request.data.get("email", "")
|
||
if not username and not password and not email:
|
||
return Response(
|
||
data={
|
||
"message": "username, password and email is required to register a user"
|
||
},
|
||
status=status.HTTP_400_BAD_REQUEST
|
||
)
|
||
new_user = User.objects.create_user(
|
||
username=username, password=password, email=email
|
||
)
|
||
return Response(
|
||
data=UserSerializer(new_user).data,
|
||
status=status.HTTP_201_CREATED
|
||
)
|