class UserTrackFavoriteSerializer(serializers.ModelSerializer): track = TrackSerializer(read_only=True) user = UserBasicSerializer(read_only=True) class Meta: model = models.TrackFavorite fields = ("id", "user", "track", "creation_date")
class ListeningSerializer(serializers.ModelSerializer): track = TrackSerializer(read_only=True) user = UserBasicSerializer(read_only=True) class Meta: model = models.Listening fields = ("id", "user", "track", "creation_date") def create(self, validated_data): validated_data["user"] = self.context["user"] return super().create(validated_data)
class UserTrackFavoriteSerializer(serializers.ModelSerializer): track = TrackSerializer(read_only=True) user = UserBasicSerializer(read_only=True) actor = serializers.SerializerMethodField() class Meta: model = models.TrackFavorite fields = ("id", "user", "track", "creation_date", "actor") actor = serializers.SerializerMethodField() def get_actor(self, obj): actor = obj.user.actor if actor: return federation_serializers.APIActorSerializer(actor).data
class ListeningSerializer(serializers.ModelSerializer): track = TrackSerializer(read_only=True) user = UserBasicSerializer(read_only=True) actor = serializers.SerializerMethodField() class Meta: model = models.Listening fields = ("id", "user", "track", "creation_date", "actor") def create(self, validated_data): validated_data["user"] = self.context["user"] return super().create(validated_data) def get_actor(self, obj): actor = obj.user.actor if actor: return federation_serializers.APIActorSerializer(actor).data
class RadioSerializer(serializers.ModelSerializer): user = UserBasicSerializer(read_only=True) class Meta: model = models.Radio fields = ( "id", "is_public", "name", "creation_date", "user", "config", "description", ) read_only_fields = ("user", "creation_date") def save(self, **kwargs): kwargs["config"] = [ filters.registry[f["type"]].clean_config(f) for f in self.validated_data["config"] ] return super().save(**kwargs)
class PlaylistSerializer(serializers.ModelSerializer): tracks_count = serializers.SerializerMethodField(read_only=True) duration = serializers.SerializerMethodField(read_only=True) album_covers = serializers.SerializerMethodField(read_only=True) user = UserBasicSerializer(read_only=True) is_playable = serializers.SerializerMethodField() actor = serializers.SerializerMethodField() class Meta: model = models.Playlist fields = ( "id", "name", "user", "modification_date", "creation_date", "privacy_level", "tracks_count", "album_covers", "duration", "is_playable", "actor", ) read_only_fields = ["id", "modification_date", "creation_date"] def get_actor(self, obj): actor = obj.user.actor if actor: return federation_serializers.APIActorSerializer(actor).data def get_is_playable(self, obj): try: return bool(obj.playable_plts) except AttributeError: return None def get_tracks_count(self, obj): try: return obj.tracks_count except AttributeError: # no annotation? return obj.playlist_tracks.count() def get_duration(self, obj): try: return obj.duration except AttributeError: # no annotation? return 0 def get_album_covers(self, obj): try: plts = obj.plts_for_cover except AttributeError: return [] excluded_artists = [] try: user = self.context["request"].user except (KeyError, AttributeError): user = None if user and user.is_authenticated: excluded_artists = list( user.content_filters.values_list("target_artist", flat=True)) covers = [] max_covers = 5 for plt in plts: if plt.track.album.artist_id in excluded_artists: continue url = plt.track.album.attachment_cover.download_url_medium_square_crop if url in covers: continue covers.append(url) if len(covers) >= max_covers: break full_urls = [] for url in covers: if "request" in self.context: url = self.context["request"].build_absolute_uri(url) full_urls.append(url) return full_urls
class PlaylistSerializer(serializers.ModelSerializer): tracks_count = serializers.SerializerMethodField(read_only=True) duration = serializers.SerializerMethodField(read_only=True) album_covers = serializers.SerializerMethodField(read_only=True) user = UserBasicSerializer(read_only=True) is_playable = serializers.SerializerMethodField() class Meta: model = models.Playlist fields = ( "id", "name", "user", "modification_date", "creation_date", "privacy_level", "tracks_count", "album_covers", "duration", "is_playable", ) read_only_fields = ["id", "modification_date", "creation_date"] def get_is_playable(self, obj): try: return bool(obj.is_playable_by_actor) except AttributeError: return None def get_tracks_count(self, obj): try: return obj.tracks_count except AttributeError: # no annotation? return obj.playlist_tracks.count() def get_duration(self, obj): try: return obj.duration except AttributeError: # no annotation? return 0 def get_album_covers(self, obj): try: plts = obj.plts_for_cover except AttributeError: return [] covers = [] max_covers = 5 for plt in plts: url = plt.track.album.cover.crop["200x200"].url if url in covers: continue covers.append(url) if len(covers) >= max_covers: break full_urls = [] for url in covers: if "request" in self.context: url = self.context["request"].build_absolute_uri(url) full_urls.append(url) return full_urls