Bladeren bron

playlist creation, update,delete and fetch ,admin add,delete,update functionality of playlist

Isshaann 4 jaren geleden
bovenliggende
commit
ef41bbafa5

+ 17 - 1
grunge/admin.py

@@ -7,7 +7,7 @@ from django.utils.translation import gettext as _
 from furl import furl
 from rest_framework.reverse import reverse as drf_reverse
 
-from .models import Album, Artist, Track
+from .models import Album, Artist, Track,Playlist,PlaylistTrack
 
 
 def get_api_url(obj, view="detail", params=None, title=None, request=None):
@@ -240,3 +240,19 @@ class TrackAdmin(admin.ModelAdmin):
         return get_api_url(track, request=self.request)
 
     track_api_link.short_description = _("API")
+
+
+
+@admin.register(Playlist)
+class PlaylistAdmin(admin.ModelAdmin):
+    list_display = ("name", )
+    list_filter = ("name",)
+    search_fields = ("uuid", "name",)
+    fields = (
+        "name",
+        "uuid",
+    )
+    readonly_fields = (
+        "uuid",
+    )
+    ordering = ("name",)

+ 7 - 0
grunge/fixtures/initial_data.json

@@ -44084,6 +44084,13 @@
   }
 },
 {
+  "model": "grunge.playlist",
+  "fields": {
+    "uuid": "e6b8e65c-f325-4764-9a8a-7ec2c40af125",
+    "name": "Ishaan"
+  }
+},
+{
   "model": "auth.permission",
   "fields": {
     "name": "Can add permission",

+ 37 - 0
grunge/migrations/0002_playlist_playlisttrack.py

@@ -0,0 +1,37 @@
+# Generated by Django 3.1.5 on 2021-04-13 09:46
+
+from django.db import migrations, models
+import django.db.models.deletion
+import uuid
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('grunge', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Playlist',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('uuid', models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='UUID')),
+                ('name', models.CharField(help_text='The playlist name', max_length=100)),
+            ],
+            options={
+                'ordering': ('name',),
+            },
+        ),
+        migrations.CreateModel(
+            name='PlaylistTrack',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('playlist', models.ForeignKey(help_text='The playlist number', on_delete=django.db.models.deletion.DO_NOTHING, related_name='playlist_track', to='grunge.playlist')),
+                ('track', models.ForeignKey(help_text='tracks on this playlist', on_delete=django.db.models.deletion.DO_NOTHING, related_name='tracks', to='grunge.track')),
+            ],
+            options={
+                'ordering': ('playlist', 'track'),
+            },
+        ),
+    ]

+ 35 - 0
grunge/models.py

@@ -84,3 +84,38 @@ class Track(UUIDModel):
 
     def get_absolute_url(self):
         return reverse("admin:grunge_track_change", kwargs={"object_id": self.pk})
+
+class Playlist(UUIDModel):
+    name = models.CharField(max_length=100, help_text=_("The playlist name"))
+
+    class Meta:
+        ordering = ("name",)
+
+    def __str__(self):
+        return self.name
+
+    def get_absolute_url(self):
+        return reverse("admin:grunge_playlist", kwargs={"object_id": self.pk})
+
+class PlaylistTrack(models.Model):
+    playlist = models.ForeignKey(
+        Playlist,
+        help_text=_("The playlist number"),
+        related_name="playlist_track",
+        on_delete=models.DO_NOTHING,
+    )
+    track = models.ForeignKey(
+        Track,
+        help_text=_("tracks on this playlist"),
+        related_name="tracks",
+        on_delete=models.DO_NOTHING,
+    )
+
+    class Meta:
+        ordering = ("playlist", "track",)
+
+    def __str__(self):
+        return self.playlist
+
+    def get_absolute_url(self):
+        return reverse("admin:grunge_track_playlist", kwargs={"object_id": self.pk})

+ 64 - 1
grunge/serializers.py

@@ -3,7 +3,7 @@ from rest_framework import serializers
 from rest_framework.reverse import reverse as drf_reverse
 
 from .fields import UUIDHyperlinkedIdentityField
-from .models import Album, Artist, Track
+from .models import Album, Artist, Track,Playlist,PlaylistTrack
 
 
 class TrackAlbumArtistSerializer(serializers.ModelSerializer):
@@ -34,6 +34,14 @@ class TrackSerializer(serializers.ModelSerializer):
         model = Track
         fields = ("uuid", "url", "name", "number", "album")
 
+class PlaylistSerializer(serializers.ModelSerializer):
+    uuid = serializers.ReadOnlyField()
+    url = UUIDHyperlinkedIdentityField(view_name="playlist-detail")
+
+    class Meta:
+        model = Playlist
+        fields = ("uuid", "name","url",)
+
 
 class AlbumTrackSerializer(TrackSerializer):
     uuid = serializers.ReadOnlyField()
@@ -76,3 +84,58 @@ class ArtistSerializer(serializers.ModelSerializer):
     def get_albums_url(self, artist):
         path = drf_reverse("album-list", request=self.context["request"])
         return furl(path).set({"artist_uuid": artist.uuid}).url
+
+class UpdatePlaylistSerializer(serializers.ModelSerializer):
+    '''
+    serializer to update Tacks
+    '''
+    def __init__(self, *args, **kwargs):
+        super(UpdatePlaylistSerializer, self).__init__(*args, **kwargs)
+        context = kwargs.get('context', None)
+        if context:
+            self.request = kwargs['context']['request']
+
+    class Meta(object):
+        '''
+        meta for user
+        '''
+        fields = "__all__"
+        model = Playlist
+    
+    def update(self, *args, **kwargs):
+        self.instance.name = self.request.data['name']
+        self.instance.save()
+        return self.instance
+    
+    def to_representation(self, *args, **kwargs):
+        _ = self
+        return {
+            'details': "PLAYLIST UPDATED SUCCESSFULLY"
+        }
+
+class PlaylistCreateSerializer(serializers.ModelSerializer):
+    '''
+    Serializer to create tracks
+    '''
+    def __init__(self, *args, **kwargs):
+        super(PlaylistCreateSerializer, self).__init__(*args, **kwargs)
+        context = kwargs.get('context', None)
+        if context:
+            self.request = kwargs['context']['request']
+
+    class Meta(object):
+        '''
+        meta for creating Playlist
+        '''
+        fields = ('uuid', 'name',)
+        model = Playlist
+    
+    def create(self, validated_data):
+        instance = super(PlaylistCreateSerializer, self).create(validated_data)
+        return instance
+    
+    def to_representation(self, *args, **kwargs):
+        _ = self
+        return {
+            'details': "PLAYLIST SUCCESSFULLY CREATED"
+        }

+ 24 - 11
grunge/tests/test_playlists.py

@@ -1,26 +1,39 @@
 from unittest import skip
-
+from uuid import UUID
 from . import BaseAPITestCase
-
+from furl import furl
+from rest_framework import status
+from rest_framework.reverse import reverse as drf_reverse
 
 class PlaylistTests(BaseAPITestCase):
     def setUp(self):
-        pass
+        self.playlist_name = "Ishaan"
+        self.playlist_uuid = UUID("e6b8e65c-f325-4764-9a8a-7ec2c40af125")
 
-    @skip
     def test_list_playlists(self):
-        # Should be able to fetch the list of playlists.
-        raise NotImplementedError("This test case needs to be implemented.")
-
-    @skip
+        # the total count of playlist is 1
+        url = drf_reverse("playlist-list", kwargs={"version": self.version})
+        r = self.client.get(url)
+        self.assertEqual(r.status_code, status.HTTP_200_OK)
+        self.assertEqual(r.data["count"], 1)
+        
     def test_search_playlists(self):
         # Should be able to search for playlists by `name`.
-        raise NotImplementedError("This test case needs to be implemented.")
+        url = drf_reverse("playlist-list", kwargs={"version": self.version})
+        url = furl(url).set({"name": self.playlist_name}).url
+        r = self.client.get(url)
+        self.assertEqual(r.status_code, status.HTTP_200_OK)
+        self.assertEqual(r.data["count"], 1)
+        self.assertEqual(r.data["results"][0]["uuid"], self.playlist_uuid)
 
-    @skip
     def test_get_playlist(self):
         # Should be able to fetch a playlist by its `uuid`.
-        raise NotImplementedError("This test case needs to be implemented.")
+        url = drf_reverse(
+            "playlist-detail", kwargs={"version": self.version, "uuid": self.playlist_uuid}
+        )
+        r = self.client.get(url)
+        self.assertEqual(r.status_code, status.HTTP_200_OK)
+        self.assertEqual(r.data["name"], self.playlist_name)
 
     @skip
     def test_create_playlist(self):

+ 6 - 1
grunge/urls.py

@@ -4,7 +4,7 @@ from django.urls import include, path, re_path
 from django.views.generic.base import RedirectView
 from rest_framework.routers import DefaultRouter
 
-from .viewsets import AlbumViewSet, ArtistViewSet, TrackViewSet
+from .viewsets import AlbumViewSet, ArtistViewSet, TrackViewSet,FetchPlaylist,CreatePlaylist,UpdatePlaylist,DeletePlaylist
 
 urlpatterns = []
 
@@ -20,7 +20,12 @@ if settings.DJANGO_API_ENABLED:
     api_router.register("artists", ArtistViewSet)
     api_router.register("albums", AlbumViewSet)
     api_router.register("tracks", TrackViewSet)
+    api_router.register("playlist", FetchPlaylist)
 
     urlpatterns += [
         path("api/<version>/", include(api_router.urls)),
+        path("api/create/playlist/",CreatePlaylist.as_view()),
+        path("api/update/playlist/",UpdatePlaylist.as_view()),
+        path("api/delete/playlist/",DeletePlaylist.as_view()),
     ]
+

+ 64 - 3
grunge/viewsets.py

@@ -1,14 +1,21 @@
 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
-from .serializers import AlbumSerializer, ArtistSerializer, TrackSerializer
+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()
@@ -34,3 +41,57 @@ class TrackViewSet(BaseAPIViewSet):
     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)