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 from urllib.parse import urlencode
import isoweek import isoweek
import pytz
from django.conf import settings from django.conf import settings
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.db.models import ( from django.db.models import (
@@ -578,7 +577,7 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
if context['list_type'] == "calendar": if context['list_type'] == "calendar":
self._set_month_year() self._set_month_year()
tz = pytz.timezone(self.request.event.settings.timezone) tz = self.request.event.timezone
_, ndays = calendar.monthrange(self.year, self.month) _, ndays = calendar.monthrange(self.year, self.month)
before = datetime(self.year, self.month, 1, 0, 0, 0, tzinfo=tz) - timedelta(days=1) 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) 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) context['years'] = range(now().year - 2, now().year + 3)
elif context['list_type'] == "week": elif context['list_type'] == "week":
self._set_week_year() self._set_week_year()
tz = pytz.timezone(self.request.event.settings.timezone) tz = self.request.event.timezone
week = isoweek.Week(self.year, self.week) week = isoweek.Week(self.year, self.week)
before = datetime( before = datetime(
week.monday().year, week.monday().month, week.monday().day, 0, 0, 0, tzinfo=tz 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 import View
from django.views.decorators.cache import cache_page from django.views.decorators.cache import cache_page
from django.views.generic import ListView, TemplateView from django.views.generic import ListView, TemplateView
from pytz import UTC
from pretix.base.i18n import language from pretix.base.i18n import language
from pretix.base.models import ( from pretix.base.models import (
@@ -178,7 +177,7 @@ class EventListMixin:
return qs return qs
def _set_month_to_next_subevent(self): 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( 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()), Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
active=True, active=True,
@@ -218,7 +217,7 @@ class EventListMixin:
datetime_from = next_ev.date_from datetime_from = next_ev.date_from
if datetime_from: if datetime_from:
tz = pytz.timezone(next_ev.settings.timezone) tz = next_ev.timezone
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:
@@ -240,7 +239,7 @@ 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):
tz = pytz.timezone(self.request.event.settings.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).filter(
Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()), Q(date_from__gte=now()) | Q(date_to__isnull=False, date_to__gte=now()),
active=True, active=True,
@@ -280,7 +279,7 @@ class EventListMixin:
datetime_from = next_ev.date_from datetime_from = next_ev.date_from
if datetime_from: if datetime_from:
tz = pytz.timezone(next_ev.settings.timezone) tz = next_ev.timezone
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:
@@ -428,8 +427,8 @@ def add_events_for_days(request, baseqs, before, after, ebd, timezones):
if hasattr(request, 'organizer'): if hasattr(request, 'organizer'):
qs = filter_qs_by_attr(qs, request) qs = filter_qs_by_attr(qs, request)
for event in qs: for event in qs:
timezones.add(event.settings.timezones) timezones.add(event.settings.timezone)
tz = pytz.timezone(event.settings.timezone) tz = event.timezone
datetime_from = event.date_from.astimezone(tz) datetime_from = event.date_from.astimezone(tz)
date_from = datetime_from.date() date_from = datetime_from.date()
if event.settings.show_date_to and event.date_to: 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: if hide:
continue continue
timezones.add(s.timezones) timezones.add(s.timezone)
tz = pytz.timezone(s.timezone) tz = pytz.timezone(s.timezone)
datetime_from = se.date_from.astimezone(tz) datetime_from = se.date_from.astimezone(tz)
date_from = datetime_from.date() date_from = datetime_from.date()
@@ -619,8 +618,10 @@ class CalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
_, ndays = calendar.monthrange(self.year, self.month) _, ndays = calendar.monthrange(self.year, self.month)
except calendar.IllegalMonthError: except calendar.IllegalMonthError:
raise Http404() 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['date'] = date(self.year, self.month, 1)
ctx['before'] = before ctx['before'] = before
@@ -694,13 +695,14 @@ class WeekCalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data() ctx = super().get_context_data()
tz = get_current_timezone()
week = isoweek.Week(self.year, self.week) week = isoweek.Week(self.year, self.week)
before = datetime( before = tz.localize(datetime(
week.monday().year, week.monday().month, week.monday().day, 0, 0, 0, tzinfo=UTC week.monday().year, week.monday().month, week.monday().day, 0, 0, 0,
) - timedelta(days=1) )) - timedelta(days=1)
after = datetime( after = tz.localize(datetime(
week.sunday().year, week.sunday().month, week.sunday().day, 0, 0, 0, tzinfo=UTC week.sunday().year, week.sunday().month, week.sunday().day, 0, 0, 0,
) + timedelta(days=1) )) + timedelta(days=1)
ctx['date'] = week.monday() ctx['date'] = week.monday()
ctx['before'] = before ctx['before'] = before
@@ -798,7 +800,7 @@ class DayCalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
datetime_from = next_ev.date_from datetime_from = next_ev.date_from
if datetime_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() self.date = datetime_from.astimezone(self.tz).date()
else: else:
self.tz = self.request.organizer.timezone self.tz = self.request.organizer.timezone
@@ -821,12 +823,13 @@ class DayCalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data() ctx = super().get_context_data()
before = datetime( tz = get_current_timezone()
self.date.year, self.date.month, self.date.day, 0, 0, 0, tzinfo=UTC before = tz.localize(datetime(
) - timedelta(days=1) self.date.year, self.date.month, self.date.day, 0, 0, 0,
after = datetime( )) - timedelta(days=1)
self.date.year, self.date.month, self.date.day, 0, 0, 0, tzinfo=UTC after = tz.localize(datetime(
) + timedelta(days=1) self.date.year, self.date.month, self.date.day, 0, 0, 0,
)) + timedelta(days=1)
ctx['date'] = self.date ctx['date'] = self.date
ctx['cal_tz'] = self.tz ctx['cal_tz'] = self.tz

View File

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