Skip to content
Snippets Groups Projects
Commit 14cf3453 authored by Eliot Berriot's avatar Eliot Berriot
Browse files

Added favorite endpoint to easily delete favorite with only track id

parent 12ce41ad
Branches
No related tags found
No related merge requests found
...@@ -63,6 +63,18 @@ class TestFavorites(TestCase): ...@@ -63,6 +63,18 @@ class TestFavorites(TestCase):
url = reverse('api:favorites:tracks-detail', kwargs={'pk': favorite.pk}) url = reverse('api:favorites:tracks-detail', kwargs={'pk': favorite.pk})
self.client.login(username=self.user.username, password='test') self.client.login(username=self.user.username, password='test')
response = self.client.delete(url, {'track': self.track.pk}) response = self.client.delete(url, {'track': self.track.pk})
self.assertEqual(response.status_code, 204)
self.assertEqual(TrackFavorite.objects.count(), 0)
def test_user_can_remove_favorite_via_api_using_track_id(self):
favorite = TrackFavorite.add(self.track, self.user)
url = reverse('api:favorites:tracks-remove')
self.client.login(username=self.user.username, password='test')
response = self.client.delete(
url, json.dumps({'track': self.track.pk}),
content_type='application/json'
)
self.assertEqual(response.status_code, 204) self.assertEqual(response.status_code, 204)
self.assertEqual(TrackFavorite.objects.count(), 0) self.assertEqual(TrackFavorite.objects.count(), 0)
......
from rest_framework import generics, mixins, viewsets from rest_framework import generics, mixins, viewsets
from rest_framework import status from rest_framework import status
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import pagination
from rest_framework.decorators import list_route
from funkwhale_api.music.models import Track from funkwhale_api.music.models import Track
from funkwhale_api.common.permissions import ConditionalAuthentication from funkwhale_api.common.permissions import ConditionalAuthentication
...@@ -8,21 +10,22 @@ from funkwhale_api.common.permissions import ConditionalAuthentication ...@@ -8,21 +10,22 @@ from funkwhale_api.common.permissions import ConditionalAuthentication
from . import models from . import models
from . import serializers from . import serializers
class CustomLimitPagination(pagination.PageNumberPagination):
page_size = 100
page_size_query_param = 'page_size'
max_page_size = 100
class TrackFavoriteViewSet(mixins.CreateModelMixin, class TrackFavoriteViewSet(mixins.CreateModelMixin,
mixins.DestroyModelMixin, mixins.DestroyModelMixin,
mixins.ListModelMixin, mixins.ListModelMixin,
viewsets.GenericViewSet): viewsets.GenericViewSet):
serializer_class = serializers.UserTrackFavoriteSerializer serializer_class = serializers.UserTrackFavoriteSerializer
queryset = (models.TrackFavorite.objects.all() queryset = (models.TrackFavorite.objects.all())
.select_related()
.select_related('track__album__artist')
.prefetch_related(
'track__tags',
'track__files',
'track__artist__albums__tracks__tags',))
permission_classes = [ConditionalAuthentication] permission_classes = [ConditionalAuthentication]
pagination_class = CustomLimitPagination
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data) serializer = self.get_serializer(data=request.data)
...@@ -39,3 +42,13 @@ class TrackFavoriteViewSet(mixins.CreateModelMixin, ...@@ -39,3 +42,13 @@ class TrackFavoriteViewSet(mixins.CreateModelMixin,
track = Track.objects.get(pk=serializer.data['track']) track = Track.objects.get(pk=serializer.data['track'])
favorite = models.TrackFavorite.add(track=track, user=self.request.user) favorite = models.TrackFavorite.add(track=track, user=self.request.user)
return favorite return favorite
@list_route(methods=['delete'])
def remove(self, request, *args, **kwargs):
try:
pk = int(request.data['track'])
favorite = request.user.track_favorites.get(track__pk=pk)
except (AttributeError, ValueError, models.TrackFavorite.DoesNotExist):
return Response({}, status=400)
favorite.delete()
return Response([], status=status.HTTP_204_NO_CONTENT)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment