Skip to content

Commit

Permalink
Fix auto-selected date in calendar with long-running events (Z#231414…
Browse files Browse the repository at this point in the history
…57) (#3829)

* Fix auto-selected date in calendar with long-running events (Z#23141457)

* Review fixes

* Update src/pretix/presale/views/organizer.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

---------

Co-authored-by: Richard Schreiber <schreiber@rami.io>
  • Loading branch information
raphaelm and wiffbi committed Jan 26, 2024
1 parent eaae7e9 commit 15d3fbc
Showing 1 changed file with 80 additions and 33 deletions.
113 changes: 80 additions & 33 deletions src/pretix/presale/views/organizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@
import isoweek
from django.conf import settings
from django.core.cache import caches
from django.db.models import Exists, Max, Min, OuterRef, Prefetch, Q
from django.db.models import (
Case, Exists, F, Max, Min, OuterRef, Prefetch, Q, Value, When,
)
from django.db.models.functions import Coalesce, Greatest
from django.http import Http404, HttpResponse, QueryDict
from django.templatetags.static import static
Expand Down Expand Up @@ -216,43 +218,60 @@ def _get_event_list_queryset(self):

def _set_month_to_next_subevent(self):
tz = self.request.event.timezone
next_sev = self.request.event.subevents.using(settings.DATABASE_REPLICA).filter(
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
now_dt = now()
next_sev = self.request.event.subevents.using(settings.DATABASE_REPLICA).annotate(
effective_date=Case(
When(date_from__lt=now_dt, date_to__isnull=False, date_to__gte=now_dt, then=Value(now_dt)),
default=F('date_from'),
)
).filter(
effective_date__gte=now_dt,
active=True,
is_public=True,
).select_related('event').order_by('date_from').first()
).select_related('event').order_by('effective_date').first()

if next_sev:
datetime_from = next_sev.date_from
datetime_from = next_sev.effective_date
self.year = datetime_from.astimezone(tz).year
self.month = datetime_from.astimezone(tz).month
else:
self.year = now().year
self.month = now().month

def _set_month_to_next_event(self):
next_ev = filter_qs_by_attr(Event.objects.using(settings.DATABASE_REPLICA).filter(
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
now_dt = now()
next_ev = filter_qs_by_attr(Event.objects.using(settings.DATABASE_REPLICA).annotate(
effective_date=Case(
When(date_from__lt=now_dt, date_to__isnull=False, date_to__gte=now_dt, then=Value(now())),
default=F('date_from'),
)
).filter(
effective_date__gte=now_dt,
organizer=self.request.organizer,
live=True,
is_public=True,
has_subevents=False
), self.request).order_by('date_from').first()
next_sev = filter_qs_by_attr(SubEvent.objects.using(settings.DATABASE_REPLICA).filter(
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
), self.request).order_by('effective_date').first()
next_sev = filter_qs_by_attr(SubEvent.objects.using(settings.DATABASE_REPLICA).annotate(
effective_date=Case(
When(date_from__lt=now_dt, date_to__isnull=False, date_to__gte=now_dt, then=Value(now_dt)),
default=F('date_from'),
)
).filter(
effective_date__gte=now_dt,
event__organizer=self.request.organizer,
event__is_public=True,
event__live=True,
active=True,
is_public=True,
), self.request).select_related('event').order_by('date_from').first()
), self.request).select_related('event').order_by('effective_date').first()

datetime_from = None
if (next_ev and next_sev and next_sev.date_from < next_ev.date_from) or (next_sev and not next_ev):
datetime_from = next_sev.date_from
if (next_ev and next_sev and next_sev.effective_date < next_ev.effective_date) or (next_sev and not next_ev):
datetime_from = next_sev.effective_date
next_ev = next_sev.event
elif next_ev:
datetime_from = next_ev.date_from
datetime_from = next_ev.effective_date

if datetime_from:
tz = next_ev.timezone
Expand All @@ -277,44 +296,61 @@ def _set_month_year(self):
self._set_month_to_next_event()

def _set_week_to_next_subevent(self):
now_dt = now()
tz = self.request.event.timezone
next_sev = self.request.event.subevents.using(settings.DATABASE_REPLICA).filter(
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
next_sev = self.request.event.subevents.using(settings.DATABASE_REPLICA).annotate(
effective_date=Case(
When(date_from__lt=now_dt, date_to__isnull=False, date_to__gte=now_dt, then=Value(now_dt)),
default=F('date_from'),
)
).filter(
effective_date__gte=now_dt,
active=True,
is_public=True,
).select_related('event').order_by('date_from').first()
).select_related('event').order_by('effective_date').first()

if next_sev:
datetime_from = next_sev.date_from
datetime_from = next_sev.effective_date
self.year = datetime_from.astimezone(tz).isocalendar()[0]
self.week = datetime_from.astimezone(tz).isocalendar()[1]
else:
self.year = now().isocalendar()[0]
self.week = now().isocalendar()[1]

def _set_week_to_next_event(self):
next_ev = filter_qs_by_attr(Event.objects.using(settings.DATABASE_REPLICA).filter(
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
now_dt = now()
next_ev = filter_qs_by_attr(Event.objects.using(settings.DATABASE_REPLICA).annotate(
effective_date=Case(
When(date_from__lt=now_dt, date_to__isnull=False, date_to__gte=now_dt, then=Value(now_dt)),
default=F('date_from'),
)
).filter(
effective_date__gte=now_dt,
organizer=self.request.organizer,
live=True,
is_public=True,
has_subevents=False
), self.request).order_by('date_from').first()
next_sev = filter_qs_by_attr(SubEvent.objects.using(settings.DATABASE_REPLICA).filter(
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
), self.request).order_by('effective_date').first()
next_sev = filter_qs_by_attr(SubEvent.objects.using(settings.DATABASE_REPLICA).annotate(
effective_date=Case(
When(date_from__lt=now_dt, date_to__isnull=False, date_to__gte=now_dt, then=Value(now_dt)),
default=F('date_from'),
)
).filter(
effective_date__gte=now_dt,
event__organizer=self.request.organizer,
event__is_public=True,
event__live=True,
active=True,
is_public=True,
), self.request).select_related('event').order_by('date_from').first()
), self.request).select_related('event').order_by('effective_date').first()

datetime_from = None
if (next_ev and next_sev and next_sev.date_from < next_ev.date_from) or (next_sev and not next_ev):
datetime_from = next_sev.date_from
if (next_ev and next_sev and next_sev.effective_date < next_ev.effective_date) or (next_sev and not next_ev):
datetime_from = next_sev.effective_date
next_ev = next_sev.event
elif next_ev:
datetime_from = next_ev.date_from
datetime_from = next_ev.effective_date

if datetime_from:
tz = next_ev.timezone
Expand Down Expand Up @@ -825,21 +861,32 @@ class DayCalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
template_name = 'pretixpresale/organizers/calendar_day.html'

def _set_date_to_next_event(self):
next_ev = filter_qs_by_attr(Event.objects.using(settings.DATABASE_REPLICA).filter(
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
now_dt = now()
next_ev = filter_qs_by_attr(Event.objects.using(settings.DATABASE_REPLICA).anootate(
effective_date=Case(
When(date_from__lt=now_dt, date_to__isnull=False, date_to__gte=now_dt, then=Value(now_dt)),
default=F('date_from'),
)
).filter(
effective_date__gte=now_dt,
organizer=self.request.organizer,
live=True,
is_public=True,
date_from__gte=now(),
), self.request).order_by('date_from').first()
next_sev = filter_qs_by_attr(SubEvent.objects.using(settings.DATABASE_REPLICA).filter(
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
), self.request).order_by('effective_date').first()
next_sev = filter_qs_by_attr(SubEvent.objects.using(settings.DATABASE_REPLICA).annotate(
effective_date=Case(
When(date_from__lt=now_dt, date_to__isnull=False, date_to__gte=now_dt, then=Value(now_dt)),
default=F('date_from'),
)
).filter(
effective_date__gte=now_dt,
event__organizer=self.request.organizer,
event__is_public=True,
event__live=True,
active=True,
is_public=True,
), self.request).select_related('event').order_by('date_from').first()
), self.request).select_related('event').order_by('effective_date').first()

datetime_from = None
if (next_ev and next_sev and next_sev.date_from < next_ev.date_from) or (next_sev and not next_ev):
Expand Down

0 comments on commit 15d3fbc

Please sign in to comment.