From 7222f7b710836b391f2e2556165bb976de67bb7a Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Sat, 28 Apr 2018 05:30:23 +0200 Subject: [PATCH] See #186: moved PLAYLISTS_MAX_TRACKS to playlists__max_tracks --- api/config/settings/common.py | 1 + .../playlists/dynamic_preferences_registry.py | 15 +++++++++++++++ api/funkwhale_api/playlists/models.py | 6 ++++-- api/funkwhale_api/playlists/serializers.py | 6 ++++-- api/tests/playlists/test_models.py | 4 ++-- api/tests/playlists/test_serializers.py | 4 ++-- 6 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 api/funkwhale_api/playlists/dynamic_preferences_registry.py diff --git a/api/config/settings/common.py b/api/config/settings/common.py index 2b9580b04..7eb409830 100644 --- a/api/config/settings/common.py +++ b/api/config/settings/common.py @@ -433,6 +433,7 @@ ADMIN_URL = env('DJANGO_ADMIN_URL', default='^api/admin/') CSRF_USE_SESSIONS = True # Playlist settings +# XXX: Deprecated, use playlists__max_tracks instead PLAYLISTS_MAX_TRACKS = env.int('PLAYLISTS_MAX_TRACKS', default=250) ACCOUNT_USERNAME_BLACKLIST = [ diff --git a/api/funkwhale_api/playlists/dynamic_preferences_registry.py b/api/funkwhale_api/playlists/dynamic_preferences_registry.py new file mode 100644 index 000000000..21140fa14 --- /dev/null +++ b/api/funkwhale_api/playlists/dynamic_preferences_registry.py @@ -0,0 +1,15 @@ +from dynamic_preferences import types +from dynamic_preferences.registries import global_preferences_registry + +from funkwhale_api.common import preferences + +playlists = types.Section('playlists') + + +@global_preferences_registry.register +class MaxTracks(preferences.DefaultFromSettingMixin, types.IntegerPreference): + show_in_api = True + section = playlists + name = 'max_tracks' + verbose_name = 'Max tracks per playlist' + setting = 'PLAYLISTS_MAX_TRACKS' diff --git a/api/funkwhale_api/playlists/models.py b/api/funkwhale_api/playlists/models.py index 6bb8fe178..a208a5fd0 100644 --- a/api/funkwhale_api/playlists/models.py +++ b/api/funkwhale_api/playlists/models.py @@ -6,6 +6,7 @@ from django.utils import timezone from rest_framework import exceptions from funkwhale_api.common import fields +from funkwhale_api.common import preferences class Playlist(models.Model): @@ -81,10 +82,11 @@ class Playlist(models.Model): existing = self.playlist_tracks.select_for_update() now = timezone.now() total = existing.filter(index__isnull=False).count() - if existing.count() + len(tracks) > settings.PLAYLISTS_MAX_TRACKS: + max_tracks = preferences.get('playlists__max_tracks') + if existing.count() + len(tracks) > max_tracks: raise exceptions.ValidationError( 'Playlist would reach the maximum of {} tracks'.format( - settings.PLAYLISTS_MAX_TRACKS)) + max_tracks)) self.save(update_fields=['modification_date']) start = total plts = [ diff --git a/api/funkwhale_api/playlists/serializers.py b/api/funkwhale_api/playlists/serializers.py index 6caf9aa4a..fcb2a412d 100644 --- a/api/funkwhale_api/playlists/serializers.py +++ b/api/funkwhale_api/playlists/serializers.py @@ -3,6 +3,7 @@ from django.db import transaction from rest_framework import serializers from taggit.models import Tag +from funkwhale_api.common import preferences from funkwhale_api.music.models import Track from funkwhale_api.music.serializers import TrackSerializerNested from funkwhale_api.users.serializers import UserBasicSerializer @@ -32,10 +33,11 @@ class PlaylistTrackWriteSerializer(serializers.ModelSerializer): raise serializers.ValidationError( 'You do not have the permission to edit this playlist') existing = value.playlist_tracks.count() - if existing >= settings.PLAYLISTS_MAX_TRACKS: + max_tracks = preferences.get('playlists__max_tracks') + if existing >= max_tracks: raise serializers.ValidationError( 'Playlist has reached the maximum of {} tracks'.format( - settings.PLAYLISTS_MAX_TRACKS)) + max_tracks)) return value @transaction.atomic diff --git a/api/tests/playlists/test_models.py b/api/tests/playlists/test_models.py index c9def4dab..fe5dd40a8 100644 --- a/api/tests/playlists/test_models.py +++ b/api/tests/playlists/test_models.py @@ -116,8 +116,8 @@ def test_can_insert_many(factories): assert plt.playlist == playlist -def test_insert_many_honor_max_tracks(factories, settings): - settings.PLAYLISTS_MAX_TRACKS = 4 +def test_insert_many_honor_max_tracks(preferences, factories): + preferences['playlists__max_tracks'] = 4 playlist = factories['playlists.Playlist']() plts = factories['playlists.PlaylistTrack'].create_batch( size=2, playlist=playlist) diff --git a/api/tests/playlists/test_serializers.py b/api/tests/playlists/test_serializers.py index 8e30919e6..908c1c796 100644 --- a/api/tests/playlists/test_serializers.py +++ b/api/tests/playlists/test_serializers.py @@ -2,8 +2,8 @@ from funkwhale_api.playlists import models from funkwhale_api.playlists import serializers -def test_cannot_max_500_tracks_per_playlist(factories, settings): - settings.PLAYLISTS_MAX_TRACKS = 2 +def test_cannot_max_500_tracks_per_playlist(factories, preferences): + preferences['playlists__max_tracks'] = 2 playlist = factories['playlists.Playlist']() plts = factories['playlists.PlaylistTrack'].create_batch( size=2, playlist=playlist)