diff --git a/src/plainui/views/utils.py b/src/plainui/views/utils.py index df4f9decff92c37c197cd5d605069a1025863280..df035bcbfa928a68cdd66895deed26cd0a6c6c09 100644 --- a/src/plainui/views/utils.py +++ b/src/plainui/views/utils.py @@ -6,7 +6,8 @@ from django.conf import settings from django.contrib import messages from django.contrib.auth import mixins as auth_mixins from django.core.exceptions import ImproperlyConfigured, ValidationError -from django.db.models import F, Prefetch, Q +from django.db.models import Case, F, Prefetch, Q, When +from django.forms import BooleanField from django.http import HttpResponse from django.shortcuts import redirect from django.urls import reverse @@ -215,9 +216,16 @@ def event_filter( events = Event.objects.conference_accessible(conf) events = events.filter(schedule_start__isnull=False, schedule_end__isnull=False) + now = timezone.now() + events = events.annotate( + upcoming=Case( + When(Q(schedule_start__lt=now, schedule_end__gte=now) | Q(schedule_start__gte=now, schedule_start__lt=now + UPCOMING_WINDOW)), + default=False, + output_field=BooleanField(), + ) + ) if upcoming: - now = timezone.now() - events = events.filter(Q(schedule_start__lt=now, schedule_end__gte=now) | Q(schedule_start__gte=now, schedule_start__lt=now + UPCOMING_WINDOW)) + events = events.filter(upcoming=True) if calendar_mode: events = events.filter(room__isnull=False) res = events.filter(schedule_duration__isnull=False, **filters).order_by('schedule_start', 'schedule_end')