diff --git a/api/funkwhale_api/music/filters.py b/api/funkwhale_api/music/filters.py index 76bc93b67..009f0088d 100644 --- a/api/funkwhale_api/music/filters.py +++ b/api/funkwhale_api/music/filters.py @@ -87,7 +87,7 @@ class UploadFilter(filters.FilterSet): class AlbumFilter(filters.FilterSet): playable = filters.BooleanFilter(field_name="_", method="filter_playable") - q = fields.SearchFilter(search_fields=["title", "artist__name" "source"]) + q = fields.SearchFilter(search_fields=["title", "artist__name"]) class Meta: model = models.Album diff --git a/api/tests/music/test_views.py b/api/tests/music/test_views.py index 85ba2955a..741fe9b29 100644 --- a/api/tests/music/test_views.py +++ b/api/tests/music/test_views.py @@ -108,6 +108,27 @@ def test_album_view_filter_playable(param, expected, factories, api_request): assert list(queryset) == expected +@pytest.mark.parametrize( + "param", [("I've Got"), ("Français"), ("I've Got Everything : Spoken Word Poetry")] +) +def test_album_view_filter_query(param, factories, api_request): + # Test both partial and full search. + factories["music.Album"](title="I've Got Nothing : Original Soundtrack") + factories["music.Album"](title="I've Got Cake : Remix") + factories["music.Album"](title="Français Et Tu") + factories["music.Album"](title="I've Got Everything : Spoken Word Poetry") + + request = api_request.get("/", {"q": param}) + view = views.AlbumViewSet() + view.action_map = {"get": "list"} + view.request = view.initialize_request(request) + queryset = view.filter_queryset(view.get_queryset()) + + # Loop through our "expected list", and assert some string finds against our param. + for val in list(queryset): + assert val.title.find(param) != -1 + + def test_can_serve_upload_as_remote_library( factories, authenticated_actor, logged_in_api_client, settings, preferences ): diff --git a/changes/changelog.d/356.bugfix b/changes/changelog.d/356.bugfix new file mode 100644 index 000000000..c99d36870 --- /dev/null +++ b/changes/changelog.d/356.bugfix @@ -0,0 +1 @@ +Fixed issue with querying the albums api endpoint (#356) \ No newline at end of file diff --git a/changes/changelog.d/356.feature b/changes/changelog.d/356.feature new file mode 100644 index 000000000..cf0744c18 --- /dev/null +++ b/changes/changelog.d/356.feature @@ -0,0 +1 @@ +Added albums view. Similar to artists view, it's viewable by clicking on the "Albums" link on the top bar. (#356) \ No newline at end of file diff --git a/front/src/components/library/Albums.vue b/front/src/components/library/Albums.vue new file mode 100644 index 000000000..4884cf0ee --- /dev/null +++ b/front/src/components/library/Albums.vue @@ -0,0 +1,186 @@ + + + + + Browsing albums + + + + + + Search + + + + + Ordering + + + {{ sharedLabels.filters[option[1]] }} + + + + + Ordering direction + + Ascending + Descending + + + + Results per page + + 12 + 25 + 50 + + + + + + + + + + + + + + + + + + + + + diff --git a/front/src/components/library/Library.vue b/front/src/components/library/Library.vue index c0371fe58..0276c34d0 100644 --- a/front/src/components/library/Library.vue +++ b/front/src/components/library/Library.vue @@ -4,6 +4,9 @@ Browse + + Albums + Artists diff --git a/front/src/router/index.js b/front/src/router/index.js index 1b60a6813..e6e5b2870 100644 --- a/front/src/router/index.js +++ b/front/src/router/index.js @@ -15,6 +15,7 @@ import Library from '@/components/library/Library' import LibraryHome from '@/components/library/Home' import LibraryArtist from '@/components/library/Artist' import LibraryArtists from '@/components/library/Artists' +import LibraryAlbums from '@/components/library/Albums' import LibraryAlbum from '@/components/library/Album' import LibraryTrack from '@/components/library/Track' import LibraryRadios from '@/components/library/Radios' @@ -277,6 +278,17 @@ export default new Router({ defaultPage: route.query.page }) }, + { + path: 'albums/', + name: 'library.albums.browse', + component: LibraryAlbums, + props: (route) => ({ + defaultOrdering: route.query.ordering, + defaultQuery: route.query.query, + defaultPaginateBy: route.query.paginateBy, + defaultPage: route.query.page + }) + }, { path: 'radios/', name: 'library.radios.browse',