Skip to content
Snippets Groups Projects
Verified Commit 7c85d1ca authored by Eliot Berriot's avatar Eliot Berriot
Browse files

See #75: can now add multiple tracks to a playlist on creation and update

parent 1674ad91
No related branches found
No related tags found
No related merge requests found
...@@ -365,15 +365,24 @@ class SubsonicViewSet(viewsets.GenericViewSet): ...@@ -365,15 +365,24 @@ class SubsonicViewSet(viewsets.GenericViewSet):
else: else:
plt.delete(update_indexes=True) plt.delete(update_indexes=True)
ids = []
for i in data.getlist('songIdToAdd'):
try: try:
to_add = int(data['songIdToAdd']) ids.append(int(i))
track = music_models.Track.objects.get(pk=to_add) except (TypeError, ValueError):
except (TypeError, ValueError, KeyError):
pass pass
except music_models.Track.DoesNotExist: if ids:
tracks = music_models.Track.objects.filter(pk__in=ids)
by_id = {t.id: t for t in tracks}
sorted_tracks = []
for i in ids:
try:
sorted_tracks.append(by_id[i])
except KeyError:
pass pass
else: if sorted_tracks:
playlist.insert_many([track]) playlist.insert_many(sorted_tracks)
data = { data = {
'status': 'ok' 'status': 'ok'
} }
...@@ -409,15 +418,24 @@ class SubsonicViewSet(viewsets.GenericViewSet): ...@@ -409,15 +418,24 @@ class SubsonicViewSet(viewsets.GenericViewSet):
playlist = request.user.playlists.create( playlist = request.user.playlists.create(
name=name name=name
) )
ids = []
for i in data.getlist('songId'):
try: try:
to_add = int(data['songId']) ids.append(int(i))
track = music_models.Track.objects.get(pk=to_add) except (TypeError, ValueError):
except (TypeError, ValueError, KeyError):
pass pass
except music_models.Track.DoesNotExist:
if ids:
tracks = music_models.Track.objects.filter(pk__in=ids)
by_id = {t.id: t for t in tracks}
sorted_tracks = []
for i in ids:
try:
sorted_tracks.append(by_id[i])
except KeyError:
pass pass
else: if sorted_tracks:
playlist.insert_many([track]) playlist.insert_many(sorted_tracks)
playlist = request.user.playlists.with_tracks_count().get( playlist = request.user.playlists.with_tracks_count().get(
pk=playlist.pk) pk=playlist.pk)
data = { data = {
......
...@@ -318,15 +318,17 @@ def test_delete_playlist(f, db, logged_in_api_client, factories): ...@@ -318,15 +318,17 @@ def test_delete_playlist(f, db, logged_in_api_client, factories):
def test_create_playlist(f, db, logged_in_api_client, factories): def test_create_playlist(f, db, logged_in_api_client, factories):
url = reverse('api:subsonic-create-playlist') url = reverse('api:subsonic-create-playlist')
assert url.endswith('createPlaylist') is True assert url.endswith('createPlaylist') is True
track = factories['music.Track']() track1 = factories['music.Track']()
track2 = factories['music.Track']()
response = logged_in_api_client.get( response = logged_in_api_client.get(
url, {'f': f, 'name': 'hello', 'songId': track.pk}) url, {'f': f, 'name': 'hello', 'songId': [track1.pk, track2.pk]})
assert response.status_code == 200 assert response.status_code == 200
playlist = logged_in_api_client.user.playlists.latest('id') playlist = logged_in_api_client.user.playlists.latest('id')
plt = playlist.playlist_tracks.latest('id') assert playlist.playlist_tracks.count() == 2
for i, t in enumerate([track1, track2]):
plt = playlist.playlist_tracks.get(track=t)
assert plt.index == i
assert playlist.name == 'hello' assert playlist.name == 'hello'
assert plt.index == 0
assert plt.track == track
qs = playlist.__class__.objects.with_tracks_count() qs = playlist.__class__.objects.with_tracks_count()
assert response.data == { assert response.data == {
'playlist': serializers.get_playlist_detail_data(qs.first()) 'playlist': serializers.get_playlist_detail_data(qs.first())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment