From 031784556f6e4d21a8ac12ed45e28c3a0d6766bf Mon Sep 17 00:00:00 2001 From: Eliot Berriot <contact@eliotberriot.com> Date: Sun, 10 Jun 2018 13:34:15 +0200 Subject: [PATCH] Fixed #295: broken pagination in Subsonic API --- api/funkwhale_api/subsonic/views.py | 8 +++++--- api/tests/subsonic/test_views.py | 16 ++++++++++++++++ changes/changelog.d/295.bugfix | 1 + 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 changes/changelog.d/295.bugfix diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py index 7fb5db0e..bb5f4416 100644 --- a/api/funkwhale_api/subsonic/views.py +++ b/api/funkwhale_api/subsonic/views.py @@ -208,7 +208,9 @@ class SubsonicViewSet(viewsets.GenericViewSet): methods=["get", "post"], url_name="get_album_list2", url_path="getAlbumList2" ) def get_album_list2(self, request, *args, **kwargs): - queryset = music_models.Album.objects.with_tracks_count() + queryset = music_models.Album.objects.with_tracks_count().order_by( + "artist__name" + ) data = request.GET or request.POST filterset = filters.AlbumList2FilterSet(data, queryset=queryset) queryset = filterset.qs @@ -223,7 +225,7 @@ class SubsonicViewSet(viewsets.GenericViewSet): size = 50 size = min(size, 500) - queryset = queryset[offset:size] + queryset = queryset[offset : offset + size] data = {"albumList2": {"album": serializers.get_album_list2_data(queryset)}} return response.Response(data) @@ -283,7 +285,7 @@ class SubsonicViewSet(viewsets.GenericViewSet): queryset = c["queryset"].filter( utils.get_query(query, c["search_fields"]) ) - queryset = queryset[offset:size] + queryset = queryset[offset : offset + size] payload["searchResult3"][c["subsonic"]] = c["serializer"](queryset) return response.Response(payload) diff --git a/api/tests/subsonic/test_views.py b/api/tests/subsonic/test_views.py index 1523a2f6..b7431efa 100644 --- a/api/tests/subsonic/test_views.py +++ b/api/tests/subsonic/test_views.py @@ -217,6 +217,22 @@ def test_get_album_list2(f, db, logged_in_api_client, factories): } +@pytest.mark.parametrize("f", ["xml", "json"]) +def test_get_album_list2_pagination(f, db, logged_in_api_client, factories): + url = reverse("api:subsonic-get-album-list2") + assert url.endswith("getAlbumList2") is True + album1 = factories["music.Album"]() + factories["music.Album"]() + response = logged_in_api_client.get( + url, {"f": f, "type": "newest", "size": 1, "offset": 1} + ) + + assert response.status_code == 200 + assert response.data == { + "albumList2": {"album": serializers.get_album_list2_data([album1])} + } + + @pytest.mark.parametrize("f", ["xml", "json"]) def test_search3(f, db, logged_in_api_client, factories): url = reverse("api:subsonic-search3") diff --git a/changes/changelog.d/295.bugfix b/changes/changelog.d/295.bugfix new file mode 100644 index 00000000..02ad8f8f --- /dev/null +++ b/changes/changelog.d/295.bugfix @@ -0,0 +1 @@ +Fixed broken pagination in Subsonic API (#295) -- GitLab