From 944135e752df4cb1d1e258c4a8333609bcbd7a80 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Mon, 19 Mar 2018 12:36:15 +0100 Subject: [PATCH] Capped number of tracks in playlists --- api/config/settings/common.py | 3 +++ api/funkwhale_api/playlists/serializers.py | 9 +++++++++ api/tests/playlists/test_serializers.py | 16 ++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 api/tests/playlists/test_serializers.py diff --git a/api/config/settings/common.py b/api/config/settings/common.py index 000289e51..be5adf85c 100644 --- a/api/config/settings/common.py +++ b/api/config/settings/common.py @@ -383,3 +383,6 @@ CACHEOPS = { # Custom Admin URL, use {% url 'admin:index' %} ADMIN_URL = env('DJANGO_ADMIN_URL', default='^api/admin/') CSRF_USE_SESSIONS = True + +# Playlist settings +PLAYLISTS_MAX_TRACKS = env.int('PLAYLISTS_MAX_TRACKS', default=500) diff --git a/api/funkwhale_api/playlists/serializers.py b/api/funkwhale_api/playlists/serializers.py index d35f33145..77470c4de 100644 --- a/api/funkwhale_api/playlists/serializers.py +++ b/api/funkwhale_api/playlists/serializers.py @@ -1,3 +1,4 @@ +from django.conf import settings from rest_framework import serializers from taggit.models import Tag @@ -20,6 +21,14 @@ class PlaylistTrackCreateSerializer(serializers.ModelSerializer): model = models.PlaylistTrack fields = ('id', 'track', 'playlist', 'position') + def validate_playlist(self, value): + existing = value.playlist_tracks.count() + if existing >= settings.PLAYLISTS_MAX_TRACKS: + raise serializers.ValidationError( + 'Playlist has reached the maximum of {} tracks'.format( + settings.PLAYLISTS_MAX_TRACKS)) + return value + class PlaylistSerializer(serializers.ModelSerializer): diff --git a/api/tests/playlists/test_serializers.py b/api/tests/playlists/test_serializers.py new file mode 100644 index 000000000..6daff8e60 --- /dev/null +++ b/api/tests/playlists/test_serializers.py @@ -0,0 +1,16 @@ +from funkwhale_api.playlists import serializers + + +def test_cannot_max_500_tracks_per_playlist(mocker, factories, settings): + settings.PLAYLISTS_MAX_TRACKS = 2 + playlist = factories['playlists.Playlist']() + plts = factories['playlists.PlaylistTrack'].create_batch( + size=2, playlist=playlist) + track = factories['music.Track']() + serializer = serializers.PlaylistTrackCreateSerializer(data={ + 'playlist': playlist.pk, + 'track': track.pk, + }) + + assert serializer.is_valid() is False + assert 'playlist' in serializer.errors