From c642e7a94f6b7022224a5a998ce4ed297a788c33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ciar=C3=A1n=20Ainsworth?= Date: Mon, 18 Jul 2022 15:29:18 +0200 Subject: [PATCH] Add SimpleArtistSerializer --- api/funkwhale_api/audio/serializers.py | 12 ++-- api/funkwhale_api/favorites/serializers.py | 6 +- api/funkwhale_api/music/serializers.py | 77 +++++++--------------- api/tests/audio/test_serializers.py | 4 +- api/tests/music/test_serializers.py | 6 +- 5 files changed, 33 insertions(+), 72 deletions(-) diff --git a/api/funkwhale_api/audio/serializers.py b/api/funkwhale_api/audio/serializers.py index 2d3e6cafa..cc5d55644 100644 --- a/api/funkwhale_api/audio/serializers.py +++ b/api/funkwhale_api/audio/serializers.py @@ -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"): diff --git a/api/funkwhale_api/favorites/serializers.py b/api/funkwhale_api/favorites/serializers.py index a983779f6..24fece1ce 100644 --- a/api/funkwhale_api/favorites/serializers.py +++ b/api/funkwhale_api/favorites/serializers.py @@ -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") diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py index 968d4f467..22dc8a6c8 100644 --- a/api/funkwhale_api/music/serializers.py +++ b/api/funkwhale_api/music/serializers.py @@ -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}, ) diff --git a/api/tests/audio/test_serializers.py b/api/tests/audio/test_serializers.py index c91f1409f..785a844e3 100644 --- a/api/tests/audio/test_serializers.py +++ b/api/tests/audio/test_serializers.py @@ -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, diff --git a/api/tests/music/test_serializers.py b/api/tests/music/test_serializers.py index beb30279d..124a63f3e 100644 --- a/api/tests/music/test_serializers.py +++ b/api/tests/music/test_serializers.py @@ -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,