From e7313a1d53e5f6a45f7dd708f1a89a021456e9b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ciar=C3=A1n=20Ainsworth?= Date: Sun, 12 May 2024 17:07:20 +0200 Subject: [PATCH] Create specific view for artist list --- api/funkwhale_api/music/views.py | 56 ++++++++++---------------------- 1 file changed, 17 insertions(+), 39 deletions(-) diff --git a/api/funkwhale_api/music/views.py b/api/funkwhale_api/music/views.py index cd8ab96be..eba95afbc 100644 --- a/api/funkwhale_api/music/views.py +++ b/api/funkwhale_api/music/views.py @@ -175,34 +175,36 @@ class ArtistViewSet( ) -class V2_ArtistsViewSet( +class V2_list_artists( HandleInvalidSearch, - common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelViewSet, + common_views.SkipFilterForGetObject, ): + + """ + List all artists. + """ + queryset = ( models.Artist.objects.all() .prefetch_related("attributed_to", "attachment_cover") - .prefetch_related( - "channel__actor", - Prefetch( - "tracks", - queryset=models.Track.objects.all(), - to_attr="_prefetched_tracks", - ), - ) .order_by("-id") ) + + def get_queryset(self): + queryset = super().get_queryset() + return queryset.prefetch_related(TAG_PREFETCH) + serializer_class = serializers.V2_BaseArtistSerializer permission_classes = [oauth_permissions.ScopePermission] required_scope = "libraries" anonymous_policy = "setting" - filterset_class = filters.ArtistFilter + filterset_class = filters.V2_ArtistFilter fetches = federation_decorators.fetches_route() - mutations = common_decorators.mutations_route(types=["update"]) - def get_object(self): + @extend_schema(operation_id="get-artists") + def get(self, request): obj = super().get_object() if ( @@ -210,32 +212,8 @@ class V2_ArtistsViewSet( and self.request.GET.get("refresh", "").lower() == "true" ): obj = refetch_obj(obj, self.get_queryset()) - return obj - - def get_serializer_context(self): - context = super().get_serializer_context() - context["description"] = self.action in ["retrieve", "create", "update"] - return context - - def get_queryset(self): - queryset = super().get_queryset() - albums = ( - models.Album.objects.with_tracks_count() - .select_related("attachment_cover") - .prefetch_related("tracks") - ) - albums = albums.annotate_playable_by_actor( - utils.get_actor_from_request(self.request) - ) - return queryset.prefetch_related( - Prefetch("albums", queryset=albums), TAG_PREFETCH - ) - - libraries = get_libraries( - lambda o, uploads: uploads.filter( - Q(track__artist=o) | Q(track__album__artist=o) - ) - ) + serializer = self.get_serializer() + return Response(serializer.data, status=200, content_type="application/json") class AlbumViewSet(