diff --git a/funkwhale_api/favorites/tests/test_favorites.py b/funkwhale_api/favorites/tests/test_favorites.py index 1182222b1a4b9a0dc69cdb82a5a2dea9988df89a..55b09baac78b49197b0b80b46da4b6065e102bde 100644 --- a/funkwhale_api/favorites/tests/test_favorites.py +++ b/funkwhale_api/favorites/tests/test_favorites.py @@ -87,3 +87,15 @@ class TestFavorites(TestCase): with self.settings(API_AUTHENTICATION_REQUIRED=False): response = getattr(self.client, method)(url) self.assertEqual(response.status_code, 200) + + def test_can_filter_tracks_by_favorites(self): + favorite = TrackFavorite.add(self.track, self.user) + + url = reverse('api:tracks-list') + self.client.login(username=self.user.username, password='test') + + response = self.client.get(url, data={'favorites': True}) + + parsed_json = json.loads(response.content.decode('utf-8')) + self.assertEqual(parsed_json['count'], 1) + self.assertEqual(parsed_json['results'][0]['id'], self.track.id) diff --git a/funkwhale_api/favorites/views.py b/funkwhale_api/favorites/views.py index dc8098bba0a7947751adec39ffde8280af7b12b1..33a3e3d62d3c596fcee645b5b3aaec89477160f1 100644 --- a/funkwhale_api/favorites/views.py +++ b/funkwhale_api/favorites/views.py @@ -14,10 +14,16 @@ class TrackFavoriteViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet): 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] - + def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) @@ -27,7 +33,7 @@ class TrackFavoriteViewSet(mixins.CreateModelMixin, return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) def get_queryset(self): - return models.TrackFavorite.objects.filter(user=self.request.user).select_related('track__album__artist').prefetch_related('track__tags') + return self.queryset.filter(user=self.request.user) def perform_create(self, serializer): track = Track.objects.get(pk=serializer.data['track']) diff --git a/funkwhale_api/music/views.py b/funkwhale_api/music/views.py index 8e37c66ab66bd6d5915f7878c98225a15ebf25f6..8a4dfcd6505b28fd9c1e700fff62d748e6b77522 100644 --- a/funkwhale_api/music/views.py +++ b/funkwhale_api/music/views.py @@ -80,6 +80,16 @@ class TrackViewSet(TagViewSetMixin, SearchMixin, viewsets.ReadOnlyModelViewSet): search_fields = ['title', 'artist__name'] ordering_fields = ('creation_date',) + def get_queryset(self): + queryset = super().get_queryset() + filter_favorites = self.request.GET.get('favorites', None) + user = self.request.user + if user.is_authenticated() and filter_favorites == 'true': + queryset = queryset.filter(track_favorites__user=user) + + return queryset + + class TagViewSet(viewsets.ReadOnlyModelViewSet): queryset = Tag.objects.all() serializer_class = serializers.TagSerializer