From 37ff297f538ae95b7015908b91ce6feda66ea3d0 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Thu, 26 Mar 2020 16:28:58 +0100
Subject: [PATCH] See #170: can now filter playlists by track, artist and album

---
 api/funkwhale_api/playlists/filters.py | 16 ++++++++++++++
 api/tests/playlists/test_filters.py    | 29 ++++++++++++++++++++++++++
 2 files changed, 45 insertions(+)
 create mode 100644 api/tests/playlists/test_filters.py

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]
-- 
GitLab