from rest_framework import viewsets from rest_framework import generics from rest_framework.views import APIView from rest_framework import status from rest_framework.response import Response from .filters import AlbumFilter, ArtistFilter, TrackFilter from .models import Album, Artist, Track,Playlist,PlaylistTrack from .serializers import AlbumSerializer, ArtistSerializer, TrackSerializer, PlaylistSerializer, UpdatePlaylistSerializer,PlaylistCreateSerializer class BaseAPIViewSet(viewsets.ReadOnlyModelViewSet): lookup_field = "uuid" lookup_url_kwarg = "uuid" class BaseAPIViewSet1(viewsets.ModelViewSet): lookup_field = "uuid" lookup_url_kwarg = "uuid" class ArtistViewSet(BaseAPIViewSet): queryset = Artist.objects.all() serializer_class = ArtistSerializer filter_class = ArtistFilter class AlbumViewSet(BaseAPIViewSet): queryset = Album.objects.all() serializer_class = AlbumSerializer filter_class = AlbumFilter def get_queryset(self): queryset = super().get_queryset() return queryset.select_related("artist").prefetch_related("tracks") class TrackViewSet(BaseAPIViewSet): queryset = Track.objects.all() serializer_class = TrackSerializer filter_class = TrackFilter def get_queryset(self): queryset = super().get_queryset() return queryset.select_related("album", "album__artist") class FetchPlaylist(BaseAPIViewSet1): queryset = Playlist.objects.all() serializer_class = PlaylistSerializer def get_queryset(self): queryset = super().get_queryset() return queryset class UpdatePlaylist(generics.UpdateAPIView): """ update for only playlist name """ queryset = Playlist.objects.all() serializer_class = UpdatePlaylistSerializer def get_object(self, *args, **kwargs): try: playlist = Playlist.objects.filter(uuid=self.request.data['uuid']).get() except Playlist.DoesNotExist: return None return playlist def update(self, request, *args, **kwargs): playlist = self.get_object() if playlist: kwargs['partial'] = True return super(UpdatePlaylist, self).update(request, *args, **kwargs) else: response = {'details':"uuid does not exist"} return response class CreatePlaylist(generics.CreateAPIView): ''' Playlist create using uuid and name ''' serializer_class = PlaylistCreateSerializer def create(self, request, *args, **kwargs): response_data = super(CreatePlaylist, self).create(request, *args, **kwargs) return response_data class DeletePlaylist(APIView): ''' Playlist delete using the uuid ''' def post(self,request,format=None): try: playlist=Playlist.objects.get(uuid=request.POST["uuid"]) playlist.delete() response= {'details':"Playlist is deleted"} except: response= {'details':"Record does not exist"} return Response(response)