diff --git a/kiosk/admin.py b/kiosk/admin.py index d7cf027b..c56dd9bc 100644 --- a/kiosk/admin.py +++ b/kiosk/admin.py @@ -19,9 +19,9 @@ def set_inactive_kiosk_item(modeladmin, request, queryset): class KioskItemAdmin(admin.ModelAdmin): search_fields = ('name',) - list_display = ('active', 'name', 'notes', 'ordering', 'uploaded_date') + list_display = ('active', 'name', 'notes', 'ordering', 'uploaded_date', 'start_datetime', 'end_datetime') list_filter = ('active',) - list_display_links = ('active', 'name', 'notes', 'ordering', 'uploaded_date') + list_display_links = ('active', 'name', 'notes', 'ordering', 'uploaded_date', 'start_datetime', 'end_datetime') actions = [set_active_kiosk_item, set_inactive_kiosk_item] diff --git a/kiosk/migrations/0007_auto_20230823_1138.py b/kiosk/migrations/0007_auto_20230823_1138.py new file mode 100644 index 00000000..84b15a3b --- /dev/null +++ b/kiosk/migrations/0007_auto_20230823_1138.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.28 on 2023-08-23 09:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('kiosk', '0006_remove_image_20201112_1715'), + ] + + operations = [ + migrations.AddField( + model_name='kioskitem', + name='end_datetime', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AddField( + model_name='kioskitem', + name='start_datetime', + field=models.DateTimeField(blank=True, null=True), + ), + ] diff --git a/kiosk/models.py b/kiosk/models.py index 420e9136..7499d7f8 100644 --- a/kiosk/models.py +++ b/kiosk/models.py @@ -1,4 +1,5 @@ import random +from django.utils import timezone from .validators import validate_file_extension, valid_images from django.db import models import os @@ -15,6 +16,8 @@ class KioskItem(models.Model): active = models.BooleanField(default=True) media = models.FileField(upload_to='kiosk', null=False, validators=[validate_file_extension]) ordering = models.IntegerField(null=False, default=random_ordering, blank=False) + start_datetime = models.DateTimeField(null=True, blank=True) + end_datetime = models.DateTimeField(null=True, blank=True) @property def is_image(self): diff --git a/kiosk/views.py b/kiosk/views.py index 664391bc..793ab82e 100644 --- a/kiosk/views.py +++ b/kiosk/views.py @@ -1,5 +1,7 @@ import json +from datetime import datetime +from django.utils import timezone from django.db.models import Q from django.http import Http404, HttpResponse from django.shortcuts import render @@ -15,7 +17,15 @@ def find_random_media(request): """ Randomly get a media and return the relative url """ - item = KioskItem.objects.filter(active=True).order_by('?').first() + item = ( + KioskItem.objects.filter(active=True) + .filter( + (Q(start_datetime__isnull=True) | Q(start_datetime__lte=timezone.now())) + & (Q(end_datetime__isnull=True) | Q(end_datetime__gte=timezone.now())) + ) + .order_by('?') + .first() + ) if item is None: raise Http404("No active kiosk items found") @@ -30,7 +40,14 @@ def find_random_media(request): def find_next_media_real(request, item_id): item = KioskItem.objects.get(pk=item_id) - item_count = KioskItem.objects.filter(active=True).count() + item_count = ( + KioskItem.objects.filter(active=True) + .filter( + (Q(start_datetime__isnull=True) | Q(start_datetime__lte=timezone.now())) + & (Q(end_datetime__isnull=True) | Q(end_datetime__gte=timezone.now())) + ) + .count() + ) if item_count == 0: raise Http404("No active kiosk items found") @@ -38,11 +55,22 @@ def find_next_media_real(request, item_id): try: next_item = ( KioskItem.objects.filter(active=True) + .filter( + (Q(start_datetime__isnull=True) | Q(start_datetime__lte=timezone.now())) + & (Q(end_datetime__isnull=True) | Q(end_datetime__gte=timezone.now())) + ) .order_by('ordering', 'id') .filter(Q(ordering__gt=item.ordering) | (Q(ordering=item.ordering) & Q(id__gt=item.id)))[0] ) except IndexError: - next_item = KioskItem.objects.filter(active=True).order_by('ordering', 'id')[0] + next_item = ( + KioskItem.objects.filter(active=True) + .filter( + (Q(start_datetime__isnull=True) | Q(start_datetime__lte=timezone.now())) + & (Q(end_datetime__isnull=True) | Q(end_datetime__gte=timezone.now())) + ) + .order_by('ordering', 'id')[0] + ) response_data = { "id": next_item.id, "url": next_item.media.url,