timelaps-api/music/views.py
2019-04-18 00:58:59 +02:00

150 lines
4.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 users ID in the session,
# using Djangos 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
)