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.moderation import mrf
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 serializers as tags_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
)
metadata = serializers.DictField(required=False)
cover = music_serializers.COVER_WRITE_FIELD
cover = COVER_WRITE_FIELD
def validate(self, validated_data):
existing_channels = self.context["actor"].owned_channels.count()
@ -166,7 +166,7 @@ class ChannelUpdateSerializer(serializers.Serializer):
choices=music_models.ARTIST_CONTENT_CATEGORY_CHOICES
)
metadata = serializers.DictField(required=False)
cover = music_serializers.COVER_WRITE_FIELD
cover = COVER_WRITE_FIELD
def validate(self, validated_data):
validated_data = super().validate(validated_data)
@ -237,7 +237,7 @@ class ChannelUpdateSerializer(serializers.Serializer):
class ChannelSerializer(serializers.ModelSerializer):
artist = serializers.SerializerMethodField()
artist = SimpleArtistSerializer()
actor = serializers.SerializerMethodField()
downloads_count = serializers.SerializerMethodField()
attributed_to = federation_serializers.APIActorSerializer()
@ -258,10 +258,6 @@ class ChannelSerializer(serializers.ModelSerializer):
"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):
data = super().to_representation(obj)
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 (
TrackActivitySerializer,
TrackSerializer,
serialize_artist_simple,
)
from funkwhale_api.users.serializers import UserActivitySerializer, UserBasicSerializer
@ -35,10 +34,7 @@ class UserTrackFavoriteSerializer(serializers.ModelSerializer):
track = TrackSerializer(read_only=True)
user = UserBasicSerializer(read_only=True)
actor = serializers.SerializerMethodField()
def get_artist(self, obj) -> object:
return serialize_artist_simple(obj.artist)
class Meta:
model = models.TrackFavorite
fields = ("id", "user", "track", "creation_date", "actor")

View File

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

View File

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