Add SimpleArtistSerializer

This commit is contained in:
Ciarán Ainsworth 2022-07-18 15:29:18 +02:00
parent c7a759f617
commit c642e7a94f
5 changed files with 33 additions and 72 deletions

View File

@ -28,7 +28,7 @@ from funkwhale_api.federation import serializers as federation_serializers
from funkwhale_api.federation import utils as federation_utils from funkwhale_api.federation import utils as federation_utils
from funkwhale_api.moderation import mrf from funkwhale_api.moderation import mrf
from funkwhale_api.music import models as music_models from funkwhale_api.music import models as music_models
from funkwhale_api.music import serializers as music_serializers from funkwhale_api.music.serializers import (SimpleArtistSerializer, COVER_WRITE_FIELD)
from funkwhale_api.tags import models as tags_models from funkwhale_api.tags import models as tags_models
from funkwhale_api.tags import serializers as tags_serializers from funkwhale_api.tags import serializers as tags_serializers
from funkwhale_api.users import serializers as users_serializers from funkwhale_api.users import serializers as users_serializers
@ -87,7 +87,7 @@ class ChannelCreateSerializer(serializers.Serializer):
choices=music_models.ARTIST_CONTENT_CATEGORY_CHOICES choices=music_models.ARTIST_CONTENT_CATEGORY_CHOICES
) )
metadata = serializers.DictField(required=False) metadata = serializers.DictField(required=False)
cover = music_serializers.COVER_WRITE_FIELD cover = COVER_WRITE_FIELD
def validate(self, validated_data): def validate(self, validated_data):
existing_channels = self.context["actor"].owned_channels.count() existing_channels = self.context["actor"].owned_channels.count()
@ -166,7 +166,7 @@ class ChannelUpdateSerializer(serializers.Serializer):
choices=music_models.ARTIST_CONTENT_CATEGORY_CHOICES choices=music_models.ARTIST_CONTENT_CATEGORY_CHOICES
) )
metadata = serializers.DictField(required=False) metadata = serializers.DictField(required=False)
cover = music_serializers.COVER_WRITE_FIELD cover = COVER_WRITE_FIELD
def validate(self, validated_data): def validate(self, validated_data):
validated_data = super().validate(validated_data) validated_data = super().validate(validated_data)
@ -237,7 +237,7 @@ class ChannelUpdateSerializer(serializers.Serializer):
class ChannelSerializer(serializers.ModelSerializer): class ChannelSerializer(serializers.ModelSerializer):
artist = serializers.SerializerMethodField() artist = SimpleArtistSerializer()
actor = serializers.SerializerMethodField() actor = serializers.SerializerMethodField()
downloads_count = serializers.SerializerMethodField() downloads_count = serializers.SerializerMethodField()
attributed_to = federation_serializers.APIActorSerializer() attributed_to = federation_serializers.APIActorSerializer()
@ -258,10 +258,6 @@ class ChannelSerializer(serializers.ModelSerializer):
"downloads_count", "downloads_count",
] ]
@extend_schema_field(OpenApiTypes.OBJECT)
def get_artist(self, obj):
return music_serializers.serialize_artist_simple(obj.artist)
def to_representation(self, obj): def to_representation(self, obj):
data = super().to_representation(obj) data = super().to_representation(obj)
if self.context.get("subscriptions_count"): if self.context.get("subscriptions_count"):

View File

@ -5,7 +5,6 @@ from funkwhale_api.federation import serializers as federation_serializers
from funkwhale_api.music.serializers import ( from funkwhale_api.music.serializers import (
TrackActivitySerializer, TrackActivitySerializer,
TrackSerializer, TrackSerializer,
serialize_artist_simple,
) )
from funkwhale_api.users.serializers import UserActivitySerializer, UserBasicSerializer from funkwhale_api.users.serializers import UserActivitySerializer, UserBasicSerializer
@ -36,9 +35,6 @@ class UserTrackFavoriteSerializer(serializers.ModelSerializer):
user = UserBasicSerializer(read_only=True) user = UserBasicSerializer(read_only=True)
actor = serializers.SerializerMethodField() actor = serializers.SerializerMethodField()
def get_artist(self, obj) -> object:
return serialize_artist_simple(obj.artist)
class Meta: class Meta:
model = models.TrackFavorite model = models.TrackFavorite
fields = ("id", "user", "track", "creation_date", "actor") fields = ("id", "user", "track", "creation_date", "actor")

View File

@ -33,9 +33,6 @@ COVER_WRITE_FIELD = common_serializers.RelatedField(
write_only=True, write_only=True,
) )
from funkwhale_api.audio import serializers as audio_serializers # NOQA
class CoverField(common_serializers.AttachmentSerializer): class CoverField(common_serializers.AttachmentSerializer):
pass pass
@ -144,44 +141,29 @@ class ArtistWithAlbumsSerializer(OptionalDescriptionMixin, serializers.Serialize
} }
def serialize_artist_simple(artist): class SimpleArtistSerializer(serializers.ModelSerializer):
data = { attachment_cover = cover_field
"id": artist.id, description = common_serializers.ContentSerializer()
"fid": artist.fid,
"mbid": str(artist.mbid), class Meta:
"name": artist.name, model = models.Artist
"creation_date": DATETIME_FIELD.to_representation(artist.creation_date), fields = (
"modification_date": DATETIME_FIELD.to_representation(artist.modification_date), "id",
"is_local": artist.is_local, "fid",
"content_category": artist.content_category, "mbid",
} "name",
if "description" in artist._state.fields_cache: "creation_date",
data["description"] = ( "modification_date",
common_serializers.ContentSerializer(artist.description).data "is_local",
if artist.description "content_category",
else None "description",
"attachment_cover",
"channel",
) )
if "attachment_cover" in artist._state.fields_cache:
data["cover"] = (
cover_field.to_representation(artist.attachment_cover)
if artist.attachment_cover
else None
)
if "channel" in artist._state.fields_cache and artist.get_channel():
data["channel"] = str(artist.channel.uuid)
if getattr(artist, "_tracks_count", None) is not None:
data["tracks_count"] = artist._tracks_count
if getattr(artist, "_prefetched_tagged_items", None) is not None:
data["tags"] = [ti.tag.name for ti in artist._prefetched_tagged_items]
return data
class AlbumSerializer(OptionalDescriptionMixin, serializers.Serializer): class AlbumSerializer(OptionalDescriptionMixin, serializers.Serializer):
artist = serializers.SerializerMethodField() artist = SimpleArtistSerializer()
cover = cover_field cover = cover_field
is_playable = serializers.SerializerMethodField() is_playable = serializers.SerializerMethodField()
tags = serializers.SerializerMethodField() tags = serializers.SerializerMethodField()
@ -191,16 +173,11 @@ class AlbumSerializer(OptionalDescriptionMixin, serializers.Serializer):
fid = serializers.URLField() fid = serializers.URLField()
mbid = serializers.UUIDField() mbid = serializers.UUIDField()
title = serializers.CharField() title = serializers.CharField()
artist = serializers.SerializerMethodField()
release_date = serializers.DateField() release_date = serializers.DateField()
creation_date = serializers.DateTimeField() creation_date = serializers.DateTimeField()
is_local = serializers.BooleanField() is_local = serializers.BooleanField()
duration = serializers.SerializerMethodField(read_only=True) duration = serializers.SerializerMethodField(read_only=True)
@extend_schema_field(OpenApiTypes.OBJECT)
def get_artist(self, obj):
return serialize_artist_simple(obj.artist)
def get_tracks_count(self, o) -> int: def get_tracks_count(self, o) -> int:
return len(o.tracks.all()) return len(o.tracks.all())
@ -229,7 +206,7 @@ class AlbumSerializer(OptionalDescriptionMixin, serializers.Serializer):
class TrackAlbumSerializer(serializers.ModelSerializer): class TrackAlbumSerializer(serializers.ModelSerializer):
artist = serializers.SerializerMethodField() artist = SimpleArtistSerializer()
cover = cover_field cover = cover_field
tracks_count = serializers.SerializerMethodField() tracks_count = serializers.SerializerMethodField()
@ -251,10 +228,6 @@ class TrackAlbumSerializer(serializers.ModelSerializer):
"tracks_count", "tracks_count",
) )
@extend_schema_field(OpenApiTypes.OBJECT)
def get_artist(self, o):
return serialize_artist_simple(o.artist)
def serialize_upload(upload) -> object: def serialize_upload(upload) -> object:
return { return {
@ -286,7 +259,7 @@ def sort_uploads_for_listen(uploads):
class TrackSerializer(OptionalDescriptionMixin, serializers.Serializer): class TrackSerializer(OptionalDescriptionMixin, serializers.Serializer):
artist = serializers.SerializerMethodField() artist = SimpleArtistSerializer()
album = TrackAlbumSerializer(read_only=True) album = TrackAlbumSerializer(read_only=True)
uploads = serializers.SerializerMethodField() uploads = serializers.SerializerMethodField()
listen_url = serializers.SerializerMethodField() listen_url = serializers.SerializerMethodField()
@ -297,7 +270,6 @@ class TrackSerializer(OptionalDescriptionMixin, serializers.Serializer):
fid = serializers.URLField() fid = serializers.URLField()
mbid = serializers.UUIDField() mbid = serializers.UUIDField()
title = serializers.CharField() title = serializers.CharField()
artist = serializers.SerializerMethodField()
creation_date = serializers.DateTimeField() creation_date = serializers.DateTimeField()
is_local = serializers.BooleanField() is_local = serializers.BooleanField()
position = serializers.IntegerField() position = serializers.IntegerField()
@ -308,10 +280,6 @@ class TrackSerializer(OptionalDescriptionMixin, serializers.Serializer):
cover = cover_field cover = cover_field
is_playable = serializers.SerializerMethodField() is_playable = serializers.SerializerMethodField()
@extend_schema_field(OpenApiTypes.OBJECT)
def get_artist(self, obj):
return serialize_artist_simple(obj.artist)
@extend_schema_field(OpenApiTypes.URI) @extend_schema_field(OpenApiTypes.URI)
def get_listen_url(self, obj): def get_listen_url(self, obj):
return obj.listen_url return obj.listen_url
@ -370,6 +338,7 @@ class LibraryForOwnerSerializer(serializers.ModelSerializer):
class UploadSerializer(serializers.ModelSerializer): class UploadSerializer(serializers.ModelSerializer):
from funkwhale_api.audio.serializers import ChannelSerializer
track = TrackSerializer(required=False, allow_null=True) track = TrackSerializer(required=False, allow_null=True)
library = common_serializers.RelatedField( library = common_serializers.RelatedField(
"uuid", "uuid",
@ -379,7 +348,7 @@ class UploadSerializer(serializers.ModelSerializer):
) )
channel = common_serializers.RelatedField( channel = common_serializers.RelatedField(
"uuid", "uuid",
audio_serializers.ChannelSerializer(), ChannelSerializer(),
required=False, required=False,
filters=lambda context: {"attributed_to": context["user"].actor}, filters=lambda context: {"attributed_to": context["user"].actor},
) )

View File

@ -216,7 +216,7 @@ def test_channel_serializer_representation(factories, to_api_date):
channel = factories["audio.Channel"](artist__description=content) channel = factories["audio.Channel"](artist__description=content)
setattr(channel, "_downloads_count", 12) setattr(channel, "_downloads_count", 12)
expected = { expected = {
"artist": music_serializers.serialize_artist_simple(channel.artist), "artist": music_serializers.SimpleArtistSerializer(),
"uuid": str(channel.uuid), "uuid": str(channel.uuid),
"creation_date": to_api_date(channel.creation_date), "creation_date": to_api_date(channel.creation_date),
"actor": federation_serializers.APIActorSerializer(channel.actor).data, "actor": federation_serializers.APIActorSerializer(channel.actor).data,
@ -240,7 +240,7 @@ def test_channel_serializer_external_representation(factories, to_api_date):
channel = factories["audio.Channel"](artist__description=content, external=True) channel = factories["audio.Channel"](artist__description=content, external=True)
expected = { expected = {
"artist": music_serializers.serialize_artist_simple(channel.artist), "artist": music_serializers.SimpleArtistSerializer(),
"uuid": str(channel.uuid), "uuid": str(channel.uuid),
"creation_date": to_api_date(channel.creation_date), "creation_date": to_api_date(channel.creation_date),
"actor": None, "actor": None,

View File

@ -179,7 +179,7 @@ def test_album_serializer(factories, to_api_date):
"fid": album.fid, "fid": album.fid,
"mbid": str(album.mbid), "mbid": str(album.mbid),
"title": album.title, "title": album.title,
"artist": serializers.serialize_artist_simple(album.artist), "artist": serializers.SimpleArtistSerializer(),
"creation_date": to_api_date(album.creation_date), "creation_date": to_api_date(album.creation_date),
"is_playable": False, "is_playable": False,
"duration": 0, "duration": 0,
@ -209,7 +209,7 @@ def test_track_album_serializer(factories, to_api_date):
"fid": album.fid, "fid": album.fid,
"mbid": str(album.mbid), "mbid": str(album.mbid),
"title": album.title, "title": album.title,
"artist": serializers.serialize_artist_simple(album.artist), "artist": serializers.SimpleArtistSerializer(),
"creation_date": to_api_date(album.creation_date), "creation_date": to_api_date(album.creation_date),
"is_playable": False, "is_playable": False,
"cover": common_serializers.AttachmentSerializer(album.attachment_cover).data, "cover": common_serializers.AttachmentSerializer(album.attachment_cover).data,
@ -241,7 +241,7 @@ def test_track_serializer(factories, to_api_date):
expected = { expected = {
"id": track.id, "id": track.id,
"fid": track.fid, "fid": track.fid,
"artist": serializers.serialize_artist_simple(track.artist), "artist": serializers.SimpleArtistSerializer(),
"album": serializers.TrackAlbumSerializer(track.album).data, "album": serializers.TrackAlbumSerializer(track.album).data,
"mbid": str(track.mbid), "mbid": str(track.mbid),
"title": track.title, "title": track.title,