From f6492a70dfedd2be4268a00b7cc2539a38859300 Mon Sep 17 00:00:00 2001 From: Jim Driessen Date: Sun, 24 Sep 2017 01:02:52 +0200 Subject: [PATCH 1/9] Fix race condition when requesting songs, causing them to get the same order value. --- .../0004_remove_playlistsong_order.py | 19 +++++++++++ marietje/queues/models.py | 34 ++++++------------- 2 files changed, 29 insertions(+), 24 deletions(-) create mode 100644 marietje/queues/migrations/0004_remove_playlistsong_order.py diff --git a/marietje/queues/migrations/0004_remove_playlistsong_order.py b/marietje/queues/migrations/0004_remove_playlistsong_order.py new file mode 100644 index 0000000..2033cbd --- /dev/null +++ b/marietje/queues/migrations/0004_remove_playlistsong_order.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.5 on 2017-09-23 22:59 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('queues', '0003_queuecommand'), + ] + + operations = [ + migrations.RemoveField( + model_name='playlistsong', + name='order', + ), + ] diff --git a/marietje/queues/models.py b/marietje/queues/models.py index 2d3c18a..f5a0a0e 100644 --- a/marietje/queues/models.py +++ b/marietje/queues/models.py @@ -36,22 +36,20 @@ class PlaylistSong(models.Model): # 3: Cancelled. state = models.IntegerField(default=0) - order = models.IntegerField() - def move_up(self): - other_song = PlaylistSong.objects.filter(playlist=self.playlist, order__lt=self.order)\ - .order_by('-order').first() + other_song = PlaylistSong.objects.filter(playlist=self.playlist, id__lt=self.id)\ + .order_by('-id').first() self.switch_order(other_song) def move_down(self): - other_song = PlaylistSong.objects.filter(playlist=self.playlist, order__gt=self.order).order_by('order').first() + other_song = PlaylistSong.objects.filter(playlist=self.playlist, id__gt=self.id).order_by('id').first() self.switch_order(other_song) def switch_order(self, other_song): - old_order = self.order - self.order = other_song.order + old_id = self.id + self.id = other_song.id + other_song.id = old_id self.save() - other_song.order = old_order other_song.save() def __str__(self): @@ -91,7 +89,7 @@ class Queue(models.Model): self.songs = PlaylistSong.objects\ .filter(Q(playlist=self.playlist_id) | Q(playlist_id=self.random_playlist_id), Q(state=0) | Q(state=1))\ - .order_by('-state', 'playlist_id', 'order')\ + .order_by('-state', 'playlist_id', 'id')\ .select_related('song', 'user') return self.songs @@ -112,12 +110,10 @@ class Queue(models.Model): return songs[1:] def request(self, song, user): - playlist_songs = PlaylistSong.objects.filter(playlist=self.playlist, state=0).order_by('order') + playlist_songs = PlaylistSong.objects.filter(playlist=self.playlist, state=0).order_by('id') - order = 0 seconds_in_a_row = 0 for playlist_song in playlist_songs: - order = playlist_song.order if playlist_song.user != user: seconds_in_a_row = 0 else: @@ -129,27 +125,17 @@ class Queue(models.Model): and not user.is_superuser and settings.LIMIT_HOURS[0] <= now.hour < settings.LIMIT_HOURS[1]: return False - if order is None: - order = 0 - order += 1 - playlist_song = PlaylistSong(playlist=self.playlist, song=song, user=user, order=order) + playlist_song = PlaylistSong(playlist=self.playlist, song=song, user=user) playlist_song.save() return True def fill_random_queue(self): song_count = PlaylistSong.objects.filter(playlist_id=self.random_playlist_id, state=0).count() while song_count < 5: - order = PlaylistSong.objects.filter(playlist_id=self.random_playlist_id)\ - .aggregate(Max('order'))['order__max'] - if order is None: - order = 0 - order += 1 song = Song.objects.filter(deleted=False).order_by('?').first() if song is None: return - playlist_song = PlaylistSong(playlist=self.random_playlist, - song=song, - user=None, order=order) + playlist_song = PlaylistSong(playlist=self.random_playlist, song=song, user=None) playlist_song.save() song_count += 1 From 5ce5dc55874f8e627f993b2f63cd2c7ed238402e Mon Sep 17 00:00:00 2001 From: Jim Driessen Date: Sun, 24 Sep 2017 02:17:44 +0200 Subject: [PATCH 2/9] Add informative messages for registration and password resetting. --- marietje/marietje/settings.py | 2 ++ marietje/marietje/templates/base.html | 8 +++++++ marietje/marietje/views.py | 32 +++++++++++++++++++-------- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/marietje/marietje/settings.py b/marietje/marietje/settings.py index 577fa9e..61c4291 100644 --- a/marietje/marietje/settings.py +++ b/marietje/marietje/settings.py @@ -150,3 +150,5 @@ MAX_MINUTES_IN_A_ROW = 20 # Time range (dependent on timezone specified) when MAX_MINUTES_IN_A_ROW is in effect. LIMIT_ALWAYS = False LIMIT_HOURS = (12, 16) + +CONTACT_EMAIL = 'marietje@science.ru.nl' diff --git a/marietje/marietje/templates/base.html b/marietje/marietje/templates/base.html index 23bab7e..a997725 100644 --- a/marietje/marietje/templates/base.html +++ b/marietje/marietje/templates/base.html @@ -59,6 +59,14 @@ {% endfor %} {% endfor %} {% endif %} + {% if messages %} + {% for message in messages %} +
+ + {{ message }} +
+ {% endfor %} + {% endif %} {% block content %}{% endblock content %} diff --git a/marietje/marietje/views.py b/marietje/marietje/views.py index d7c5cef..235ff99 100644 --- a/marietje/marietje/views.py +++ b/marietje/marietje/views.py @@ -1,11 +1,15 @@ -import random, string -from django.shortcuts import render, redirect, get_object_or_404 +import random +import string + +from django.conf import settings +from django.contrib import messages from django.contrib.auth import get_user_model from django.core.mail import send_mail -from django.conf import settings +from django.shortcuts import render, redirect, get_object_or_404 from django.urls import reverse -from .forms import RegistrationForm, ResetPasswordForm + from marietje.utils import get_first_queue +from .forms import RegistrationForm, ResetPasswordForm def register(request): @@ -31,8 +35,9 @@ def register(request): 'Please confirm your account by following this link: ' + activation_link, settings.MAIL_FROM, [user.email], - fail_silently=True - ) + fail_silently=True) + messages.add_message(request, messages.INFO, 'Please check your email, ' + user.email + ', for activation.', + extra_tags='info') return redirect('login') @@ -42,6 +47,10 @@ def activate(request, user_id, token): if token == user.activation_token: user.activation_token = None user.save() + messages.add_message(request, messages.SUCCESS, 'Successfully activated.', extra_tags='success') + else: + messages.add_message(request, messages.ERROR, 'Activation failed. If the problem persists, please contact ' + + settings.CONTACT_EMAIL + '.', extra_tags='danger') return redirect('login') @@ -52,6 +61,7 @@ def forgotpassword(request): User = get_user_model() user = User.objects.filter(username=request.POST.get('email')).first() if user is None or user.activation_token: + messages.add_message(request, messages.ERROR, 'No (active) user found.', extra_tags='danger') return render(request, 'registration/forgotpassword.html') user.reset_token = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(32)) @@ -63,8 +73,9 @@ def forgotpassword(request): + reset_link + '\nIf you did not request to reset your password, you can ignore this email.', settings.MAIL_FROM, [user.email], - fail_silently=True - ) + fail_silently=True) + messages.add_message(request, messages.INFO, 'Please check your email, ' + user.email + + ', for resetting your password.', extra_tags='info') return redirect('login') @@ -72,6 +83,7 @@ def resetpassword(request, user_id, token): User = get_user_model() user = get_object_or_404(User, pk=user_id) if not user.reset_token or token != user.reset_token: + messages.add_message(request, messages.ERROR, 'Invalid password reset link.', extra_tags='danger') return redirect('login') if not request.POST: return render(request, 'registration/resetpassword.html', {'user_id': user.id, 'reset_token': token}) @@ -79,9 +91,11 @@ def resetpassword(request, user_id, token): form = ResetPasswordForm(request.POST) if not form.is_valid(): - return render(request, 'registration/resetpassword.html', {'user_id': user.id, 'reset_token': token, 'form': form}) + return render(request, 'registration/resetpassword.html', {'user_id': user.id, 'reset_token': token, + 'form': form}) user.reset_token = None user.set_password(form.cleaned_data['password1']) user.save() + messages.add_message(request, messages.SUCCESS, 'Your password has been reset.', extra_tags='success') return redirect('login') From cbc9284865d5cbbf69f46ba1dc071ad4efe3ebcd Mon Sep 17 00:00:00 2001 From: Jim Driessen Date: Mon, 25 Sep 2017 17:46:26 +0200 Subject: [PATCH 3/9] More statistics on the stats page. --- marietje/stats/templates/stats/stats.html | 90 ++++++++++++----------- marietje/stats/views.py | 11 ++- 2 files changed, 57 insertions(+), 44 deletions(-) diff --git a/marietje/stats/templates/stats/stats.html b/marietje/stats/templates/stats/stats.html index 4b6a47b..eaa361c 100644 --- a/marietje/stats/templates/stats/stats.html +++ b/marietje/stats/templates/stats/stats.html @@ -5,46 +5,54 @@ {% block content %}

Statistics

-

Uploads

-
- - - - - - - - - - {% for stat in upload_stats %} - - - - - - {% endfor %} - -
#User# Songs
{{ forloop.counter }}{{ stat.user__name }}{{ stat.total }}
-
-

Requests

-
- - - - - - - - - - {% for stat in request_stats %} - - - - - - {% endfor %} - -
#User# Requests
{{ forloop.counter }}{{ stat.user__name }}{{ stat.total }}
+
+
+

Uploads

+

Total: {{ total_uploads }}

+
+ + + + + + + + + + {% for stat in upload_stats %} + + + + + + {% endfor %} + +
#User# Songs
{{ forloop.counter }}{{ stat.user__name }}{{ stat.total }} ({% widthratio stat.total total_uploads 100 %}%)
+
+
+
+

Requests

+

Total: {{ total_requests }}

+
+ + + + + + + + + + {% for stat in request_stats %} + + + + + + {% endfor %} + +
#User# Requests
{{ forloop.counter }}{{ stat.user__name }}{{ stat.total }} ({% widthratio stat.total total_requests 100 %}%)
+
+
{% endblock %} diff --git a/marietje/stats/views.py b/marietje/stats/views.py index 0b4b27d..740c5f0 100644 --- a/marietje/stats/views.py +++ b/marietje/stats/views.py @@ -5,6 +5,11 @@ from queues.models import PlaylistSong def stats(request): - upload_stats = Song.objects.all().exclude(user_id=None).values('user__name').annotate(total=Count('id')).order_by('-total') - request_stats = PlaylistSong.objects.all().exclude(user_id=None).values('user__name').annotate(total=Count('id')).order_by('-total') - return render(request, 'stats/stats.html', {'upload_stats': upload_stats, 'request_stats': request_stats}) + total_uploads = Song.objects.all().filter(deleted=False).exclude(user_id=None).count() + upload_stats = Song.objects.all().filter(deleted=False).exclude(user_id=None).values('user__name')\ + .annotate(total=Count('id')).order_by('-total') + total_requests = PlaylistSong.objects.all().filter(state=2).exclude(user_id=None).count() + request_stats = PlaylistSong.objects.all().filter(state=2).exclude(user_id=None).values('user__name')\ + .annotate(total=Count('id')).order_by('-total') + return render(request, 'stats/stats.html', {'total_uploads': total_uploads, 'upload_stats': upload_stats, + 'total_requests': total_requests, 'request_stats': request_stats}) From 04cdce9ad4f8c75f7553601a69292d90090f2325 Mon Sep 17 00:00:00 2001 From: Jim Driessen Date: Thu, 28 Sep 2017 17:25:21 +0200 Subject: [PATCH 4/9] Add more stats. --- marietje/marietje/settings.py | 3 + marietje/playerapi/views.py | 12 +-- .../migrations/0005_playlistsong_played_at.py | 20 +++++ marietje/queues/models.py | 1 + marietje/stats/templates/stats/stats.html | 82 ++++++++++++++++++- marietje/stats/views.py | 49 +++++++++-- 6 files changed, 148 insertions(+), 19 deletions(-) create mode 100644 marietje/queues/migrations/0005_playlistsong_played_at.py diff --git a/marietje/marietje/settings.py b/marietje/marietje/settings.py index 61c4291..1d39fa7 100644 --- a/marietje/marietje/settings.py +++ b/marietje/marietje/settings.py @@ -152,3 +152,6 @@ LIMIT_ALWAYS = False LIMIT_HOURS = (12, 16) CONTACT_EMAIL = 'marietje@science.ru.nl' + +STATS_TOP_COUNT = 50 +STATS_REQUEST_IGNORE_USER_IDS = (51, 515) diff --git a/marietje/playerapi/views.py b/marietje/playerapi/views.py index f3f3786..d81f105 100644 --- a/marietje/playerapi/views.py +++ b/marietje/playerapi/views.py @@ -34,6 +34,10 @@ def play(request): queue = get_object_or_404(Queue, id=request.POST.get('queue')) queue.started_at = timezone.now() queue.save() + current_song = queue.current_song() + current_song.played_at = queue.started_at + current_song.save() + return JsonResponse({}) @@ -46,14 +50,6 @@ def next(request): player_song.save() return JsonResponse({}) -@csrf_exempt -@token_required -def next(request): - queue = get_object_or_404(Queue, id=request.POST.get('queue')) - player_song = queue.current_song() - player_song.state = 2 - player_song.save() - return JsonResponse({}) @csrf_exempt @token_required diff --git a/marietje/queues/migrations/0005_playlistsong_played_at.py b/marietje/queues/migrations/0005_playlistsong_played_at.py new file mode 100644 index 0000000..e51bf7d --- /dev/null +++ b/marietje/queues/migrations/0005_playlistsong_played_at.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.5 on 2017-09-26 13:56 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('queues', '0004_remove_playlistsong_order'), + ] + + operations = [ + migrations.AddField( + model_name='playlistsong', + name='played_at', + field=models.DateTimeField(blank=True, null=True), + ), + ] diff --git a/marietje/queues/models.py b/marietje/queues/models.py index f5a0a0e..a67ca89 100644 --- a/marietje/queues/models.py +++ b/marietje/queues/models.py @@ -29,6 +29,7 @@ class PlaylistSong(models.Model): blank=True, null=True ) + played_at = models.DateTimeField(blank=True, null=True) # 0: Queued. # 1: Playing. diff --git a/marietje/stats/templates/stats/stats.html b/marietje/stats/templates/stats/stats.html index eaa361c..8189cd8 100644 --- a/marietje/stats/templates/stats/stats.html +++ b/marietje/stats/templates/stats/stats.html @@ -9,13 +9,14 @@

Uploads

Total: {{ total_uploads }}

+

Top {{ stats_top_count }}:

- + @@ -33,13 +34,14 @@

Requests

Total: {{ total_requests }}

+

Top {{ stats_top_count }}:

# User# Songs# Songs
- + @@ -54,5 +56,81 @@
# User# Requests# Requests
+
+

Unique requests

+

Top {{ stats_top_count }}:

+
+ + + + + + + + + + {% for stat in unique_request_stats %} + + + + + + {% endfor %} + +
#User# Requests
{{ forloop.counter }}{{ stat.user__name }}{{ stat.total }} ({{stat.ratio }}%)
+
+
+
+

Most played songs

+

Top {{ stats_top_count }}:

+
+ + + + + + + + + + + {% for stat in most_played_songs %} + + + + + + + {% endfor %} + +
#ArtistTitle# Requests
{{ forloop.counter }}{{ stat.song__artist }}{{ stat.song__title }}{{ stat.total }}
+
+
+
+

Most played songs last 14 days

+

Top {{ stats_top_count }}:

+
+ + + + + + + + + + + {% for stat in most_played_songs_14_days %} + + + + + + + {% endfor %} + +
#ArtistTitle# Requests
{{ forloop.counter }}{{ stat.song__artist }}{{ stat.song__title }}{{ stat.total }}
+
+
{% endblock %} diff --git a/marietje/stats/views.py b/marietje/stats/views.py index 740c5f0..caba1fa 100644 --- a/marietje/stats/views.py +++ b/marietje/stats/views.py @@ -1,15 +1,46 @@ +from datetime import timedelta + +from django.conf import settings +from django.db.models import Count, Q from django.shortcuts import render -from django.db.models import Count -from songs.models import Song +from django.utils import timezone + from queues.models import PlaylistSong +from songs.models import Song def stats(request): - total_uploads = Song.objects.all().filter(deleted=False).exclude(user_id=None).count() - upload_stats = Song.objects.all().filter(deleted=False).exclude(user_id=None).values('user__name')\ - .annotate(total=Count('id')).order_by('-total') - total_requests = PlaylistSong.objects.all().filter(state=2).exclude(user_id=None).count() - request_stats = PlaylistSong.objects.all().filter(state=2).exclude(user_id=None).values('user__name')\ - .annotate(total=Count('id')).order_by('-total') + total_uploads = Song.objects.filter(deleted=False).exclude(user_id=None).count() + + upload_stats = Song.objects.filter(deleted=False).exclude(user_id=None).values('user__name').annotate( + total=Count('id')).order_by('-total', 'user__name')[:settings.STATS_TOP_COUNT] + + total_requests = PlaylistSong.objects.filter(state=2).exclude( + Q(user_id=None) | Q(user_id__in=settings.STATS_REQUEST_IGNORE_USER_IDS)).count() + + request_stats = PlaylistSong.objects.filter(state=2).exclude( + Q(user_id=None) | Q(user_id__in=settings.STATS_REQUEST_IGNORE_USER_IDS)).values('user__name').annotate( + total=Count('id')).order_by('-total', 'user__name')[:settings.STATS_TOP_COUNT] + + unique_request_stats = PlaylistSong.objects.filter(state=2).exclude( + Q(user_id=None) | Q(user_id__in=settings.STATS_REQUEST_IGNORE_USER_IDS)).values( + 'user__name', 'user__name').annotate( + total=Count('song_id', distinct=True), ratio=Count('song_id', distinct=True) / Count('id') * 100).order_by( + '-total')[:settings.STATS_TOP_COUNT] + + most_played_songs = PlaylistSong.objects.filter(state=2).exclude( + Q(user_id=None) | Q(user_id__in=settings.STATS_REQUEST_IGNORE_USER_IDS)).values( + 'song__artist', 'song__title').annotate(total=Count('id')).order_by( + '-total', 'song__artist')[:settings.STATS_TOP_COUNT] + + most_played_songs_14_days = PlaylistSong.objects.filter( + state=2, played_at__gte=timezone.now() - timedelta(days=14)).exclude(user_id=None).values( + 'song__artist', 'song__title').annotate(total=Count('id')).order_by( + '-total', 'song__artist')[:settings.STATS_TOP_COUNT] + return render(request, 'stats/stats.html', {'total_uploads': total_uploads, 'upload_stats': upload_stats, - 'total_requests': total_requests, 'request_stats': request_stats}) + 'total_requests': total_requests, 'request_stats': request_stats, + 'unique_request_stats': unique_request_stats, + 'most_played_songs': most_played_songs, + 'most_played_songs_14_days': most_played_songs_14_days, + 'stats_top_count': settings.STATS_TOP_COUNT}) From f50e76626c83f7086f887c176b83c280af78ba37 Mon Sep 17 00:00:00 2001 From: Jim Driessen Date: Thu, 28 Sep 2017 20:40:07 +0200 Subject: [PATCH 5/9] Scroll to top when searching is complete. --- marietje/marietje/static/js/queue.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/marietje/marietje/static/js/queue.js b/marietje/marietje/static/js/queue.js index 88db7ce..172f631 100644 --- a/marietje/marietje/static/js/queue.js +++ b/marietje/marietje/static/js/queue.js @@ -48,11 +48,11 @@ $(function () { $('#cancel-request').click(function () { hideRequestTable(); }); - + $('.pagenum').change(function(){ getSongs(); }); - + $('#search-all, #search-uploader').change(function(){ $('.pagenum').val(1); getSongs(); @@ -63,24 +63,24 @@ $(function () { $('.pagenum').val(1); getSongs(); }); - + $('button.prev').click(function(){ var pageNumSelect = $('.pagenum'); pageNumSelect.val(Math.max(parseInt(pageNumSelect.val()) - 1, 1)); getSongs(); }); - + $('button.next').click(function(){ var pageNumSelect = $('.pagenum'); pageNumSelect.val(Math.min(parseInt(pageNumSelect.val()) + 1, pageNumSelect.children('option:last-child').val())); getSongs(); }); - + $('button.first').click(function(){ $('.pagenum').val(1); getSongs(); }); - + $('button.last').click(function(){ var pageNumSelect = $('.pagenum'); pageNumSelect.val(pageNumSelect.children('option:last-child').val()); @@ -279,6 +279,10 @@ function getSongs() } pageNumSelect.val(result.current_page); $('.pagesize').val(result.per_page); + refreshingSongs = false; + if(requestViewOpen) { + window.scrollTo(0, 0); + } }); } From 041cd6e2b638e78fc8d3903992380695838a5ffd Mon Sep 17 00:00:00 2001 From: Jim Driessen Date: Thu, 28 Sep 2017 20:41:08 +0200 Subject: [PATCH 6/9] Disable first, previous, next and last buttons on the applicable search pages. --- marietje/marietje/static/js/queue.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/marietje/marietje/static/js/queue.js b/marietje/marietje/static/js/queue.js index 172f631..7ba2c1d 100644 --- a/marietje/marietje/static/js/queue.js +++ b/marietje/marietje/static/js/queue.js @@ -279,6 +279,10 @@ function getSongs() } pageNumSelect.val(result.current_page); $('.pagesize').val(result.per_page); + $('button.first').prop('disabled', result.current_page == 1); + $('button.prev').prop('disabled', result.current_page == 1); + $('button.next').prop('disabled', result.current_page == result.last_page); + $('button.last').prop('disabled', result.current_page == result.last_page); refreshingSongs = false; if(requestViewOpen) { window.scrollTo(0, 0); From fd38f5772ce86b1d80507021c02fe4209dcee220 Mon Sep 17 00:00:00 2001 From: Jim Driessen Date: Thu, 28 Sep 2017 21:11:37 +0200 Subject: [PATCH 7/9] Keep cookies for 365 days. --- marietje/marietje/static/js/queue.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/marietje/marietje/static/js/queue.js b/marietje/marietje/static/js/queue.js index 7ba2c1d..3fcc9e9 100644 --- a/marietje/marietje/static/js/queue.js +++ b/marietje/marietje/static/js/queue.js @@ -59,7 +59,7 @@ $(function () { }); $('.pagesize').change(function(){ - Cookies.set('pagesize', $(this).val()); + Cookies.set('pagesize', $(this).val(), { expires: 365 }); $('.pagenum').val(1); getSongs(); }); @@ -126,7 +126,7 @@ $(function () { $('#queue-time-header').click(function(){ showTimeToPlay = !showTimeToPlay; $('#queue-time-header').text(showTimeToPlay ? 'Plays In' : 'Plays At'); - Cookies.set('showtimetoplay', showTimeToPlay ? '1' : '0'); + Cookies.set('showtimetoplay', showTimeToPlay ? '1' : '0', { expires: 365 }); }); getSongs(); }); From 416ae40763c887bd4bc605d10e733efcdcaaf0ae Mon Sep 17 00:00:00 2001 From: Jim Driessen Date: Thu, 28 Sep 2017 21:19:50 +0200 Subject: [PATCH 8/9] Force updating of assets. --- marietje/marietje/templates/base.html | 2 +- marietje/queues/templates/queues/queue.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/marietje/marietje/templates/base.html b/marietje/marietje/templates/base.html index a997725..4449b3c 100644 --- a/marietje/marietje/templates/base.html +++ b/marietje/marietje/templates/base.html @@ -7,7 +7,7 @@ Marietje 4.0 - {% block title %}{% endblock title %} - + diff --git a/marietje/queues/templates/queues/queue.html b/marietje/queues/templates/queues/queue.html index f9ba994..238cea7 100644 --- a/marietje/queues/templates/queues/queue.html +++ b/marietje/queues/templates/queues/queue.html @@ -88,7 +88,7 @@ - + @@ -69,5 +69,10 @@ {% endif %} {% block content %}{% endblock content %} +