Fixes playlist duration
This commit is contained in:
parent
d5d7de8590
commit
df8d865a6c
|
@ -1,4 +1,6 @@
|
||||||
from django.db import models, transaction
|
from django.db import models, transaction
|
||||||
|
from django.db.models.expressions import OuterRef, Subquery
|
||||||
|
from django.db.models import Q
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from rest_framework import exceptions
|
from rest_framework import exceptions
|
||||||
|
|
||||||
|
@ -11,8 +13,18 @@ class PlaylistQuerySet(models.QuerySet):
|
||||||
return self.annotate(_tracks_count=models.Count("playlist_tracks"))
|
return self.annotate(_tracks_count=models.Count("playlist_tracks"))
|
||||||
|
|
||||||
def with_duration(self):
|
def with_duration(self):
|
||||||
|
subquery = Subquery(
|
||||||
|
music_models.Upload.objects.filter(
|
||||||
|
track_id=OuterRef("playlist_tracks__track__id")
|
||||||
|
)
|
||||||
|
.order_by("id")
|
||||||
|
.values("id")[:1]
|
||||||
|
)
|
||||||
return self.annotate(
|
return self.annotate(
|
||||||
duration=models.Sum("playlist_tracks__track__uploads__duration")
|
duration=models.Sum(
|
||||||
|
"playlist_tracks__track__uploads__duration",
|
||||||
|
filter=Q(playlist_tracks__track__uploads=subquery),
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
def with_covers(self):
|
def with_covers(self):
|
||||||
|
|
|
@ -29,15 +29,46 @@ def test_playlist_serializer_include_covers(factories, api_request):
|
||||||
assert serializer.data["album_covers"] == expected
|
assert serializer.data["album_covers"] == expected
|
||||||
|
|
||||||
|
|
||||||
def test_playlist_serializer_include_duration(factories, api_request):
|
def test_playlist_serializer_include_duration(tmpfile, factories):
|
||||||
playlist = factories["playlists.Playlist"]()
|
playlist = factories["playlists.Playlist"]()
|
||||||
upload1 = factories["music.Upload"](duration=15)
|
event = {
|
||||||
upload2 = factories["music.Upload"](duration=30)
|
"path": tmpfile.name,
|
||||||
playlist.insert_many([upload1.track, upload2.track])
|
}
|
||||||
|
library = factories["music.Library"]()
|
||||||
|
track1 = factories["music.Track"]()
|
||||||
|
track2 = factories["music.Track"]()
|
||||||
|
factories["music.Upload"](
|
||||||
|
source="file://{}".format(event["path"]),
|
||||||
|
track=track1,
|
||||||
|
checksum="old",
|
||||||
|
library=library,
|
||||||
|
import_status="finished",
|
||||||
|
audio_file=None,
|
||||||
|
duration=21,
|
||||||
|
)
|
||||||
|
factories["music.Upload"](
|
||||||
|
source="file://{}".format(event["path"]),
|
||||||
|
track=track1,
|
||||||
|
checksum="old",
|
||||||
|
library=library,
|
||||||
|
import_status="finished",
|
||||||
|
audio_file=None,
|
||||||
|
duration=21,
|
||||||
|
)
|
||||||
|
factories["music.Upload"](
|
||||||
|
source="file://{}".format(event["path"]),
|
||||||
|
track=track2,
|
||||||
|
checksum="old",
|
||||||
|
library=library,
|
||||||
|
import_status="finished",
|
||||||
|
audio_file=None,
|
||||||
|
duration=21,
|
||||||
|
)
|
||||||
|
playlist.insert_many([track1, track2])
|
||||||
qs = playlist.__class__.objects.with_duration().with_tracks_count()
|
qs = playlist.__class__.objects.with_duration().with_tracks_count()
|
||||||
|
|
||||||
serializer = serializers.PlaylistSerializer(qs.get())
|
serializer = serializers.PlaylistSerializer(qs.get())
|
||||||
assert serializer.data["duration"] == 45
|
assert serializer.data["duration"] == 42
|
||||||
|
|
||||||
|
|
||||||
def test_playlist_serializer(factories, to_api_date):
|
def test_playlist_serializer(factories, to_api_date):
|
||||||
|
|
Loading…
Reference in New Issue