diff --git a/api/funkwhale_api/playlists/models.py b/api/funkwhale_api/playlists/models.py index 510620334..ac86b97a0 100644 --- a/api/funkwhale_api/playlists/models.py +++ b/api/funkwhale_api/playlists/models.py @@ -147,13 +147,11 @@ class Playlist(models.Model): class PlaylistTrackQuerySet(models.QuerySet): - def for_nested_serialization(self): - return ( - self.select_related() - .select_related("track__album__artist") - .prefetch_related( - "track__tags", "track__uploads", "track__artist__albums__tracks__tags" - ) + def for_nested_serialization(self, actor=None): + tracks = music_models.Track.objects.annotate_playable_by_actor(actor) + tracks = tracks.select_related("artist", "album__artist") + return self.prefetch_related( + models.Prefetch("track", queryset=tracks, to_attr="_prefetched_track") ) def annotate_playable_by_actor(self, actor): diff --git a/api/funkwhale_api/playlists/serializers.py b/api/funkwhale_api/playlists/serializers.py index 40a1c62b5..c1ca84e15 100644 --- a/api/funkwhale_api/playlists/serializers.py +++ b/api/funkwhale_api/playlists/serializers.py @@ -10,18 +10,16 @@ from . import models class PlaylistTrackSerializer(serializers.ModelSerializer): - track = TrackSerializer() - is_playable = serializers.SerializerMethodField() + # track = TrackSerializer() + track = serializers.SerializerMethodField() class Meta: model = models.PlaylistTrack - fields = ("id", "track", "playlist", "index", "creation_date", "is_playable") + fields = ("id", "track", "playlist", "index", "creation_date") - def get_is_playable(self, obj): - try: - return bool(obj.is_playable_by_actor) - except AttributeError: - return None + def get_track(self, o): + track = o._prefetched_track if hasattr(o, "_prefetched_track") else o.track + return TrackSerializer(track).data class PlaylistTrackWriteSerializer(serializers.ModelSerializer): diff --git a/api/funkwhale_api/playlists/views.py b/api/funkwhale_api/playlists/views.py index 0c90335a9..4934b92a0 100644 --- a/api/funkwhale_api/playlists/views.py +++ b/api/funkwhale_api/playlists/views.py @@ -39,7 +39,9 @@ class PlaylistViewSet( @detail_route(methods=["get"]) def tracks(self, request, *args, **kwargs): playlist = self.get_object() - plts = playlist.playlist_tracks.all().for_nested_serialization() + plts = playlist.playlist_tracks.all().for_nested_serialization( + music_utils.get_actor_from_request(request) + ) serializer = serializers.PlaylistTrackSerializer(plts, many=True) data = {"count": len(plts), "results": serializer.data} return Response(data, status=200) @@ -59,7 +61,7 @@ class PlaylistViewSet( plts = ( models.PlaylistTrack.objects.filter(pk__in=ids) .order_by("index") - .for_nested_serialization() + .for_nested_serialization(music_utils.get_actor_from_request(request)) ) serializer = serializers.PlaylistTrackSerializer(plts, many=True) data = {"count": len(plts), "results": serializer.data} @@ -97,7 +99,7 @@ class PlaylistTrackViewSet( ): serializer_class = serializers.PlaylistTrackSerializer - queryset = models.PlaylistTrack.objects.all().for_nested_serialization() + queryset = models.PlaylistTrack.objects.all() permission_classes = [ permissions.ConditionalAuthentication, permissions.OwnerPermission, @@ -118,7 +120,7 @@ class PlaylistTrackViewSet( lookup_field="playlist__privacy_level", user_field="playlist__user", ) - ).annotate_playable_by_actor(music_utils.get_actor_from_request(self.request)) + ).for_nested_serialization(music_utils.get_actor_from_request(self.request)) def perform_destroy(self, instance): instance.delete(update_indexes=True) diff --git a/api/tests/playlists/test_views.py b/api/tests/playlists/test_views.py index 1c2b0f19e..1256347f3 100644 --- a/api/tests/playlists/test_views.py +++ b/api/tests/playlists/test_views.py @@ -145,7 +145,7 @@ def test_can_list_tracks_from_playlist(level, factories, logged_in_api_client): url = reverse("api:v1:playlists-tracks", kwargs={"pk": plt.playlist.pk}) response = logged_in_api_client.get(url) serialized_plt = serializers.PlaylistTrackSerializer(plt).data - + serialized_plt["track"]["is_playable"] = False assert response.data["count"] == 1 assert response.data["results"][0] == serialized_plt diff --git a/front/src/App.vue b/front/src/App.vue index d96e91d92..f4ec3b3f8 100644 --- a/front/src/App.vue +++ b/front/src/App.vue @@ -306,7 +306,7 @@ html, body { left: 350px; right: 0px; top: 0px; - z-index: 2000; + z-index: 99; } background-color: white; .item { diff --git a/front/src/views/playlists/Detail.vue b/front/src/views/playlists/Detail.vue index 5e69f4dd1..c1a08a7d1 100644 --- a/front/src/views/playlists/Detail.vue +++ b/front/src/views/playlists/Detail.vue @@ -21,7 +21,7 @@
-