Clean up timezone handling in calendar

This commit is contained in:
Raphael Michel
2023-01-27 16:44:42 +01:00
parent a82ce69633
commit 6ff5b4431c
3 changed files with 33 additions and 31 deletions

View File

@@ -42,7 +42,6 @@ from importlib import import_module
from urllib.parse import urlencode
import isoweek
import pytz
from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.db.models import (
@@ -578,7 +577,7 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
if context['list_type'] == "calendar":
self._set_month_year()
tz = pytz.timezone(self.request.event.settings.timezone)
tz = self.request.event.timezone
_, ndays = calendar.monthrange(self.year, self.month)
before = datetime(self.year, self.month, 1, 0, 0, 0, tzinfo=tz) - timedelta(days=1)
after = datetime(self.year, self.month, ndays, 0, 0, 0, tzinfo=tz) + timedelta(days=1)
@@ -608,7 +607,7 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
context['years'] = range(now().year - 2, now().year + 3)
elif context['list_type'] == "week":
self._set_week_year()
tz = pytz.timezone(self.request.event.settings.timezone)
tz = self.request.event.timezone
week = isoweek.Week(self.year, self.week)
before = datetime(
week.monday().year, week.monday().month, week.monday().day, 0, 0, 0, tzinfo=tz

View File

@@ -55,7 +55,6 @@ from django.utils.timezone import get_current_timezone, now
from django.views import View
from django.views.decorators.cache import cache_page
from django.views.generic import ListView, TemplateView
from pytz import UTC
from pretix.base.i18n import language
from pretix.base.models import (
@@ -178,7 +177,7 @@ class EventListMixin:
return qs
def _set_month_to_next_subevent(self):
tz = pytz.timezone(self.request.event.settings.timezone)
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()),
active=True,
@@ -218,7 +217,7 @@ class EventListMixin:
datetime_from = next_ev.date_from
if datetime_from:
tz = pytz.timezone(next_ev.settings.timezone)
tz = next_ev.timezone
self.year = datetime_from.astimezone(tz).year
self.month = datetime_from.astimezone(tz).month
else:
@@ -240,7 +239,7 @@ class EventListMixin:
self._set_month_to_next_event()
def _set_week_to_next_subevent(self):
tz = pytz.timezone(self.request.event.settings.timezone)
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()),
active=True,
@@ -280,7 +279,7 @@ class EventListMixin:
datetime_from = next_ev.date_from
if datetime_from:
tz = pytz.timezone(next_ev.settings.timezone)
tz = next_ev.timezone
self.year = datetime_from.astimezone(tz).isocalendar()[0]
self.week = datetime_from.astimezone(tz).isocalendar()[1]
else:
@@ -428,8 +427,8 @@ def add_events_for_days(request, baseqs, before, after, ebd, timezones):
if hasattr(request, 'organizer'):
qs = filter_qs_by_attr(qs, request)
for event in qs:
timezones.add(event.settings.timezones)
tz = pytz.timezone(event.settings.timezone)
timezones.add(event.settings.timezone)
tz = event.timezone
datetime_from = event.date_from.astimezone(tz)
date_from = datetime_from.date()
if event.settings.show_date_to and event.date_to:
@@ -508,7 +507,7 @@ def add_subevents_for_days(qs, before, after, ebd, timezones, event=None, cart_n
if hide:
continue
timezones.add(s.timezones)
timezones.add(s.timezone)
tz = pytz.timezone(s.timezone)
datetime_from = se.date_from.astimezone(tz)
date_from = datetime_from.date()
@@ -619,8 +618,10 @@ class CalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
_, ndays = calendar.monthrange(self.year, self.month)
except calendar.IllegalMonthError:
raise Http404()
before = datetime(self.year, self.month, 1, 0, 0, 0, tzinfo=UTC) - timedelta(days=1)
after = datetime(self.year, self.month, ndays, 0, 0, 0, tzinfo=UTC) + timedelta(days=1)
tz = get_current_timezone()
before = tz.localize(datetime(self.year, self.month, 1, 0, 0, 0)) - timedelta(days=1)
after = tz.localize(datetime(self.year, self.month, ndays, 0, 0, 0)) + timedelta(days=1)
ctx['date'] = date(self.year, self.month, 1)
ctx['before'] = before
@@ -694,13 +695,14 @@ class WeekCalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
def get_context_data(self, **kwargs):
ctx = super().get_context_data()
tz = get_current_timezone()
week = isoweek.Week(self.year, self.week)
before = datetime(
week.monday().year, week.monday().month, week.monday().day, 0, 0, 0, tzinfo=UTC
) - timedelta(days=1)
after = datetime(
week.sunday().year, week.sunday().month, week.sunday().day, 0, 0, 0, tzinfo=UTC
) + timedelta(days=1)
before = tz.localize(datetime(
week.monday().year, week.monday().month, week.monday().day, 0, 0, 0,
)) - timedelta(days=1)
after = tz.localize(datetime(
week.sunday().year, week.sunday().month, week.sunday().day, 0, 0, 0,
)) + timedelta(days=1)
ctx['date'] = week.monday()
ctx['before'] = before
@@ -798,7 +800,7 @@ class DayCalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
datetime_from = next_ev.date_from
if datetime_from:
self.tz = pytz.timezone(next_ev.settings.timezone)
self.tz = next_ev.timezone
self.date = datetime_from.astimezone(self.tz).date()
else:
self.tz = self.request.organizer.timezone
@@ -821,12 +823,13 @@ class DayCalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
def get_context_data(self, **kwargs):
ctx = super().get_context_data()
before = datetime(
self.date.year, self.date.month, self.date.day, 0, 0, 0, tzinfo=UTC
) - timedelta(days=1)
after = datetime(
self.date.year, self.date.month, self.date.day, 0, 0, 0, tzinfo=UTC
) + timedelta(days=1)
tz = get_current_timezone()
before = tz.localize(datetime(
self.date.year, self.date.month, self.date.day, 0, 0, 0,
)) - timedelta(days=1)
after = tz.localize(datetime(
self.date.year, self.date.month, self.date.day, 0, 0, 0,
)) + timedelta(days=1)
ctx['date'] = self.date
ctx['cal_tz'] = self.tz

View File

@@ -481,9 +481,9 @@ class WidgetAPIProductList(EventListMixin, View):
data['date'] = date(self.year, self.month, 1)
if hasattr(self.request, 'event'):
tz = pytz.timezone(self.request.event.settings.timezone)
tz = self.request.event.timezone
else:
tz = pytz.UTC
tz = self.request.organizer.timezone
before = datetime(self.year, self.month, 1, 0, 0, 0, tzinfo=tz) - timedelta(days=1)
after = datetime(self.year, self.month, ndays, 0, 0, 0, tzinfo=tz) + timedelta(days=1)
@@ -529,9 +529,9 @@ class WidgetAPIProductList(EventListMixin, View):
self._set_week_year()
if hasattr(self.request, 'event'):
tz = pytz.timezone(self.request.event.settings.timezone)
tz = self.request.event.timezone
else:
tz = pytz.UTC
tz = self.request.organizer.timezone
week = isoweek.Week(self.year, self.week)
data['week'] = [self.year, self.week]
@@ -583,7 +583,7 @@ class WidgetAPIProductList(EventListMixin, View):
data['has_more_events'] = True
evs = evs[:limit]
tz = pytz.timezone(request.event.settings.timezone)
tz = request.event.timezone
if self.request.event.settings.event_list_available_only:
evs = [
se for se in evs