Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
funkwhale
funkwhale
Commits
b321ab8d
Commit
b321ab8d
authored
Feb 20, 2021
by
Georg Krause
Browse files
Add number of tracks and discs of an album to API
parent
b011db2b
Changes
4
Hide whitespace changes
Inline
Side-by-side
api/funkwhale_api/music/models.py
View file @
b321ab8d
...
...
@@ -20,6 +20,7 @@ from django.db.models.signals import post_save, pre_save
from
django.dispatch
import
receiver
from
django.urls
import
reverse
from
django.utils
import
timezone
from
django.db.models
import
Prefetch
,
Count
from
funkwhale_api
import
musicbrainz
from
funkwhale_api.common
import
fields
...
...
@@ -420,7 +421,13 @@ def import_album(v):
class
TrackQuerySet
(
common_models
.
LocalFromFidQuerySet
,
models
.
QuerySet
):
def
for_nested_serialization
(
self
):
return
self
.
prefetch_related
(
"artist"
,
"album__artist"
,
"album__attachment_cover"
"artist"
,
Prefetch
(
"album"
,
queryset
=
Album
.
objects
.
select_related
(
"artist"
,
"attachment_cover"
).
annotate
(
_prefetched_tracks_count
=
Count
(
"tracks"
)),
),
)
def
annotate_playable_by_actor
(
self
,
actor
):
...
...
api/funkwhale_api/music/serializers.py
View file @
b321ab8d
...
...
@@ -227,6 +227,10 @@ class AlbumSerializer(OptionalDescriptionMixin, serializers.Serializer):
class
TrackAlbumSerializer
(
serializers
.
ModelSerializer
):
artist
=
serializers
.
SerializerMethodField
()
cover
=
cover_field
tracks_count
=
serializers
.
SerializerMethodField
()
def
get_tracks_count
(
self
,
o
):
return
getattr
(
o
,
"_prefetched_tracks_count"
,
len
(
o
.
tracks
.
all
()))
class
Meta
:
model
=
models
.
Album
...
...
@@ -240,6 +244,7 @@ class TrackAlbumSerializer(serializers.ModelSerializer):
"cover"
,
"creation_date"
,
"is_local"
,
"tracks_count"
,
)
def
get_artist
(
self
,
o
):
...
...
api/tests/music/test_serializers.py
View file @
b321ab8d
...
...
@@ -196,6 +196,35 @@ def test_album_serializer(factories, to_api_date):
assert
serializer
.
data
==
expected
def
test_track_album_serializer
(
factories
,
to_api_date
):
actor
=
factories
[
"federation.Actor"
]()
track1
=
factories
[
"music.Track"
](
position
=
2
,
album__attributed_to
=
actor
,
album__with_cover
=
True
)
factories
[
"music.Track"
](
position
=
1
,
album
=
track1
.
album
)
album
=
track1
.
album
expected
=
{
"id"
:
album
.
id
,
"fid"
:
album
.
fid
,
"mbid"
:
str
(
album
.
mbid
),
"title"
:
album
.
title
,
"artist"
:
serializers
.
serialize_artist_simple
(
album
.
artist
),
"creation_date"
:
to_api_date
(
album
.
creation_date
),
"is_playable"
:
False
,
"cover"
:
common_serializers
.
AttachmentSerializer
(
album
.
attachment_cover
).
data
,
"release_date"
:
to_api_date
(
album
.
release_date
),
"tracks_count"
:
2
,
"is_local"
:
album
.
is_local
,
"tags"
:
[],
"attributed_to"
:
federation_serializers
.
APIActorSerializer
(
actor
).
data
,
}
serializer
=
serializers
.
AlbumSerializer
(
album
.
__class__
.
objects
.
with_tracks_count
().
get
(
pk
=
album
.
pk
)
)
assert
serializer
.
data
==
expected
def
test_track_serializer
(
factories
,
to_api_date
):
actor
=
factories
[
"federation.Actor"
]()
upload
=
factories
[
"music.Upload"
](
...
...
changes/changelog.d/1238.enhancement
0 → 100644
View file @
b321ab8d
Add number of tracks and discs of an album to API (#1238)
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment