Fixed unplayable playlists (bis repetita)
This commit is contained in:
parent
5e631440f8
commit
54972e489b
|
@ -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 = (
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue