diff --git a/marietje/api/urls.py b/marietje/api/urls.py index aa95ed9..f328f81 100644 --- a/marietje/api/urls.py +++ b/marietje/api/urls.py @@ -14,4 +14,6 @@ urlpatterns = [ url(r'^movedown', views.move_down), url(r'^cancel', views.cancel), url(r'^upload', views.upload), + url(r'^volumedown', views.volume_down), + url(r'^volumeup', views.volume_up), ] diff --git a/marietje/api/views.py b/marietje/api/views.py index 0853bfb..7fc02de 100644 --- a/marietje/api/views.py +++ b/marietje/api/views.py @@ -11,7 +11,7 @@ from django.views.decorators.http import require_http_methods from marietje.utils import song_to_dict, playlist_song_to_dict, send_to_bertha from songs.models import Song -from queues.models import PlaylistSong +from queues.models import PlaylistSong, Queue, QueueCommand from .forms import UploadForm @@ -185,3 +185,23 @@ def upload(request): return JsonResponse({ 'success': True }) + + +@require_http_methods(["POST"]) +@login_required +def volume_down(request): + if not request.user.has_perm('queues.can_control_volume'): + return HttpResponseForbidden() + command = QueueCommand(queue=request.user.queue, command='volume_down') + command.save() + return JsonResponse({}) + + +@require_http_methods(["POST"]) +@login_required +def volume_up(request): + if not request.user.has_perm('queues.can_control_volume'): + return HttpResponseForbidden() + command = QueueCommand(queue=request.user.queue, command='volume_up') + command.save() + return JsonResponse({}) diff --git a/marietje/marietje/static/js/queue.js b/marietje/marietje/static/js/queue.js index 6797067..a4d5099 100644 --- a/marietje/marietje/static/js/queue.js +++ b/marietje/marietje/static/js/queue.js @@ -73,6 +73,14 @@ $(function () { getSongs(); }); + $('#volume-down').click(function(){ + $.post('/api/volumedown', {csrfmiddlewaretoken: csrf_token}); + }); + + $('#volume-up').click(function(){ + $.post('/api/volumeup', {csrfmiddlewaretoken: csrf_token}); + }); + getSongs(); }); diff --git a/marietje/playerapi/views.py b/marietje/playerapi/views.py index 482a5a6..a709567 100644 --- a/marietje/playerapi/views.py +++ b/marietje/playerapi/views.py @@ -15,9 +15,15 @@ from .decorators import token_required def queue(request): queue = get_object_or_404(Queue, id=request.POST.get('queue')) + commands = queue.queuecommand_set.filter(executed=False) + for command in commands: + command.executed = True + command.save() + return JsonResponse({ 'current_song': playlist_song_to_dict(queue.current_song(), True), - 'queue': [playlist_song_to_dict(playlist_song, True) for playlist_song in queue.queue()[:1]] + 'queue': [playlist_song_to_dict(playlist_song, True) for playlist_song in queue.queue()[:1]], + 'commands': [command.command for command in commands] }) diff --git a/marietje/queues/admin.py b/marietje/queues/admin.py index 6b31b9a..b29c62d 100644 --- a/marietje/queues/admin.py +++ b/marietje/queues/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import Queue, Playlist, PlaylistSong +from .models import Queue, Playlist, PlaylistSong, QueueCommand admin.site.register(Playlist) @@ -9,3 +9,6 @@ admin.site.register(PlaylistSong) @admin.register(Queue) class OrderAdmin(admin.ModelAdmin): list_display = ('name', 'playlist', 'random_playlist') + + +admin.site.register(QueueCommand) diff --git a/marietje/queues/migrations/0002_auto_20170130_1348.py b/marietje/queues/migrations/0002_auto_20170130_1348.py new file mode 100644 index 0000000..9334f3e --- /dev/null +++ b/marietje/queues/migrations/0002_auto_20170130_1348.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.5 on 2017-01-30 13:48 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('queues', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='queue', + options={'permissions': (('can_skip', 'Can skip the currently playing song'), ('can_move', 'Can move all songs in the queue'), ('can_cancel', 'Can cancel all songs in the queue'), ('can_control_volume', 'Can control the volume of Marietje'))}, + ), + ] diff --git a/marietje/queues/migrations/0003_queuecommand.py b/marietje/queues/migrations/0003_queuecommand.py new file mode 100644 index 0000000..9bbec67 --- /dev/null +++ b/marietje/queues/migrations/0003_queuecommand.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.5 on 2017-01-30 14:56 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('queues', '0002_auto_20170130_1348'), + ] + + operations = [ + migrations.CreateModel( + name='QueueCommand', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('command', models.TextField()), + ('executed', models.BooleanField(default=False)), + ('queue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='queues.Queue')), + ], + ), + ] diff --git a/marietje/queues/models.py b/marietje/queues/models.py index 2c1a563..7692e40 100644 --- a/marietje/queues/models.py +++ b/marietje/queues/models.py @@ -63,6 +63,7 @@ class Queue(models.Model): ('can_skip', 'Can skip the currently playing song'), ('can_move', 'Can move all songs in the queue'), ('can_cancel', 'Can cancel all songs in the queue'), + ('can_control_volume', 'Can control the volume of Marietje'), ) name = models.TextField() @@ -138,5 +139,10 @@ class Queue(models.Model): return self.name - - +class QueueCommand(models.Model): + queue = models.ForeignKey( + Queue, + on_delete=models.CASCADE, + ) + command = models.TextField() + executed = models.BooleanField(default=False) diff --git a/marietje/queues/templates/queues/queue.html b/marietje/queues/templates/queues/queue.html index 700c9e5..cb35193 100644 --- a/marietje/queues/templates/queues/queue.html +++ b/marietje/queues/templates/queues/queue.html @@ -65,7 +65,9 @@