Revert "First steps into pytz deprecation"

This reverts commit e4e7d50659.
This commit is contained in:
Raphael Michel
2023-02-01 13:15:18 +01:00
parent e4e7d50659
commit 59d46ddded
63 changed files with 362 additions and 341 deletions

View File

@@ -19,9 +19,10 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
from datetime import datetime, time, timedelta, timezone
from datetime import datetime, time, timedelta
import pytest
import pytz
from django.core import mail as djmail
from django.utils.timezone import now
from django_scopes import scope
@@ -38,7 +39,7 @@ def event():
o = Organizer.objects.create(name='Dummy', slug='dummy')
event = Event.objects.create(
organizer=o, name='Dummy', slug='dummy',
date_from=datetime(2023, 1, 19, 2, 30, 0, tzinfo=timezone.utc),
date_from=datetime(2023, 1, 19, 2, 30, 0, tzinfo=pytz.UTC),
plugins='pretix.plugins.banktransfer'
)
o.settings.timezone = "Europe/Berlin"
@@ -303,7 +304,7 @@ def test_organizer_limited_to_events(event, user, team):
event2 = Event.objects.create(
organizer=event.organizer, name='Dummy', slug='dummy2',
date_from=datetime(2023, 1, 19, 2, 30, 0, tzinfo=timezone.utc),
date_from=datetime(2023, 1, 19, 2, 30, 0, tzinfo=pytz.UTC),
plugins='pretix.plugins.banktransfer'
)
team.all_events = False
@@ -343,7 +344,7 @@ def test_organizer_ok(event, user, team):
Event.objects.create(
organizer=event.organizer, name='Dummy', slug='dummy2',
date_from=datetime(2023, 1, 19, 2, 30, 0, tzinfo=timezone.utc),
date_from=datetime(2023, 1, 19, 2, 30, 0, tzinfo=pytz.UTC),
plugins='pretix.plugins.banktransfer'
)

View File

@@ -21,9 +21,9 @@
#
from datetime import datetime, timedelta
from decimal import Decimal
from zoneinfo import ZoneInfo
import pytest
import pytz
from django.conf import settings
from django.core.exceptions import ValidationError
from django.utils.timezone import now
@@ -42,7 +42,7 @@ from pretix.base.services.orders import (
)
from pretix.plugins.banktransfer.payment import BankTransfer
TZ = ZoneInfo('Europe/Berlin')
TZ = pytz.timezone('Europe/Berlin')
@pytest.fixture(scope='function')
@@ -51,9 +51,9 @@ def event():
o.settings.customer_accounts = True
event = Event.objects.create(
organizer=o, name='Dummy', slug='dummy',
date_from=datetime(2021, 4, 27, 10, 0, 0, 0, tzinfo=TZ),
date_to=datetime(2021, 4, 28, 10, 0, 0, 0, tzinfo=TZ),
presale_end=datetime(2221, 4, 28, 10, 0, 0, 0, tzinfo=TZ),
date_from=TZ.localize(datetime(2021, 4, 27, 10, 0, 0, 0)),
date_to=TZ.localize(datetime(2021, 4, 28, 10, 0, 0, 0)),
presale_end=TZ.localize(datetime(2221, 4, 28, 10, 0, 0, 0)),
plugins='pretix.plugins.banktransfer'
)
event.settings.timezone = 'Europe/Berlin'
@@ -75,8 +75,8 @@ def membership_type(event):
def membership(event, membership_type, customer):
return customer.memberships.create(
membership_type=membership_type,
date_start=datetime(2021, 4, 1, 0, 0, 0, 0, tzinfo=TZ),
date_end=datetime(2021, 4, 30, 23, 59, 59, 999999, tzinfo=TZ),
date_start=TZ.localize(datetime(2021, 4, 1, 0, 0, 0, 0)),
date_end=TZ.localize(datetime(2021, 4, 30, 23, 59, 59, 999999)),
)
@@ -107,7 +107,7 @@ def subevent(event):
event.has_subevents = True
return event.subevents.create(
name='Foo',
date_from=datetime(2021, 4, 29, 10, 0, 0, 0, tzinfo=TZ),
date_from=TZ.localize(datetime(2021, 4, 29, 10, 0, 0, 0)),
)
@@ -115,8 +115,8 @@ def subevent(event):
def test_validity_membership_duration_like_event(event, granting_ticket, membership_type):
granting_ticket.grant_membership_duration_like_event = True
assert membership_validity(granting_ticket, None, event) == (
datetime(2021, 4, 27, 10, 0, 0, 0, tzinfo=TZ),
datetime(2021, 4, 28, 10, 0, 0, 0, tzinfo=TZ),
TZ.localize(datetime(2021, 4, 27, 10, 0, 0, 0)),
TZ.localize(datetime(2021, 4, 28, 10, 0, 0, 0)),
)
@@ -124,8 +124,8 @@ def test_validity_membership_duration_like_event(event, granting_ticket, members
def test_validity_membership_duration_like_subevent_without_end(event, granting_ticket, subevent, membership_type):
granting_ticket.grant_membership_duration_like_event = True
assert membership_validity(granting_ticket, subevent, event) == (
datetime(2021, 4, 29, 10, 0, 0, 0, tzinfo=TZ),
datetime(2021, 4, 29, 23, 59, 59, 999999, tzinfo=TZ),
TZ.localize(datetime(2021, 4, 29, 10, 0, 0, 0)),
TZ.localize(datetime(2021, 4, 29, 23, 59, 59, 999999)),
)
@@ -135,8 +135,8 @@ def test_validity_membership_duration_days(event, granting_ticket, membership_ty
granting_ticket.grant_membership_duration_days = 3
with freeze_time("2021-04-10T11:00:00+02:00"):
assert membership_validity(granting_ticket, subevent, event) == (
datetime(2021, 4, 10, 0, 0, 0, 0, tzinfo=TZ),
datetime(2021, 4, 12, 23, 59, 59, 999999, tzinfo=TZ),
TZ.localize(datetime(2021, 4, 10, 0, 0, 0, 0)),
TZ.localize(datetime(2021, 4, 12, 23, 59, 59, 999999)),
)
@@ -146,13 +146,13 @@ def test_validity_membership_duration_months(event, granting_ticket, membership_
granting_ticket.grant_membership_duration_months = 1
with freeze_time("2021-02-01T11:00:00+01:00"):
assert membership_validity(granting_ticket, subevent, event) == (
datetime(2021, 2, 1, 0, 0, 0, 0, tzinfo=TZ),
datetime(2021, 2, 28, 23, 59, 59, 999999, tzinfo=TZ),
TZ.localize(datetime(2021, 2, 1, 0, 0, 0, 0)),
TZ.localize(datetime(2021, 2, 28, 23, 59, 59, 999999)),
)
with freeze_time("2021-02-28T11:00:00+01:00"):
assert membership_validity(granting_ticket, subevent, event) == (
datetime(2021, 2, 28, 0, 0, 0, 0, tzinfo=TZ),
datetime(2021, 3, 27, 23, 59, 59, 999999, tzinfo=TZ),
TZ.localize(datetime(2021, 2, 28, 0, 0, 0, 0)),
TZ.localize(datetime(2021, 3, 27, 23, 59, 59, 999999)),
)
@@ -163,13 +163,13 @@ def test_validity_membership_duration_months_plus_days(event, granting_ticket, m
granting_ticket.grant_membership_duration_days = 2
with freeze_time("2021-02-01T11:00:00+01:00"):
assert membership_validity(granting_ticket, subevent, event) == (
datetime(2021, 2, 1, 0, 0, 0, 0, tzinfo=TZ),
datetime(2021, 3, 2, 23, 59, 59, 999999, tzinfo=TZ),
TZ.localize(datetime(2021, 2, 1, 0, 0, 0, 0)),
TZ.localize(datetime(2021, 3, 2, 23, 59, 59, 999999)),
)
with freeze_time("2021-02-28T11:00:00+01:00"):
assert membership_validity(granting_ticket, subevent, event) == (
datetime(2021, 2, 28, 0, 0, 0, 0, tzinfo=TZ),
datetime(2021, 3, 29, 23, 59, 59, 999999, tzinfo=TZ),
TZ.localize(datetime(2021, 2, 28, 0, 0, 0, 0)),
TZ.localize(datetime(2021, 3, 29, 23, 59, 59, 999999)),
)
@@ -420,7 +420,7 @@ def test_validate_membership_max_usages(event, customer, membership, requiring_t
def test_validate_membership_parallel(event, customer, membership, subevent, requiring_ticket, membership_type):
se2 = event.subevents.create(
name='Foo',
date_from=datetime(2021, 4, 28, 10, 0, 0, 0, tzinfo=TZ),
date_from=TZ.localize(datetime(2021, 4, 28, 10, 0, 0, 0)),
)
membership_type.allow_parallel_usage = False
@@ -585,5 +585,5 @@ def test_grant_when_paid_and_changed(event, customer, granting_ticket):
m = customer.memberships.get()
assert m.granted_in == order.positions.first()
assert m.membership_type == granting_ticket.grant_membership_type
assert m.date_start == datetime(2021, 4, 27, 10, 0, 0, 0, tzinfo=TZ)
assert m.date_end == datetime(2021, 4, 28, 10, 0, 0, 0, tzinfo=TZ)
assert m.date_start == TZ.localize(datetime(2021, 4, 27, 10, 0, 0, 0))
assert m.date_end == TZ.localize(datetime(2021, 4, 28, 10, 0, 0, 0))

View File

@@ -39,6 +39,7 @@ from datetime import date, timedelta
from decimal import Decimal
import pytest
import pytz
from dateutil.tz import tzoffset
from django.conf import settings
from django.core.exceptions import ValidationError
@@ -1187,13 +1188,13 @@ class OrderTestCase(BaseQuotaTestCase):
@classscope(attr='o')
def test_payment_term_last_relative(self):
self.event.settings.set('payment_term_last', date(2017, 5, 3))
assert self.order.payment_term_last == datetime.datetime(2017, 5, 3, 23, 59, 59, tzinfo=datetime.timezone.utc)
self.event.date_from = datetime.datetime(2017, 5, 3, 12, 0, 0, tzinfo=datetime.timezone.utc)
assert self.order.payment_term_last == datetime.datetime(2017, 5, 3, 23, 59, 59, tzinfo=pytz.UTC)
self.event.date_from = datetime.datetime(2017, 5, 3, 12, 0, 0, tzinfo=pytz.UTC)
self.event.save()
self.event.settings.set('payment_term_last', RelativeDateWrapper(
RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None)
))
assert self.order.payment_term_last == datetime.datetime(2017, 5, 1, 23, 59, 59, tzinfo=datetime.timezone.utc)
assert self.order.payment_term_last == datetime.datetime(2017, 5, 1, 23, 59, 59, tzinfo=pytz.UTC)
@classscope(attr='o')
def test_payment_term_last_subevent(self):
@@ -1218,14 +1219,14 @@ class OrderTestCase(BaseQuotaTestCase):
@classscope(attr='o')
def test_ticket_download_date_relative(self):
self.event.settings.set('ticket_download_date', datetime.datetime(2017, 5, 3, 12, 59, 59, tzinfo=datetime.timezone.utc))
assert self.order.ticket_download_date == datetime.datetime(2017, 5, 3, 12, 59, 59, tzinfo=datetime.timezone.utc)
self.event.date_from = datetime.datetime(2017, 5, 3, 12, 0, 0, tzinfo=datetime.timezone.utc)
self.event.settings.set('ticket_download_date', datetime.datetime(2017, 5, 3, 12, 59, 59, tzinfo=pytz.UTC))
assert self.order.ticket_download_date == datetime.datetime(2017, 5, 3, 12, 59, 59, tzinfo=pytz.UTC)
self.event.date_from = datetime.datetime(2017, 5, 3, 12, 0, 0, tzinfo=pytz.UTC)
self.event.save()
self.event.settings.set('ticket_download_date', RelativeDateWrapper(
RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None)
))
assert self.order.ticket_download_date == datetime.datetime(2017, 5, 1, 12, 0, 0, tzinfo=datetime.timezone.utc)
assert self.order.ticket_download_date == datetime.datetime(2017, 5, 1, 12, 0, 0, tzinfo=pytz.UTC)
@classscope(attr='o')
def test_ticket_download_date_subevent(self):

View File

@@ -22,9 +22,9 @@
import json
from datetime import datetime, timedelta
from decimal import Decimal
from zoneinfo import ZoneInfo
import pytest
import pytz
from django.core import mail as djmail
from django.db.models import F, Sum
from django.test import TestCase
@@ -255,9 +255,9 @@ def test_expiry_last_relative_subevents(event):
@pytest.mark.django_db
def test_expiry_dst(event):
event.settings.set('timezone', 'Europe/Berlin')
tz = ZoneInfo('Europe/Berlin')
utc = ZoneInfo('UTC')
today = datetime(2016, 10, 29, 12, 0, 0, tzinfo=tz).astimezone(utc)
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_requests=[{

View File

@@ -34,9 +34,9 @@
import datetime
from decimal import Decimal
from zoneinfo import ZoneInfo
import pytest
import pytz
from django.utils.timezone import now
from django_scopes import scope
from tests.testdummy.payment import DummyPaymentProvider
@@ -112,18 +112,18 @@ def test_availability_date_not_available(event):
@pytest.mark.django_db
def test_availability_date_relative(event):
event.settings.set('timezone', 'US/Pacific')
tz = ZoneInfo('US/Pacific')
event.date_from = datetime.datetime(2016, 12, 3, 12, 0, 0, tzinfo=tz)
tz = pytz.timezone('US/Pacific')
event.date_from = tz.localize(datetime.datetime(2016, 12, 3, 12, 0, 0))
event.save()
prov = DummyPaymentProvider(event)
prov.settings.set('_availability_date', RelativeDateWrapper(
RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None)
))
utc = datetime.timezone.utc
assert prov._is_still_available(datetime.datetime(2016, 11, 30, 23, 0, 0, tzinfo=tz).astimezone(utc))
assert prov._is_still_available(datetime.datetime(2016, 12, 1, 23, 59, 0, tzinfo=tz).astimezone(utc))
assert not prov._is_still_available(datetime.datetime(2016, 12, 2, 0, 0, 1, tzinfo=tz).astimezone(utc))
utc = pytz.timezone('UTC')
assert prov._is_still_available(tz.localize(datetime.datetime(2016, 11, 30, 23, 0, 0)).astimezone(utc))
assert prov._is_still_available(tz.localize(datetime.datetime(2016, 12, 1, 23, 59, 0)).astimezone(utc))
assert not prov._is_still_available(tz.localize(datetime.datetime(2016, 12, 2, 0, 0, 1)).astimezone(utc))
@pytest.mark.django_db
@@ -132,11 +132,11 @@ def test_availability_date_timezones(event):
prov = DummyPaymentProvider(event)
prov.settings.set('_availability_date', '2016-12-01')
tz = ZoneInfo('US/Pacific')
utc = ZoneInfo('UTC')
assert prov._is_still_available(datetime.datetime(2016, 11, 30, 23, 0, 0, tzinfo=tz).astimezone(utc))
assert prov._is_still_available(datetime.datetime(2016, 12, 1, 23, 59, 0, tzinfo=tz).astimezone(utc))
assert not prov._is_still_available(datetime.datetime(2016, 12, 2, 0, 0, 1, tzinfo=tz).astimezone(utc))
tz = pytz.timezone('US/Pacific')
utc = pytz.timezone('UTC')
assert prov._is_still_available(tz.localize(datetime.datetime(2016, 11, 30, 23, 0, 0)).astimezone(utc))
assert prov._is_still_available(tz.localize(datetime.datetime(2016, 12, 1, 23, 59, 0)).astimezone(utc))
assert not prov._is_still_available(tz.localize(datetime.datetime(2016, 12, 2, 0, 0, 1)).astimezone(utc))
@pytest.mark.django_db

View File

@@ -20,16 +20,16 @@
# <https://www.gnu.org/licenses/>.
#
from datetime import datetime, time
from zoneinfo import ZoneInfo
import pytest
import pytz
from django_scopes import scope
from pretix.base.models import Event, Organizer
from pretix.base.reldate import RelativeDate, RelativeDateWrapper
TOKYO = ZoneInfo('Asia/Tokyo')
BERLIN = ZoneInfo('Europe/Berlin')
TOKYO = pytz.timezone('Asia/Tokyo')
BERLIN = pytz.timezone('Europe/Berlin')
@pytest.fixture
@@ -37,8 +37,8 @@ def event():
o = Organizer.objects.create(name='Dummy', slug='dummy')
event = Event.objects.create(
organizer=o, name='Dummy', slug='dummy',
date_from=datetime(2017, 12, 27, 5, 0, 0, tzinfo=TOKYO),
presale_start=datetime(2017, 12, 1, 5, 0, 0, tzinfo=TOKYO),
date_from=TOKYO.localize(datetime(2017, 12, 27, 5, 0, 0)),
presale_start=TOKYO.localize(datetime(2017, 12, 1, 5, 0, 0)),
plugins='pretix.plugins.banktransfer'
)
@@ -57,7 +57,7 @@ def test_absolute_date(event):
@pytest.mark.django_db
def test_relative_date_without_time(event):
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='date_from', minutes_before=None))
assert rdw.datetime(event).astimezone(TOKYO) == datetime(2017, 12, 26, 5, 0, 0, tzinfo=TOKYO)
assert rdw.datetime(event).astimezone(TOKYO) == TOKYO.localize(datetime(2017, 12, 26, 5, 0, 0))
assert rdw.to_string() == 'RELDATE/1/-/date_from/'
@@ -65,64 +65,64 @@ def test_relative_date_without_time(event):
def test_relative_date_other_base_point(event):
with scope(organizer=event.organizer):
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_start', minutes_before=None))
assert rdw.datetime(event) == datetime(2017, 11, 30, 5, 0, 0, tzinfo=TOKYO)
assert rdw.datetime(event) == TOKYO.localize(datetime(2017, 11, 30, 5, 0, 0))
assert rdw.to_string() == 'RELDATE/1/-/presale_start/'
# presale_end is unset, defaults to date_from
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_end', minutes_before=None))
assert rdw.datetime(event) == datetime(2017, 12, 26, 5, 0, 0, tzinfo=TOKYO)
assert rdw.datetime(event) == TOKYO.localize(datetime(2017, 12, 26, 5, 0, 0))
assert rdw.to_string() == 'RELDATE/1/-/presale_end/'
# subevent base
se = event.subevents.create(name="SE1", date_from=datetime(2017, 11, 27, 5, 0, 0, tzinfo=TOKYO))
se = event.subevents.create(name="SE1", date_from=TOKYO.localize(datetime(2017, 11, 27, 5, 0, 0)))
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='date_from', minutes_before=None))
assert rdw.datetime(se) == datetime(2017, 11, 26, 5, 0, 0, tzinfo=TOKYO)
assert rdw.datetime(se) == TOKYO.localize(datetime(2017, 11, 26, 5, 0, 0))
# presale_start is unset on subevent, default to event
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_start', minutes_before=None))
assert rdw.datetime(se) == datetime(2017, 11, 30, 5, 0, 0, tzinfo=TOKYO)
assert rdw.datetime(se) == TOKYO.localize(datetime(2017, 11, 30, 5, 0, 0))
# presale_end is unset on all, default to date_from of subevent
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_end', minutes_before=None))
assert rdw.datetime(se) == datetime(2017, 11, 26, 5, 0, 0, tzinfo=TOKYO)
assert rdw.datetime(se) == TOKYO.localize(datetime(2017, 11, 26, 5, 0, 0))
@pytest.mark.django_db
def test_relative_date_in_minutes(event):
rdw = RelativeDateWrapper(RelativeDate(days_before=0, time=None, base_date_name='date_from', minutes_before=60))
assert rdw.to_string() == 'RELDATE/minutes/60/date_from/'
assert rdw.datetime(event) == datetime(2017, 12, 27, 4, 0, 0, tzinfo=TOKYO)
assert rdw.datetime(event) == TOKYO.localize(datetime(2017, 12, 27, 4, 0, 0))
@pytest.mark.django_db
def test_relative_date_with_time(event):
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=time(8, 5, 13), base_date_name='date_from', minutes_before=None))
assert rdw.to_string() == 'RELDATE/1/08:05:13/date_from/'
assert rdw.datetime(event) == datetime(2017, 12, 26, 8, 5, 13, tzinfo=TOKYO)
assert rdw.datetime(event) == TOKYO.localize(datetime(2017, 12, 26, 8, 5, 13))
@pytest.mark.django_db
def test_relative_date_with_time_around_dst(event):
event.settings.timezone = "Europe/Berlin"
event.date_from = datetime(2020, 3, 29, 18, 0, 0, tzinfo=BERLIN)
event.date_from = BERLIN.localize(datetime(2020, 3, 29, 18, 0, 0))
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=time(18, 0, 0), base_date_name='date_from', minutes_before=None))
assert rdw.to_string() == 'RELDATE/1/18:00:00/date_from/'
assert rdw.datetime(event) == datetime(2020, 3, 28, 18, 0, 0, tzinfo=BERLIN)
assert rdw.datetime(event) == BERLIN.localize(datetime(2020, 3, 28, 18, 0, 0))
rdw = RelativeDateWrapper(RelativeDate(days_before=0, time=time(2, 30, 0), base_date_name='date_from', minutes_before=None))
assert rdw.to_string() == 'RELDATE/0/02:30:00/date_from/'
assert rdw.datetime(event) == datetime(2020, 3, 29, 2, 30, 0, tzinfo=BERLIN)
assert rdw.datetime(event) == BERLIN.localize(datetime(2020, 3, 29, 2, 30, 0))
event.date_from = datetime(2020, 10, 25, 18, 0, 0, tzinfo=BERLIN)
event.date_from = BERLIN.localize(datetime(2020, 10, 25, 18, 0, 0))
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=time(18, 0, 0), base_date_name='date_from', minutes_before=None))
assert rdw.to_string() == 'RELDATE/1/18:00:00/date_from/'
assert rdw.datetime(event) == datetime(2020, 10, 24, 18, 0, 0, tzinfo=BERLIN)
assert rdw.datetime(event) == BERLIN.localize(datetime(2020, 10, 24, 18, 0, 0))
rdw = RelativeDateWrapper(RelativeDate(days_before=0, time=time(2, 30, 0), base_date_name='date_from', minutes_before=None))
assert rdw.to_string() == 'RELDATE/0/02:30:00/date_from/'
assert rdw.datetime(event) == datetime(2020, 10, 25, 2, 30, 0, tzinfo=BERLIN)
assert rdw.datetime(event) == BERLIN.localize(datetime(2020, 10, 25, 2, 30, 0))
def test_unserialize():

View File

@@ -21,20 +21,20 @@
#
from datetime import date, datetime
from zoneinfo import ZoneInfo
import pytest
import pytz
from pretix.base.timeframes import (
REPORTING_DATE_TIMEFRAMES, resolve_timeframe_to_dates_inclusive,
resolve_timeframe_to_datetime_start_inclusive_end_exclusive,
)
tz = ZoneInfo("Europe/Berlin")
tz = pytz.timezone("Europe/Berlin")
def dt(*args):
return datetime(*args, tzinfo=tz)
return tz.localize(datetime(*args))
ref_date = date(2023, 3, 28)

View File

@@ -21,16 +21,16 @@
#
from datetime import datetime
from decimal import Decimal
from zoneinfo import ZoneInfo
import pytest
import pytz
from django_scopes import scope
from pretix.base.i18n import language
from pretix.base.models import Event, Organizer
from pretix.base.timeline import timeline_for_event
tz = ZoneInfo('Europe/Berlin')
tz = pytz.timezone('Europe/Berlin')
def one(iterable):