forked from CGM_Public/pretix_original
Fix auto-selected date in calendar with long-running events (Z#23141457) (#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>
This commit is contained in:
@@ -45,7 +45,9 @@ import dateutil
|
|||||||
import isoweek
|
import isoweek
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.cache import caches
|
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.db.models.functions import Coalesce, Greatest
|
||||||
from django.http import Http404, HttpResponse, QueryDict
|
from django.http import Http404, HttpResponse, QueryDict
|
||||||
from django.templatetags.static import static
|
from django.templatetags.static import static
|
||||||
@@ -216,14 +218,20 @@ class EventListMixin:
|
|||||||
|
|
||||||
def _set_month_to_next_subevent(self):
|
def _set_month_to_next_subevent(self):
|
||||||
tz = self.request.event.timezone
|
tz = self.request.event.timezone
|
||||||
next_sev = self.request.event.subevents.using(settings.DATABASE_REPLICA).filter(
|
now_dt = now()
|
||||||
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,
|
active=True,
|
||||||
is_public=True,
|
is_public=True,
|
||||||
).select_related('event').order_by('date_from').first()
|
).select_related('event').order_by('effective_date').first()
|
||||||
|
|
||||||
if next_sev:
|
if next_sev:
|
||||||
datetime_from = next_sev.date_from
|
datetime_from = next_sev.effective_date
|
||||||
self.year = datetime_from.astimezone(tz).year
|
self.year = datetime_from.astimezone(tz).year
|
||||||
self.month = datetime_from.astimezone(tz).month
|
self.month = datetime_from.astimezone(tz).month
|
||||||
else:
|
else:
|
||||||
@@ -231,28 +239,39 @@ class EventListMixin:
|
|||||||
self.month = now().month
|
self.month = now().month
|
||||||
|
|
||||||
def _set_month_to_next_event(self):
|
def _set_month_to_next_event(self):
|
||||||
next_ev = filter_qs_by_attr(Event.objects.using(settings.DATABASE_REPLICA).filter(
|
now_dt = now()
|
||||||
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=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,
|
organizer=self.request.organizer,
|
||||||
live=True,
|
live=True,
|
||||||
is_public=True,
|
is_public=True,
|
||||||
has_subevents=False
|
has_subevents=False
|
||||||
), self.request).order_by('date_from').first()
|
), self.request).order_by('effective_date').first()
|
||||||
next_sev = filter_qs_by_attr(SubEvent.objects.using(settings.DATABASE_REPLICA).filter(
|
next_sev = filter_qs_by_attr(SubEvent.objects.using(settings.DATABASE_REPLICA).annotate(
|
||||||
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
|
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__organizer=self.request.organizer,
|
||||||
event__is_public=True,
|
event__is_public=True,
|
||||||
event__live=True,
|
event__live=True,
|
||||||
active=True,
|
active=True,
|
||||||
is_public=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
|
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):
|
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.date_from
|
datetime_from = next_sev.effective_date
|
||||||
next_ev = next_sev.event
|
next_ev = next_sev.event
|
||||||
elif next_ev:
|
elif next_ev:
|
||||||
datetime_from = next_ev.date_from
|
datetime_from = next_ev.effective_date
|
||||||
|
|
||||||
if datetime_from:
|
if datetime_from:
|
||||||
tz = next_ev.timezone
|
tz = next_ev.timezone
|
||||||
@@ -277,15 +296,21 @@ class EventListMixin:
|
|||||||
self._set_month_to_next_event()
|
self._set_month_to_next_event()
|
||||||
|
|
||||||
def _set_week_to_next_subevent(self):
|
def _set_week_to_next_subevent(self):
|
||||||
|
now_dt = now()
|
||||||
tz = self.request.event.timezone
|
tz = self.request.event.timezone
|
||||||
next_sev = self.request.event.subevents.using(settings.DATABASE_REPLICA).filter(
|
next_sev = self.request.event.subevents.using(settings.DATABASE_REPLICA).annotate(
|
||||||
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
|
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,
|
active=True,
|
||||||
is_public=True,
|
is_public=True,
|
||||||
).select_related('event').order_by('date_from').first()
|
).select_related('event').order_by('effective_date').first()
|
||||||
|
|
||||||
if next_sev:
|
if next_sev:
|
||||||
datetime_from = next_sev.date_from
|
datetime_from = next_sev.effective_date
|
||||||
self.year = datetime_from.astimezone(tz).isocalendar()[0]
|
self.year = datetime_from.astimezone(tz).isocalendar()[0]
|
||||||
self.week = datetime_from.astimezone(tz).isocalendar()[1]
|
self.week = datetime_from.astimezone(tz).isocalendar()[1]
|
||||||
else:
|
else:
|
||||||
@@ -293,28 +318,39 @@ class EventListMixin:
|
|||||||
self.week = now().isocalendar()[1]
|
self.week = now().isocalendar()[1]
|
||||||
|
|
||||||
def _set_week_to_next_event(self):
|
def _set_week_to_next_event(self):
|
||||||
next_ev = filter_qs_by_attr(Event.objects.using(settings.DATABASE_REPLICA).filter(
|
now_dt = now()
|
||||||
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=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,
|
organizer=self.request.organizer,
|
||||||
live=True,
|
live=True,
|
||||||
is_public=True,
|
is_public=True,
|
||||||
has_subevents=False
|
has_subevents=False
|
||||||
), self.request).order_by('date_from').first()
|
), self.request).order_by('effective_date').first()
|
||||||
next_sev = filter_qs_by_attr(SubEvent.objects.using(settings.DATABASE_REPLICA).filter(
|
next_sev = filter_qs_by_attr(SubEvent.objects.using(settings.DATABASE_REPLICA).annotate(
|
||||||
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
|
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__organizer=self.request.organizer,
|
||||||
event__is_public=True,
|
event__is_public=True,
|
||||||
event__live=True,
|
event__live=True,
|
||||||
active=True,
|
active=True,
|
||||||
is_public=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
|
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):
|
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.date_from
|
datetime_from = next_sev.effective_date
|
||||||
next_ev = next_sev.event
|
next_ev = next_sev.event
|
||||||
elif next_ev:
|
elif next_ev:
|
||||||
datetime_from = next_ev.date_from
|
datetime_from = next_ev.effective_date
|
||||||
|
|
||||||
if datetime_from:
|
if datetime_from:
|
||||||
tz = next_ev.timezone
|
tz = next_ev.timezone
|
||||||
@@ -825,21 +861,32 @@ class DayCalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
|
|||||||
template_name = 'pretixpresale/organizers/calendar_day.html'
|
template_name = 'pretixpresale/organizers/calendar_day.html'
|
||||||
|
|
||||||
def _set_date_to_next_event(self):
|
def _set_date_to_next_event(self):
|
||||||
next_ev = filter_qs_by_attr(Event.objects.using(settings.DATABASE_REPLICA).filter(
|
now_dt = now()
|
||||||
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=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,
|
organizer=self.request.organizer,
|
||||||
live=True,
|
live=True,
|
||||||
is_public=True,
|
is_public=True,
|
||||||
date_from__gte=now(),
|
date_from__gte=now(),
|
||||||
), self.request).order_by('date_from').first()
|
), self.request).order_by('effective_date').first()
|
||||||
next_sev = filter_qs_by_attr(SubEvent.objects.using(settings.DATABASE_REPLICA).filter(
|
next_sev = filter_qs_by_attr(SubEvent.objects.using(settings.DATABASE_REPLICA).annotate(
|
||||||
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
|
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__organizer=self.request.organizer,
|
||||||
event__is_public=True,
|
event__is_public=True,
|
||||||
event__live=True,
|
event__live=True,
|
||||||
active=True,
|
active=True,
|
||||||
is_public=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
|
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):
|
if (next_ev and next_sev and next_sev.date_from < next_ev.date_from) or (next_sev and not next_ev):
|
||||||
|
|||||||
Reference in New Issue
Block a user