Fixed unplayable playlists (bis repetita)

This commit is contained in:
Eliot Berriot 2018-09-28 20:46:18 +02:00
parent 5e631440f8
commit 54972e489b
No known key found for this signature in database
GPG Key ID: DD6965E2476E5C27
4 changed files with 17 additions and 21 deletions

View File

@ -147,14 +147,10 @@ class Playlist(models.Model):
class PlaylistTrackQuerySet(models.QuerySet): class PlaylistTrackQuerySet(models.QuerySet):
def for_nested_serialization(self): def for_nested_serialization(self, actor=None):
return ( tracks = music_models.Track.objects.annotate_playable_by_actor(actor)
self.select_related() tracks = tracks.select_related("artist", "album__artist")
.select_related("track__album__artist") return self.prefetch_related(models.Prefetch("track", queryset=tracks, to_attr='_prefetched_track'))
.prefetch_related(
"track__tags", "track__uploads", "track__artist__albums__tracks__tags"
)
)
def annotate_playable_by_actor(self, actor): def annotate_playable_by_actor(self, actor):
tracks = ( tracks = (

View File

@ -10,18 +10,16 @@ from . import models
class PlaylistTrackSerializer(serializers.ModelSerializer): class PlaylistTrackSerializer(serializers.ModelSerializer):
track = TrackSerializer() # track = TrackSerializer()
is_playable = serializers.SerializerMethodField() track = serializers.SerializerMethodField()
class Meta: class Meta:
model = models.PlaylistTrack 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): def get_track(self, o):
try: track = o._prefetched_track if hasattr(o, "_prefetched_track") else o.track
return bool(obj.is_playable_by_actor) return TrackSerializer(track).data
except AttributeError:
return None
class PlaylistTrackWriteSerializer(serializers.ModelSerializer): class PlaylistTrackWriteSerializer(serializers.ModelSerializer):

View File

@ -39,7 +39,9 @@ class PlaylistViewSet(
@detail_route(methods=["get"]) @detail_route(methods=["get"])
def tracks(self, request, *args, **kwargs): def tracks(self, request, *args, **kwargs):
playlist = self.get_object() 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) serializer = serializers.PlaylistTrackSerializer(plts, many=True)
data = {"count": len(plts), "results": serializer.data} data = {"count": len(plts), "results": serializer.data}
return Response(data, status=200) return Response(data, status=200)
@ -59,7 +61,7 @@ class PlaylistViewSet(
plts = ( plts = (
models.PlaylistTrack.objects.filter(pk__in=ids) models.PlaylistTrack.objects.filter(pk__in=ids)
.order_by("index") .order_by("index")
.for_nested_serialization() .for_nested_serialization(music_utils.get_actor_from_request(request))
) )
serializer = serializers.PlaylistTrackSerializer(plts, many=True) serializer = serializers.PlaylistTrackSerializer(plts, many=True)
data = {"count": len(plts), "results": serializer.data} data = {"count": len(plts), "results": serializer.data}
@ -97,7 +99,7 @@ class PlaylistTrackViewSet(
): ):
serializer_class = serializers.PlaylistTrackSerializer serializer_class = serializers.PlaylistTrackSerializer
queryset = models.PlaylistTrack.objects.all().for_nested_serialization() queryset = models.PlaylistTrack.objects.all()
permission_classes = [ permission_classes = [
permissions.ConditionalAuthentication, permissions.ConditionalAuthentication,
permissions.OwnerPermission, permissions.OwnerPermission,
@ -118,7 +120,7 @@ class PlaylistTrackViewSet(
lookup_field="playlist__privacy_level", lookup_field="playlist__privacy_level",
user_field="playlist__user", 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): def perform_destroy(self, instance):
instance.delete(update_indexes=True) instance.delete(update_indexes=True)

View File

@ -21,7 +21,7 @@
</div> </div>
</h2> </h2>
<div class="ui hidden divider"></div> <div class="ui hidden divider"></div>
<play-button class="orange" :tracks="tracks"><translate>Play all</translate></play-button> <play-button class="orange" :is-playable="playlist.is_playable" :tracks="tracks"><translate>Play all</translate></play-button>
<button <button
class="ui icon button" class="ui icon button"
v-if="$store.state.auth.profile && playlist.user.id === $store.state.auth.profile.id" v-if="$store.state.auth.profile && playlist.user.id === $store.state.auth.profile.id"