See #432: include tags in admin API representation of tracks, albums and artists

This commit is contained in:
Eliot Berriot 2019-07-25 10:50:23 +02:00
parent a48a32c7e9
commit 84f830829f
No known key found for this signature in database
GPG Key ID: DD6965E2476E5C27
4 changed files with 28 additions and 13 deletions

View File

@ -62,10 +62,7 @@ class ManageArtistFilterSet(filters.FilterSet):
"field": forms.IntegerField(), "field": forms.IntegerField(),
"distinct": True, "distinct": True,
}, },
"tag": { "tag": {"to": "tagged_items__tag__name", "distinct": True},
"to": "tagged_items__tag__name",
"distinct": True,
},
}, },
) )
) )
@ -95,10 +92,7 @@ class ManageAlbumFilterSet(filters.FilterSet):
"field": forms.IntegerField(), "field": forms.IntegerField(),
"distinct": True, "distinct": True,
}, },
"tag": { "tag": {"to": "tagged_items__tag__name", "distinct": True},
"to": "tagged_items__tag__name",
"distinct": True,
},
}, },
) )
) )
@ -137,10 +131,7 @@ class ManageTrackFilterSet(filters.FilterSet):
"field": forms.IntegerField(), "field": forms.IntegerField(),
"distinct": True, "distinct": True,
}, },
"tag": { "tag": {"to": "tagged_items__tag__name", "distinct": True},
"to": "tagged_items__tag__name",
"distinct": True,
},
}, },
) )
) )

View File

@ -377,6 +377,7 @@ class ManageArtistSerializer(ManageBaseArtistSerializer):
albums = ManageNestedAlbumSerializer(many=True) albums = ManageNestedAlbumSerializer(many=True)
tracks = ManageNestedTrackSerializer(many=True) tracks = ManageNestedTrackSerializer(many=True)
attributed_to = ManageBaseActorSerializer() attributed_to = ManageBaseActorSerializer()
tags = serializers.SerializerMethodField()
class Meta: class Meta:
model = music_models.Artist model = music_models.Artist
@ -384,8 +385,13 @@ class ManageArtistSerializer(ManageBaseArtistSerializer):
"albums", "albums",
"tracks", "tracks",
"attributed_to", "attributed_to",
"tags",
] ]
def get_tags(self, obj):
tagged_items = getattr(obj, "_prefetched_tagged_items", [])
return [ti.tag.name for ti in tagged_items]
class ManageNestedArtistSerializer(ManageBaseArtistSerializer): class ManageNestedArtistSerializer(ManageBaseArtistSerializer):
pass pass
@ -395,6 +401,7 @@ class ManageAlbumSerializer(ManageBaseAlbumSerializer):
tracks = ManageNestedTrackSerializer(many=True) tracks = ManageNestedTrackSerializer(many=True)
attributed_to = ManageBaseActorSerializer() attributed_to = ManageBaseActorSerializer()
artist = ManageNestedArtistSerializer() artist = ManageNestedArtistSerializer()
tags = serializers.SerializerMethodField()
class Meta: class Meta:
model = music_models.Album model = music_models.Album
@ -402,8 +409,13 @@ class ManageAlbumSerializer(ManageBaseAlbumSerializer):
"artist", "artist",
"tracks", "tracks",
"attributed_to", "attributed_to",
"tags",
] ]
def get_tags(self, obj):
tagged_items = getattr(obj, "_prefetched_tagged_items", [])
return [ti.tag.name for ti in tagged_items]
class ManageTrackAlbumSerializer(ManageBaseAlbumSerializer): class ManageTrackAlbumSerializer(ManageBaseAlbumSerializer):
artist = ManageNestedArtistSerializer() artist = ManageNestedArtistSerializer()
@ -418,6 +430,7 @@ class ManageTrackSerializer(ManageNestedTrackSerializer):
album = ManageTrackAlbumSerializer() album = ManageTrackAlbumSerializer()
attributed_to = ManageBaseActorSerializer() attributed_to = ManageBaseActorSerializer()
uploads_count = serializers.SerializerMethodField() uploads_count = serializers.SerializerMethodField()
tags = serializers.SerializerMethodField()
class Meta: class Meta:
model = music_models.Track model = music_models.Track
@ -426,11 +439,16 @@ class ManageTrackSerializer(ManageNestedTrackSerializer):
"album", "album",
"attributed_to", "attributed_to",
"uploads_count", "uploads_count",
"tags",
] ]
def get_uploads_count(self, obj): def get_uploads_count(self, obj):
return getattr(obj, "uploads_count", None) return getattr(obj, "uploads_count", None)
def get_tags(self, obj):
tagged_items = getattr(obj, "_prefetched_tagged_items", [])
return [ti.tag.name for ti in tagged_items]
class ManageTrackActionSerializer(common_serializers.ActionSerializer): class ManageTrackActionSerializer(common_serializers.ActionSerializer):
actions = [common_serializers.Action("delete", allow_all=False)] actions = [common_serializers.Action("delete", allow_all=False)]

View File

@ -12,6 +12,7 @@ from funkwhale_api.federation import models as federation_models
from funkwhale_api.federation import tasks as federation_tasks from funkwhale_api.federation import tasks as federation_tasks
from funkwhale_api.history import models as history_models from funkwhale_api.history import models as history_models
from funkwhale_api.music import models as music_models from funkwhale_api.music import models as music_models
from funkwhale_api.music import views as music_views
from funkwhale_api.moderation import models as moderation_models from funkwhale_api.moderation import models as moderation_models
from funkwhale_api.playlists import models as playlists_models from funkwhale_api.playlists import models as playlists_models
from funkwhale_api.tags import models as tags_models from funkwhale_api.tags import models as tags_models
@ -71,6 +72,7 @@ class ManageArtistViewSet(
tracks_count=Count("tracks") tracks_count=Count("tracks")
), ),
), ),
music_views.TAG_PREFETCH,
) )
) )
serializer_class = serializers.ManageArtistSerializer serializer_class = serializers.ManageArtistSerializer
@ -108,7 +110,7 @@ class ManageAlbumViewSet(
music_models.Album.objects.all() music_models.Album.objects.all()
.order_by("-id") .order_by("-id")
.select_related("attributed_to", "artist") .select_related("attributed_to", "artist")
.prefetch_related("tracks") .prefetch_related("tracks", music_views.TAG_PREFETCH)
) )
serializer_class = serializers.ManageAlbumSerializer serializer_class = serializers.ManageAlbumSerializer
filterset_class = filters.ManageAlbumFilterSet filterset_class = filters.ManageAlbumFilterSet
@ -152,6 +154,7 @@ class ManageTrackViewSet(
.order_by("-id") .order_by("-id")
.select_related("attributed_to", "artist", "album__artist") .select_related("attributed_to", "artist", "album__artist")
.annotate(uploads_count=Coalesce(Subquery(uploads_subquery), 0)) .annotate(uploads_count=Coalesce(Subquery(uploads_subquery), 0))
.prefetch_related(music_views.TAG_PREFETCH)
) )
serializer_class = serializers.ManageTrackSerializer serializer_class = serializers.ManageTrackSerializer
filterset_class = filters.ManageTrackFilterSet filterset_class = filters.ManageTrackFilterSet

View File

@ -297,6 +297,7 @@ def test_manage_artist_serializer(factories, now):
"attributed_to": serializers.ManageBaseActorSerializer( "attributed_to": serializers.ManageBaseActorSerializer(
artist.attributed_to artist.attributed_to
).data, ).data,
"tags": [],
} }
s = serializers.ManageArtistSerializer(artist) s = serializers.ManageArtistSerializer(artist)
@ -387,6 +388,7 @@ def test_manage_album_serializer(factories, now):
"attributed_to": serializers.ManageBaseActorSerializer( "attributed_to": serializers.ManageBaseActorSerializer(
album.attributed_to album.attributed_to
).data, ).data,
"tags": [],
} }
s = serializers.ManageAlbumSerializer(album) s = serializers.ManageAlbumSerializer(album)
@ -414,6 +416,7 @@ def test_manage_track_serializer(factories, now):
track.attributed_to track.attributed_to
).data, ).data,
"uploads_count": 44, "uploads_count": 44,
"tags": [],
} }
s = serializers.ManageTrackSerializer(track) s = serializers.ManageTrackSerializer(track)