diff --git a/funkwhale_api/favorites/tests/test_favorites.py b/funkwhale_api/favorites/tests/test_favorites.py index 55b09baac78b49197b0b80b46da4b6065e102bde..a68659ba41ba28a1f4160b9cb36dbc0483ead8d6 100644 --- a/funkwhale_api/favorites/tests/test_favorites.py +++ b/funkwhale_api/favorites/tests/test_favorites.py @@ -63,6 +63,18 @@ class TestFavorites(TestCase): url = reverse('api:favorites:tracks-detail', kwargs={'pk': favorite.pk}) self.client.login(username=self.user.username, password='test') 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(TrackFavorite.objects.count(), 0) diff --git a/funkwhale_api/favorites/views.py b/funkwhale_api/favorites/views.py index 33a3e3d62d3c596fcee645b5b3aaec89477160f1..98c0cfc08de60fc21f2ffc8d66918b638bc28c6c 100644 --- a/funkwhale_api/favorites/views.py +++ b/funkwhale_api/favorites/views.py @@ -1,6 +1,8 @@ from rest_framework import generics, mixins, viewsets from rest_framework import status 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.common.permissions import ConditionalAuthentication @@ -8,21 +10,22 @@ from funkwhale_api.common.permissions import ConditionalAuthentication from . import models from . import serializers + +class CustomLimitPagination(pagination.PageNumberPagination): + page_size = 100 + page_size_query_param = 'page_size' + max_page_size = 100 + + class TrackFavoriteViewSet(mixins.CreateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): serializer_class = serializers.UserTrackFavoriteSerializer - queryset = (models.TrackFavorite.objects.all() - .select_related() - .select_related('track__album__artist') - .prefetch_related( - 'track__tags', - 'track__files', - 'track__artist__albums__tracks__tags',)) + queryset = (models.TrackFavorite.objects.all()) permission_classes = [ConditionalAuthentication] - + pagination_class = CustomLimitPagination def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) @@ -39,3 +42,13 @@ class TrackFavoriteViewSet(mixins.CreateModelMixin, track = Track.objects.get(pk=serializer.data['track']) favorite = models.TrackFavorite.add(track=track, user=self.request.user) 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)