From 3a3881f661921b04daa886ce46777ac602206eb7 Mon Sep 17 00:00:00 2001 From: Josh Washburne Date: Sat, 11 Apr 2020 18:17:39 -0400 Subject: [PATCH] Added better jingle functionality. --- savepointradio/api/views/controls.py | 12 +++--- .../core/dynamic_preferences_registry.py | 40 ++++++++++++++++++- savepointradio/profiles/managers.py | 25 ++++++++++++ 3 files changed, 68 insertions(+), 9 deletions(-) diff --git a/savepointradio/api/views/controls.py b/savepointradio/api/views/controls.py index f989d30..c447563 100644 --- a/savepointradio/api/views/controls.py +++ b/savepointradio/api/views/controls.py @@ -64,19 +64,17 @@ class NextRequest(RetrieveAPIView): def retrieve(self, request): dj_profile = RadioProfile.objects.get(user__is_dj=True) - limit = radio_settings['general__songs_per_jingle'] - queued_songs = SongRequest.music.get_queued_requests(limit) - if [j for j in queued_songs if j.song.is_jingle]: + if SongRequest.music.should_play_jingle(): + random_jingle = Song.music.get_random_jingle() + next_request = SongRequest.objects.create(profile=dj_profile, + song=random_jingle) + else: if not SongRequest.music.new_requests().exists(): random_song = Song.music.get_random_requestable_song() next_request = SongRequest.objects.create(profile=dj_profile, song=random_song) else: next_request = SongRequest.music.next_request() - else: - random_jingle = Song.music.get_random_jingle() - next_request = SongRequest.objects.create(profile=dj_profile, - song=random_jingle) next_request.queued_at = timezone.now() next_request.save(update_fields=['queued_at']) diff --git a/savepointradio/core/dynamic_preferences_registry.py b/savepointradio/core/dynamic_preferences_registry.py index a731960..110cf38 100644 --- a/savepointradio/core/dynamic_preferences_registry.py +++ b/savepointradio/core/dynamic_preferences_registry.py @@ -1,11 +1,16 @@ from django.forms import ValidationError +from django.utils import timezone -from dynamic_preferences.types import FloatPreference, IntegerPreference +from dynamic_preferences.types import ( + BooleanPreference, ChoicePreference, DurationPreference, + FloatPreference, IntegerPreference +) from dynamic_preferences.preferences import Section from dynamic_preferences.registries import global_preferences_registry general = Section('general') +jingles = Section('jingles') replay = Section('replay') @@ -27,8 +32,30 @@ class MaxSongRequests(IntegerPreference): @global_preferences_registry.register -class SongsPerJingle(IntegerPreference): +class JinglesEnabled(BooleanPreference): section = general + name = 'jingles_enabled' + help_text = 'Enable jingle functionality for the radio.' + default = False + required = False + + +@global_preferences_registry.register +class JinglesFunction(ChoicePreference): + section = jingles + name = 'jingles_function' + help_text = 'The function to determine when jingles are played.' + choices = [ + ('after_songs', 'After so many songs are played'), + ('after_time', 'After so much time has passed'), + ] + default = 'after_songs' + required = True + + +@global_preferences_registry.register +class SongsPerJingle(IntegerPreference): + section = jingles name = 'songs_per_jingle' help_text = 'The amount of songs that will be played between jingles.' default = 30 @@ -39,6 +66,15 @@ class SongsPerJingle(IntegerPreference): raise ValidationError('Must be greater than 0.') +@global_preferences_registry.register +class TimeBeforeJingle(DurationPreference): + section = jingles + name = 'time_before_jingle' + help_text = 'The amount of time before a jingle is played.' + default = timezone.timedelta(hours=1) + required = True + + @global_preferences_registry.register class ReplayRatio(FloatPreference): section = replay diff --git a/savepointradio/profiles/managers.py b/savepointradio/profiles/managers.py index 0bfe20e..930e422 100644 --- a/savepointradio/profiles/managers.py +++ b/savepointradio/profiles/managers.py @@ -1,4 +1,10 @@ from django.db import models +from django.utils import timezone + +from dynamic_preferences.registries import global_preferences_registry + + +radio_settings = global_preferences_registry.manager() class RequestManager(models.Manager): @@ -34,3 +40,22 @@ class RequestManager(models.Manager): def next_request(self): return self.new_requests().earliest('created_date') + + def should_play_jingle(self): + if radio_settings['general__jingles_enabled']: + function = radio_settings['jingles__jingles_function'] + if function == 'after_songs': + limit = radio_settings['jingles__songs_per_jingle'] + queued_songs = self.get_queued_requests(limit) + if not [j for j in queued_songs if j.song.is_jingle]: + return True + elif function == 'after_time': + now = timezone.now() + delta = radio_settings['jingles__time_before_jingle'] + earlier = now - delta + queued_songs = self.get_queued_requests().filter( + queued_at__range=(earlier, now) + ) + if not [j for j in queued_songs if j.song.is_jingle]: + return True + return False