Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added start- and enddates for kiosk items #342

Merged
merged 6 commits into from
Sep 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions kiosk/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]


Expand Down
23 changes: 23 additions & 0 deletions kiosk/migrations/0007_auto_20230823_1138.py
Original file line number Diff line number Diff line change
@@ -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),
),
]
3 changes: 3 additions & 0 deletions kiosk/models.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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):
Expand Down
34 changes: 31 additions & 3 deletions kiosk/views.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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")

Expand All @@ -30,19 +40,37 @@ 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")

# Get the item at the index, trust that Django does this smartly.
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,
Expand Down
Loading