diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index dc87233afe..752edaa7d0 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -281,7 +281,7 @@ def _create_order(event: Event, email: str, positions: List[CartPosition], now_d tz = pytz.timezone(event.settings.timezone) exp_by_date = now_dt.astimezone(tz) + timedelta(days=event.settings.get('payment_term_days', as_type=int)) - exp_by_date = exp_by_date.replace(hour=23, minute=59, second=59, microsecond=0) + exp_by_date = exp_by_date.astimezone(tz).replace(hour=23, minute=59, second=59, microsecond=0) if event.settings.get('payment_term_weekdays'): if exp_by_date.weekday() == 5: exp_by_date += timedelta(days=2) diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index dbc8c6023f..187eb3515e 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -2,6 +2,7 @@ from datetime import datetime, timedelta from decimal import Decimal import pytest +import pytz from django.test import TestCase from django.utils.timezone import make_aware, now @@ -70,6 +71,19 @@ def test_expiry_last(event): assert (order.expires - today).days == 5 +@pytest.mark.django_db +def test_expiry_dst(event): + event.settings.set('timezone', 'Europe/Berlin') + tz = pytz.timezone('Europe/Berlin') + utc = pytz.timezone('UTC') + today = tz.localize(datetime(2016, 10, 29, 12, 0, 0)).astimezone(utc) + order = _create_order(event, email='dummy@example.org', positions=[], + now_dt=today, payment_provider=FreeOrderProvider(event), + locale='de') + localex = order.expires.astimezone(tz) + assert (localex.hour, localex.minute) == (23, 59) + + @pytest.mark.django_db def test_expiring(event): o1 = Order.objects.create(