kopia lustrzana https://dev.funkwhale.audio/funkwhale/funkwhale
				
				
				
			Fixed unplayable playlists (bis repetita)
							rodzic
							
								
									5e631440f8
								
							
						
					
					
						commit
						54972e489b
					
				|  | @ -147,14 +147,10 @@ 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): | ||||
|         tracks = ( | ||||
|  |  | |||
|  | @ -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): | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ | |||
|           </div> | ||||
|         </h2> | ||||
|         <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 | ||||
|           class="ui icon button" | ||||
|           v-if="$store.state.auth.profile && playlist.user.id === $store.state.auth.profile.id" | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Eliot Berriot
						Eliot Berriot