Add/Remove artists for song objects in the API. Code cleanup.
This commit is contained in:
parent
5bcf6c72d9
commit
6dd4fa72ec
2 changed files with 45 additions and 4 deletions
|
@ -27,12 +27,15 @@ class GameSerializer(serializers.ModelSerializer):
|
||||||
fields = ('id', 'title')
|
fields = ('id', 'title')
|
||||||
|
|
||||||
|
|
||||||
class SongCreateSerializer(serializers.ModelSerializer):
|
class SongSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Song
|
model = Song
|
||||||
fields = ('id', 'album', 'artists', 'published_date', 'game',
|
fields = ('id', 'album', 'artists', 'published_date', 'game',
|
||||||
'num_played', 'last_played', 'length', 'song_type', 'title')
|
'num_played', 'last_played', 'length', 'song_type', 'title')
|
||||||
|
|
||||||
|
|
||||||
|
class SongCreateSerializer(SongSerializer):
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
artists_data = validated_data.pop('artists')
|
artists_data = validated_data.pop('artists')
|
||||||
song = Song.objects.create(**validated_data)
|
song = Song.objects.create(**validated_data)
|
||||||
|
@ -42,5 +45,11 @@ class SongCreateSerializer(serializers.ModelSerializer):
|
||||||
return song
|
return song
|
||||||
|
|
||||||
|
|
||||||
class SongSerializer(SongCreateSerializer):
|
class SongRetrieveSerializer(SongSerializer):
|
||||||
artists = ArtistFullnameSerializer(many=True)
|
artists = ArtistFullnameSerializer(many=True)
|
||||||
|
|
||||||
|
|
||||||
|
class SongArtistsListSerializer(serializers.Serializer):
|
||||||
|
artists = serializers.ListField(child=serializers.IntegerField(),
|
||||||
|
min_length=1,
|
||||||
|
max_length=10)
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
from rest_framework import viewsets
|
from rest_framework import status, viewsets
|
||||||
|
from rest_framework.decorators import action
|
||||||
|
from rest_framework.permissions import IsAdminUser
|
||||||
|
from rest_framework.response import Response
|
||||||
|
|
||||||
from radio.models import Album, Artist, Game, Song
|
from radio.models import Album, Artist, Game, Song
|
||||||
from ..permissions import IsAdminOrReadOnly
|
from ..permissions import IsAdminOrReadOnly
|
||||||
from ..serializers.radio import (AlbumSerializer, ArtistSerializer,
|
from ..serializers.radio import (AlbumSerializer, ArtistSerializer,
|
||||||
GameSerializer, SongSerializer,
|
GameSerializer, SongSerializer,
|
||||||
SongCreateSerializer)
|
SongArtistsListSerializer,
|
||||||
|
SongCreateSerializer, SongRetrieveSerializer)
|
||||||
|
|
||||||
|
|
||||||
class AlbumViewSet(viewsets.ModelViewSet):
|
class AlbumViewSet(viewsets.ModelViewSet):
|
||||||
|
@ -38,4 +42,32 @@ class SongViewSet(viewsets.ModelViewSet):
|
||||||
'''
|
'''
|
||||||
if self.action == 'create':
|
if self.action == 'create':
|
||||||
return SongCreateSerializer
|
return SongCreateSerializer
|
||||||
|
if self.action in ['list', 'retrieve']:
|
||||||
|
return SongRetrieveSerializer
|
||||||
return SongSerializer
|
return SongSerializer
|
||||||
|
|
||||||
|
def _change_artists(self, request, remove=False):
|
||||||
|
song = self.get_object()
|
||||||
|
serializer = SongArtistsListSerializer(data=request.data)
|
||||||
|
if serializer.is_valid():
|
||||||
|
artists = Artist.objects.filter(pk__in=serializer.data['artists'])
|
||||||
|
for artist in artists:
|
||||||
|
if remove:
|
||||||
|
song.artists.remove(artist)
|
||||||
|
else:
|
||||||
|
song.artists.add(artist)
|
||||||
|
song.save()
|
||||||
|
message = 'Artists {} song.'.format(('added to',
|
||||||
|
'removed from')[remove])
|
||||||
|
return Response({'detail': message})
|
||||||
|
else:
|
||||||
|
return Response(serializer.errors,
|
||||||
|
status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
@action(methods=['post'], detail=True, permission_classes=[IsAdminUser])
|
||||||
|
def add_artists(self, request, pk=None):
|
||||||
|
return self._change_artists(request)
|
||||||
|
|
||||||
|
@action(methods=['post'], detail=True, permission_classes=[IsAdminUser])
|
||||||
|
def remove_artists(self, request, pk=None):
|
||||||
|
return self._change_artists(request, remove=True)
|
||||||
|
|
Loading…
Reference in a new issue