mirror of
https://code.eliotberriot.com/funkwhale/funkwhale.git
synced 2025-10-04 15:59:18 +02:00
Added API endpoint to insert multiple tracks into playlist
This commit is contained in:
parent
1729c4f83e
commit
f8b15a3f48
5 changed files with 112 additions and 12 deletions
|
@ -1,5 +1,7 @@
|
|||
from django.db.models import Count
|
||||
from django.db import transaction
|
||||
|
||||
from rest_framework import exceptions
|
||||
from rest_framework import generics, mixins, viewsets
|
||||
from rest_framework import status
|
||||
from rest_framework.decorators import detail_route
|
||||
|
@ -25,7 +27,7 @@ class PlaylistViewSet(
|
|||
|
||||
serializer_class = serializers.PlaylistSerializer
|
||||
queryset = (
|
||||
models.Playlist.objects.all()
|
||||
models.Playlist.objects.all().select_related('user')
|
||||
.annotate(tracks_count=Count('playlist_tracks'))
|
||||
)
|
||||
permission_classes = [
|
||||
|
@ -36,6 +38,11 @@ class PlaylistViewSet(
|
|||
owner_checks = ['write']
|
||||
filter_class = filters.PlaylistFilter
|
||||
|
||||
def get_serializer_class(self):
|
||||
if self.request.method in ['PUT', 'PATCH', 'DELETE', 'POST']:
|
||||
return serializers.PlaylistWriteSerializer
|
||||
return self.serializer_class
|
||||
|
||||
@detail_route(methods=['get'])
|
||||
def tracks(self, request, *args, **kwargs):
|
||||
playlist = self.get_object()
|
||||
|
@ -47,6 +54,24 @@ class PlaylistViewSet(
|
|||
}
|
||||
return Response(data, status=200)
|
||||
|
||||
@detail_route(methods=['post'])
|
||||
@transaction.atomic
|
||||
def add(self, request, *args, **kwargs):
|
||||
playlist = self.get_object()
|
||||
serializer = serializers.PlaylistAddManySerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
try:
|
||||
plts = playlist.insert_many(serializer.validated_data['tracks'])
|
||||
except exceptions.ValidationError as e:
|
||||
payload = {'playlist': e.detail}
|
||||
return Response(payload, status=400)
|
||||
serializer = serializers.PlaylistTrackSerializer(plts, many=True)
|
||||
data = {
|
||||
'count': len(plts),
|
||||
'results': serializer.data
|
||||
}
|
||||
return Response(data, status=201)
|
||||
|
||||
def get_queryset(self):
|
||||
return self.queryset.filter(
|
||||
fields.privacy_level_query(self.request.user))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue