diff --git a/api/funkwhale_api/playlists/filters.py b/api/funkwhale_api/playlists/filters.py index 43029a360..f49e9bd1a 100644 --- a/api/funkwhale_api/playlists/filters.py +++ b/api/funkwhale_api/playlists/filters.py @@ -2,6 +2,7 @@ from django.db.models import Count from django_filters import rest_framework as filters from funkwhale_api.common import filters as common_filters +from funkwhale_api.music import models as music_models from funkwhale_api.music import utils from . import models @@ -10,6 +11,21 @@ from . import models class PlaylistFilter(filters.FilterSet): q = filters.CharFilter(field_name="_", method="filter_q") playable = filters.BooleanFilter(field_name="_", method="filter_playable") + track = filters.ModelChoiceFilter( + "playlist_tracks__track", + queryset=music_models.Track.objects.all(), + distinct=True, + ) + album = filters.ModelChoiceFilter( + "playlist_tracks__track__album", + queryset=music_models.Album.objects.all(), + distinct=True, + ) + artist = filters.ModelChoiceFilter( + "playlist_tracks__track__artist", + queryset=music_models.Artist.objects.all(), + distinct=True, + ) scope = common_filters.ActorScopeFilter(actor_field="user__actor", distinct=True) class Meta: diff --git a/api/tests/playlists/test_filters.py b/api/tests/playlists/test_filters.py new file mode 100644 index 000000000..ad6a7e2f6 --- /dev/null +++ b/api/tests/playlists/test_filters.py @@ -0,0 +1,29 @@ +from funkwhale_api.playlists import filters +from funkwhale_api.playlists import models + + +def test_playlist_filter_track(factories, queryset_equal_list): + plt = factories["playlists.PlaylistTrack"]() + factories["playlists.PlaylistTrack"]() + qs = models.Playlist.objects.all() + filterset = filters.PlaylistFilter({"track": plt.track.pk}, queryset=qs) + + assert filterset.qs == [plt.playlist] + + +def test_playlist_filter_album(factories, queryset_equal_list): + plt = factories["playlists.PlaylistTrack"]() + factories["playlists.PlaylistTrack"]() + qs = models.Playlist.objects.all() + filterset = filters.PlaylistFilter({"album": plt.track.album.pk}, queryset=qs) + + assert filterset.qs == [plt.playlist] + + +def test_playlist_filter_artist(factories, queryset_equal_list): + plt = factories["playlists.PlaylistTrack"]() + factories["playlists.PlaylistTrack"]() + qs = models.Playlist.objects.all() + filterset = filters.PlaylistFilter({"artist": plt.track.artist.pk}, queryset=qs) + + assert filterset.qs == [plt.playlist]