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
+2 -2
View File
@@ -23,9 +23,9 @@ import datetime
import mimetypes import mimetypes
import os import os
from decimal import Decimal from decimal import Decimal
from zoneinfo import ZoneInfo
import django_filters import django_filters
import pytz
from django.db import transaction from django.db import transaction
from django.db.models import ( from django.db.models import (
Exists, F, OuterRef, Prefetch, Q, Subquery, prefetch_related_objects, Exists, F, OuterRef, Prefetch, Q, Subquery, prefetch_related_objects,
@@ -602,7 +602,7 @@ class OrderViewSet(viewsets.ModelViewSet):
status=status.HTTP_400_BAD_REQUEST status=status.HTTP_400_BAD_REQUEST
) )
tz = ZoneInfo(self.request.event.settings.timezone) tz = pytz.timezone(self.request.event.settings.timezone)
new_date = make_aware(datetime.datetime.combine( new_date = make_aware(datetime.datetime.combine(
new_date, new_date,
datetime.time(hour=23, minute=59, second=59) datetime.time(hour=23, minute=59, second=59)
+2 -2
View File
@@ -37,8 +37,8 @@ import tempfile
from collections import OrderedDict, namedtuple from collections import OrderedDict, namedtuple
from decimal import Decimal from decimal import Decimal
from typing import Optional, Tuple from typing import Optional, Tuple
from zoneinfo import ZoneInfo
import pytz
from defusedcsv import csv from defusedcsv import csv
from django import forms from django import forms
from django.conf import settings from django.conf import settings
@@ -68,7 +68,7 @@ class BaseExporter:
self.events = event self.events = event
self.event = None self.event = None
e = self.events.first() e = self.events.first()
self.timezone = e.timezone if e else ZoneInfo(settings.TIME_ZONE) self.timezone = e.timezone if e else pytz.timezone(settings.TIME_ZONE)
else: else:
self.events = Event.objects.filter(pk=event.pk) self.events = Event.objects.filter(pk=event.pk)
self.timezone = event.timezone self.timezone = event.timezone
+6 -6
View File
@@ -34,8 +34,8 @@
from collections import OrderedDict from collections import OrderedDict
from decimal import Decimal from decimal import Decimal
from zoneinfo import ZoneInfo
import pytz
from django import forms from django import forms
from django.db.models import ( from django.db.models import (
Case, CharField, Count, DateTimeField, F, IntegerField, Max, Min, OuterRef, Case, CharField, Count, DateTimeField, F, IntegerField, Max, Min, OuterRef,
@@ -319,7 +319,7 @@ class OrderListExporter(MultiSheetListExporter):
yield self.ProgressSetTotal(total=qs.count()) yield self.ProgressSetTotal(total=qs.count())
for order in qs.order_by('datetime').iterator(): for order in qs.order_by('datetime').iterator():
tz = ZoneInfo(self.event_object_cache[order.event_id].settings.timezone) tz = pytz.timezone(self.event_object_cache[order.event_id].settings.timezone)
row = [ row = [
self.event_object_cache[order.event_id].slug, self.event_object_cache[order.event_id].slug,
@@ -452,7 +452,7 @@ class OrderListExporter(MultiSheetListExporter):
yield self.ProgressSetTotal(total=qs.count()) yield self.ProgressSetTotal(total=qs.count())
for op in qs.order_by('order__datetime').iterator(): for op in qs.order_by('order__datetime').iterator():
order = op.order order = op.order
tz = ZoneInfo(order.event.settings.timezone) tz = pytz.timezone(order.event.settings.timezone)
row = [ row = [
self.event_object_cache[order.event_id].slug, self.event_object_cache[order.event_id].slug,
order.code, order.code,
@@ -621,7 +621,7 @@ class OrderListExporter(MultiSheetListExporter):
for op in ops: for op in ops:
order = op.order order = op.order
tz = ZoneInfo(self.event_object_cache[order.event_id].settings.timezone) tz = pytz.timezone(self.event_object_cache[order.event_id].settings.timezone)
row = [ row = [
self.event_object_cache[order.event_id].slug, self.event_object_cache[order.event_id].slug,
order.code, order.code,
@@ -803,7 +803,7 @@ class PaymentListExporter(ListExporter):
yield self.ProgressSetTotal(total=len(objs)) yield self.ProgressSetTotal(total=len(objs))
for obj in objs: for obj in objs:
tz = ZoneInfo(obj.order.event.settings.timezone) tz = pytz.timezone(obj.order.event.settings.timezone)
if isinstance(obj, OrderPayment) and obj.payment_date: if isinstance(obj, OrderPayment) and obj.payment_date:
d2 = obj.payment_date.astimezone(tz).date().strftime('%Y-%m-%d') d2 = obj.payment_date.astimezone(tz).date().strftime('%Y-%m-%d')
elif isinstance(obj, OrderRefund) and obj.execution_date: elif isinstance(obj, OrderRefund) and obj.execution_date:
@@ -968,7 +968,7 @@ class GiftcardRedemptionListExporter(ListExporter):
yield headers yield headers
for obj in objs: for obj in objs:
tz = ZoneInfo(obj.order.event.settings.timezone) tz = pytz.timezone(obj.order.event.settings.timezone)
gc = GiftCard.objects.get(pk=obj.info_data.get('gift_card')) gc = GiftCard.objects.get(pk=obj.info_data.get('gift_card'))
row = [ row = [
obj.order.event.slug, obj.order.event.slug,
+2 -2
View File
@@ -20,8 +20,8 @@
# <https://www.gnu.org/licenses/>. # <https://www.gnu.org/licenses/>.
# #
from collections import OrderedDict from collections import OrderedDict
from zoneinfo import ZoneInfo
import pytz
from django import forms from django import forms
from django.db.models import F, Q from django.db.models import F, Q
from django.dispatch import receiver from django.dispatch import receiver
@@ -137,7 +137,7 @@ class WaitingListExporter(ListExporter):
# which event should be used to output dates in columns "Start date" and "End date" # which event should be used to output dates in columns "Start date" and "End date"
event_for_date_columns = entry.subevent if entry.subevent else entry.event event_for_date_columns = entry.subevent if entry.subevent else entry.event
tz = ZoneInfo(entry.event.settings.timezone) tz = pytz.timezone(entry.event.settings.timezone)
datetime_format = '%Y-%m-%d %H:%M:%S' datetime_format = '%Y-%m-%d %H:%M:%S'
row = [ row = [
+2 -2
View File
@@ -37,10 +37,10 @@ import json
import logging import logging
from decimal import Decimal from decimal import Decimal
from io import BytesIO from io import BytesIO
from zoneinfo import ZoneInfo
import dateutil.parser import dateutil.parser
import pycountry import pycountry
import pytz
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
@@ -685,7 +685,7 @@ class BaseQuestionsForm(forms.Form):
initial = answers[0] initial = answers[0]
else: else:
initial = None initial = None
tz = ZoneInfo(event.settings.timezone) tz = pytz.timezone(event.settings.timezone)
help_text = rich_text(q.help_text) help_text = rich_text(q.help_text)
label = escape(q.question) # django-bootstrap3 calls mark_safe label = escape(q.question) # django-bootstrap3 calls mark_safe
required = q.required and not self.all_optional required = q.required and not self.all_optional
@@ -22,7 +22,7 @@
import json import json
import sys import sys
import pytz_deprecation_shim import pytz
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.utils.timezone import override from django.utils.timezone import override
from django_scopes import scope from django_scopes import scope
@@ -60,7 +60,7 @@ class Command(BaseCommand):
sys.exit(1) sys.exit(1)
locale = options.get("locale", None) locale = options.get("locale", None)
timezone = pytz_deprecation_shim.timezone(options['timezone']) if options.get('timezone') else None timezone = pytz.timezone(options['timezone']) if options.get('timezone') else None
with scope(organizer=o): with scope(organizer=o):
if options['event_slug']: if options['event_slug']:
+3 -3
View File
@@ -21,8 +21,8 @@
# #
from collections import OrderedDict from collections import OrderedDict
from urllib.parse import urlsplit from urllib.parse import urlsplit
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
import pytz
from django.conf import settings from django.conf import settings
from django.http import Http404, HttpRequest, HttpResponse from django.http import Http404, HttpRequest, HttpResponse
from django.middleware.common import CommonMiddleware from django.middleware.common import CommonMiddleware
@@ -98,9 +98,9 @@ class LocaleMiddleware(MiddlewareMixin):
tzname = request.user.timezone tzname = request.user.timezone
if tzname: if tzname:
try: try:
timezone.activate(ZoneInfo(tzname)) timezone.activate(pytz.timezone(tzname))
request.timezone = tzname request.timezone = tzname
except ZoneInfoNotFoundError: except pytz.UnknownTimeZoneError:
pass pass
else: else:
timezone.deactivate() timezone.deactivate()
@@ -2,8 +2,6 @@
# Generated by Django 1.10.4 on 2017-02-03 14:21 # Generated by Django 1.10.4 on 2017-02-03 14:21
from __future__ import unicode_literals from __future__ import unicode_literals
from zoneinfo import ZoneInfo
import django.core.validators import django.core.validators
import django.db.migrations.operations.special import django.db.migrations.operations.special
import django.db.models.deletion import django.db.models.deletion
@@ -28,7 +26,7 @@ def forwards42(apps, schema_editor):
for s in EventSetting.objects.filter(key='timezone').values('object_id', 'value') for s in EventSetting.objects.filter(key='timezone').values('object_id', 'value')
} }
for order in Order.objects.all(): for order in Order.objects.all():
tz = ZoneInfo(etz.get(order.event_id, 'UTC')) tz = pytz.timezone(etz.get(order.event_id, 'UTC'))
order.expires = order.expires.astimezone(tz).replace(hour=23, minute=59, second=59) order.expires = order.expires.astimezone(tz).replace(hour=23, minute=59, second=59)
order.save() order.save()
@@ -2,9 +2,9 @@
# Generated by Django 1.10.2 on 2016-10-19 17:57 # Generated by Django 1.10.2 on 2016-10-19 17:57
from __future__ import unicode_literals from __future__ import unicode_literals
from zoneinfo import ZoneInfo import pytz
from django.db import migrations from django.db import migrations
from django.utils import timezone
def forwards(apps, schema_editor): def forwards(apps, schema_editor):
@@ -15,7 +15,7 @@ def forwards(apps, schema_editor):
for s in EventSetting.objects.filter(key='timezone').values('object_id', 'value') for s in EventSetting.objects.filter(key='timezone').values('object_id', 'value')
} }
for order in Order.objects.all(): for order in Order.objects.all():
tz = ZoneInfo(etz.get(order.event_id, 'UTC')) tz = pytz.timezone(etz.get(order.event_id, 'UTC'))
order.expires = order.expires.astimezone(tz).replace(hour=23, minute=59, second=59) order.expires = order.expires.astimezone(tz).replace(hour=23, minute=59, second=59)
order.save() order.save()
@@ -1,7 +1,8 @@
# Generated by Django 3.2.4 on 2021-09-30 10:25 # Generated by Django 3.2.4 on 2021-09-30 10:25
from datetime import datetime, timezone from datetime import datetime
from django.db import migrations, models from django.db import migrations, models
from pytz import UTC
class Migration(migrations.Migration): class Migration(migrations.Migration):
@@ -14,7 +15,7 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='invoice', model_name='invoice',
name='sent_to_customer', name='sent_to_customer',
field=models.DateTimeField(blank=True, null=True, default=datetime(1970, 1, 1, 0, 0, 0, 0, tzinfo=timezone.utc)), field=models.DateTimeField(blank=True, null=True, default=UTC.localize(datetime(1970, 1, 1, 0, 0, 0, 0))),
preserve_default=False, preserve_default=False,
), ),
] ]
+3 -4
View File
@@ -40,9 +40,8 @@ from collections import OrderedDict
from datetime import datetime, time, timedelta from datetime import datetime, time, timedelta
from operator import attrgetter from operator import attrgetter
from urllib.parse import urljoin from urllib.parse import urljoin
from zoneinfo import ZoneInfo
import pytz_deprecation_shim import pytz
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.files.storage import default_storage from django.core.files.storage import default_storage
@@ -215,7 +214,7 @@ class EventMixin:
@property @property
def timezone(self): def timezone(self):
return pytz_deprecation_shim.timezone(self.settings.timezone) return pytz.timezone(self.settings.timezone)
@property @property
def effective_presale_end(self): def effective_presale_end(self):
@@ -719,7 +718,7 @@ class Event(EventMixin, LoggedModel):
""" """
The last datetime of payments for this event. The last datetime of payments for this event.
""" """
tz = ZoneInfo(self.settings.timezone) tz = pytz.timezone(self.settings.timezone)
return make_aware(datetime.combine( return make_aware(datetime.combine(
self.settings.get('payment_term_last', as_type=RelativeDateWrapper).datetime(self).date(), self.settings.get('payment_term_last', as_type=RelativeDateWrapper).datetime(self).date(),
time(hour=23, minute=59, second=59) time(hour=23, minute=59, second=59)
+2 -2
View File
@@ -39,9 +39,9 @@ from collections import Counter, OrderedDict
from datetime import date, datetime, time from datetime import date, datetime, time
from decimal import Decimal, DecimalException from decimal import Decimal, DecimalException
from typing import Tuple from typing import Tuple
from zoneinfo import ZoneInfo
import dateutil.parser import dateutil.parser
import pytz
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.validators import MinValueValidator, RegexValidator from django.core.validators import MinValueValidator, RegexValidator
@@ -1474,7 +1474,7 @@ class Question(LoggedModel):
try: try:
dt = dateutil.parser.parse(answer) dt = dateutil.parser.parse(answer)
if is_naive(dt): if is_naive(dt):
dt = make_aware(dt, ZoneInfo(self.event.settings.timezone)) dt = make_aware(dt, pytz.timezone(self.event.settings.timezone))
except: except:
raise ValidationError(_('Invalid datetime input.')) raise ValidationError(_('Invalid datetime input.'))
else: else:
+4 -4
View File
@@ -42,10 +42,10 @@ from collections import Counter
from datetime import datetime, time, timedelta from datetime import datetime, time, timedelta
from decimal import Decimal from decimal import Decimal
from typing import Any, Dict, List, Union from typing import Any, Dict, List, Union
from zoneinfo import ZoneInfo
import dateutil import dateutil
import pycountry import pycountry
import pytz
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models, transaction from django.db import models, transaction
@@ -485,7 +485,7 @@ class Order(LockModel, LoggedModel):
def set_expires(self, now_dt=None, subevents=None): def set_expires(self, now_dt=None, subevents=None):
now_dt = now_dt or now() now_dt = now_dt or now()
tz = ZoneInfo(self.event.settings.timezone) tz = pytz.timezone(self.event.settings.timezone)
mode = self.event.settings.get('payment_term_mode') mode = self.event.settings.get('payment_term_mode')
if mode == 'days': if mode == 'days':
exp_by_date = now_dt.astimezone(tz) + timedelta(days=self.event.settings.get('payment_term_days', as_type=int)) exp_by_date = now_dt.astimezone(tz) + timedelta(days=self.event.settings.get('payment_term_days', as_type=int))
@@ -856,7 +856,7 @@ class Order(LockModel, LoggedModel):
@property @property
def payment_term_last(self): def payment_term_last(self):
tz = ZoneInfo(self.event.settings.timezone) tz = pytz.timezone(self.event.settings.timezone)
term_last = self.event.settings.get('payment_term_last', as_type=RelativeDateWrapper) term_last = self.event.settings.get('payment_term_last', as_type=RelativeDateWrapper)
if term_last: if term_last:
if self.event.has_subevents: if self.event.has_subevents:
@@ -1216,7 +1216,7 @@ class QuestionAnswer(models.Model):
try: try:
d = dateutil.parser.parse(self.answer) d = dateutil.parser.parse(self.answer)
if self.orderposition: if self.orderposition:
tz = ZoneInfo(self.orderposition.order.event.settings.timezone) tz = pytz.timezone(self.orderposition.order.event.settings.timezone)
d = d.astimezone(tz) d = d.astimezone(tz)
return date_format(d, "SHORT_DATETIME_FORMAT") return date_format(d, "SHORT_DATETIME_FORMAT")
except ValueError: except ValueError:
+2 -2
View File
@@ -35,7 +35,7 @@
import string import string
from datetime import date, datetime, time from datetime import date, datetime, time
import pytz_deprecation_shim import pytz
from django.conf import settings from django.conf import settings
from django.core.mail import get_connection from django.core.mail import get_connection
from django.core.validators import MinLengthValidator, RegexValidator from django.core.validators import MinLengthValidator, RegexValidator
@@ -140,7 +140,7 @@ class Organizer(LoggedModel):
@property @property
def timezone(self): def timezone(self):
return pytz_deprecation_shim.timezone(self.settings.timezone) return pytz.timezone(self.settings.timezone)
@cached_property @cached_property
def all_logentries_link(self): def all_logentries_link(self):
+2 -2
View File
@@ -39,8 +39,8 @@ import logging
from collections import OrderedDict from collections import OrderedDict
from decimal import ROUND_HALF_UP, Decimal from decimal import ROUND_HALF_UP, Decimal
from typing import Any, Dict, Union from typing import Any, Dict, Union
from zoneinfo import ZoneInfo
import pytz
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
@@ -508,7 +508,7 @@ class BasePaymentProvider:
def _is_still_available(self, now_dt=None, cart_id=None, order=None): def _is_still_available(self, now_dt=None, cart_id=None, order=None):
now_dt = now_dt or now() now_dt = now_dt or now()
tz = ZoneInfo(self.event.settings.timezone) tz = pytz.timezone(self.event.settings.timezone)
availability_date = self.settings.get('_availability_date', as_type=RelativeDateWrapper) availability_date = self.settings.get('_availability_date', as_type=RelativeDateWrapper)
if availability_date: if availability_date:
+11 -11
View File
@@ -46,7 +46,6 @@ import uuid
from collections import OrderedDict from collections import OrderedDict
from functools import partial from functools import partial
from io import BytesIO from io import BytesIO
from zoneinfo import ZoneInfo
import jsonschema import jsonschema
from arabic_reshaper import ArabicReshaper from arabic_reshaper import ArabicReshaper
@@ -64,6 +63,7 @@ from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _, pgettext from django.utils.translation import gettext_lazy as _, pgettext
from i18nfield.strings import LazyI18nString from i18nfield.strings import LazyI18nString
from PyPDF2 import PdfReader from PyPDF2 import PdfReader
from pytz import timezone
from reportlab.graphics import renderPDF from reportlab.graphics import renderPDF
from reportlab.graphics.barcode.qr import QrCodeWidget from reportlab.graphics.barcode.qr import QrCodeWidget
from reportlab.graphics.shapes import Drawing from reportlab.graphics.shapes import Drawing
@@ -239,7 +239,7 @@ DEFAULT_VARIABLES = OrderedDict((
"label": _("Event begin date and time"), "label": _("Event begin date and time"),
"editor_sample": _("2017-05-31 20:00"), "editor_sample": _("2017-05-31 20:00"),
"evaluate": lambda op, order, ev: date_format( "evaluate": lambda op, order, ev: date_format(
ev.date_from.astimezone(ZoneInfo(ev.settings.timezone)), ev.date_from.astimezone(timezone(ev.settings.timezone)),
"SHORT_DATETIME_FORMAT" "SHORT_DATETIME_FORMAT"
) if ev.date_from else "" ) if ev.date_from else ""
}), }),
@@ -247,7 +247,7 @@ DEFAULT_VARIABLES = OrderedDict((
"label": _("Event begin date"), "label": _("Event begin date"),
"editor_sample": _("2017-05-31"), "editor_sample": _("2017-05-31"),
"evaluate": lambda op, order, ev: date_format( "evaluate": lambda op, order, ev: date_format(
ev.date_from.astimezone(ZoneInfo(ev.settings.timezone)), ev.date_from.astimezone(timezone(ev.settings.timezone)),
"SHORT_DATE_FORMAT" "SHORT_DATE_FORMAT"
) if ev.date_from else "" ) if ev.date_from else ""
}), }),
@@ -265,7 +265,7 @@ DEFAULT_VARIABLES = OrderedDict((
"label": _("Event end date and time"), "label": _("Event end date and time"),
"editor_sample": _("2017-05-31 22:00"), "editor_sample": _("2017-05-31 22:00"),
"evaluate": lambda op, order, ev: date_format( "evaluate": lambda op, order, ev: date_format(
ev.date_to.astimezone(ZoneInfo(ev.settings.timezone)), ev.date_to.astimezone(timezone(ev.settings.timezone)),
"SHORT_DATETIME_FORMAT" "SHORT_DATETIME_FORMAT"
) if ev.date_to else "" ) if ev.date_to else ""
}), }),
@@ -273,7 +273,7 @@ DEFAULT_VARIABLES = OrderedDict((
"label": _("Event end date"), "label": _("Event end date"),
"editor_sample": _("2017-05-31"), "editor_sample": _("2017-05-31"),
"evaluate": lambda op, order, ev: date_format( "evaluate": lambda op, order, ev: date_format(
ev.date_to.astimezone(ZoneInfo(ev.settings.timezone)), ev.date_to.astimezone(timezone(ev.settings.timezone)),
"SHORT_DATE_FORMAT" "SHORT_DATE_FORMAT"
) if ev.date_to else "" ) if ev.date_to else ""
}), }),
@@ -281,7 +281,7 @@ DEFAULT_VARIABLES = OrderedDict((
"label": _("Event end time"), "label": _("Event end time"),
"editor_sample": _("22:00"), "editor_sample": _("22:00"),
"evaluate": lambda op, order, ev: date_format( "evaluate": lambda op, order, ev: date_format(
ev.date_to.astimezone(ZoneInfo(ev.settings.timezone)), ev.date_to.astimezone(timezone(ev.settings.timezone)),
"TIME_FORMAT" "TIME_FORMAT"
) if ev.date_to else "" ) if ev.date_to else ""
}), }),
@@ -294,7 +294,7 @@ DEFAULT_VARIABLES = OrderedDict((
"label": _("Event admission date and time"), "label": _("Event admission date and time"),
"editor_sample": _("2017-05-31 19:00"), "editor_sample": _("2017-05-31 19:00"),
"evaluate": lambda op, order, ev: date_format( "evaluate": lambda op, order, ev: date_format(
ev.date_admission.astimezone(ZoneInfo(ev.settings.timezone)), ev.date_admission.astimezone(timezone(ev.settings.timezone)),
"SHORT_DATETIME_FORMAT" "SHORT_DATETIME_FORMAT"
) if ev.date_admission else "" ) if ev.date_admission else ""
}), }),
@@ -302,7 +302,7 @@ DEFAULT_VARIABLES = OrderedDict((
"label": _("Event admission time"), "label": _("Event admission time"),
"editor_sample": _("19:00"), "editor_sample": _("19:00"),
"evaluate": lambda op, order, ev: date_format( "evaluate": lambda op, order, ev: date_format(
ev.date_admission.astimezone(ZoneInfo(ev.settings.timezone)), ev.date_admission.astimezone(timezone(ev.settings.timezone)),
"TIME_FORMAT" "TIME_FORMAT"
) if ev.date_admission else "" ) if ev.date_admission else ""
}), }),
@@ -387,7 +387,7 @@ DEFAULT_VARIABLES = OrderedDict((
"label": _("Printing date"), "label": _("Printing date"),
"editor_sample": _("2017-05-31"), "editor_sample": _("2017-05-31"),
"evaluate": lambda op, order, ev: date_format( "evaluate": lambda op, order, ev: date_format(
now().astimezone(ZoneInfo(ev.settings.timezone)), now().astimezone(timezone(ev.settings.timezone)),
"SHORT_DATE_FORMAT" "SHORT_DATE_FORMAT"
) )
}), }),
@@ -395,7 +395,7 @@ DEFAULT_VARIABLES = OrderedDict((
"label": _("Printing date and time"), "label": _("Printing date and time"),
"editor_sample": _("2017-05-31 19:00"), "editor_sample": _("2017-05-31 19:00"),
"evaluate": lambda op, order, ev: date_format( "evaluate": lambda op, order, ev: date_format(
now().astimezone(ZoneInfo(ev.settings.timezone)), now().astimezone(timezone(ev.settings.timezone)),
"SHORT_DATETIME_FORMAT" "SHORT_DATETIME_FORMAT"
) )
}), }),
@@ -403,7 +403,7 @@ DEFAULT_VARIABLES = OrderedDict((
"label": _("Printing time"), "label": _("Printing time"),
"editor_sample": _("19:00"), "editor_sample": _("19:00"),
"evaluate": lambda op, order, ev: date_format( "evaluate": lambda op, order, ev: date_format(
now().astimezone(ZoneInfo(ev.settings.timezone)), now().astimezone(timezone(ev.settings.timezone)),
"TIME_FORMAT" "TIME_FORMAT"
) if ev.date_admission else "" ) if ev.date_admission else ""
}), }),
+3 -3
View File
@@ -22,8 +22,8 @@
import datetime import datetime
from collections import namedtuple from collections import namedtuple
from typing import Union from typing import Union
from zoneinfo import ZoneInfo
import pytz
from dateutil import parser from dateutil import parser
from django import forms from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
@@ -67,7 +67,7 @@ class RelativeDateWrapper:
if self.data.minutes_before is not None: if self.data.minutes_before is not None:
raise ValueError('A minute-based relative datetime can not be used as a date') raise ValueError('A minute-based relative datetime can not be used as a date')
tz = ZoneInfo(event.settings.timezone) tz = pytz.timezone(event.settings.timezone)
if isinstance(event, SubEvent): if isinstance(event, SubEvent):
base_date = ( base_date = (
getattr(event, self.data.base_date_name) getattr(event, self.data.base_date_name)
@@ -86,7 +86,7 @@ class RelativeDateWrapper:
if isinstance(self.data, (datetime.datetime, datetime.date)): if isinstance(self.data, (datetime.datetime, datetime.date)):
return self.data return self.data
else: else:
tz = ZoneInfo(event.settings.timezone) tz = pytz.timezone(event.settings.timezone)
if isinstance(event, SubEvent): if isinstance(event, SubEvent):
base_date = ( base_date = (
getattr(event, self.data.base_date_name) getattr(event, self.data.base_date_name)
+4 -4
View File
@@ -32,7 +32,7 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License. # License for the specific language governing permissions and limitations under the License.
import os import os
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta
from functools import partial, reduce from functools import partial, reduce
import dateutil import dateutil
@@ -439,7 +439,7 @@ class SQLLogic:
if operator == 'buildTime': if operator == 'buildTime':
if values[0] == "custom": if values[0] == "custom":
return Value(dateutil.parser.parse(values[1]).astimezone(timezone.utc)) return Value(dateutil.parser.parse(values[1]).astimezone(pytz.UTC))
elif values[0] == "customtime": elif values[0] == "customtime":
parsed = dateutil.parser.parse(values[1]) parsed = dateutil.parser.parse(values[1])
return Value(now().astimezone(self.list.event.timezone).replace( return Value(now().astimezone(self.list.event.timezone).replace(
@@ -447,7 +447,7 @@ class SQLLogic:
minute=parsed.minute, minute=parsed.minute,
second=parsed.second, second=parsed.second,
microsecond=parsed.microsecond, microsecond=parsed.microsecond,
).astimezone(timezone.utc)) ).astimezone(pytz.UTC))
elif values[0] == 'date_from': elif values[0] == 'date_from':
return Coalesce( return Coalesce(
F('subevent__date_from'), F('subevent__date_from'),
@@ -475,7 +475,7 @@ class SQLLogic:
return int(values[1]) return int(values[1])
elif operator == 'var': elif operator == 'var':
if values[0] == 'now': if values[0] == 'now':
return Value(now().astimezone(timezone.utc)) return Value(now().astimezone(pytz.UTC))
elif values[0] == 'now_isoweekday': elif values[0] == 'now_isoweekday':
return Value(now().astimezone(self.list.event.timezone).isoweekday()) return Value(now().astimezone(self.list.event.timezone).isoweekday())
elif values[0] == 'product': elif values[0] == 'product':
+3 -3
View File
@@ -45,8 +45,8 @@ from email.mime.image import MIMEImage
from email.utils import formataddr from email.utils import formataddr
from typing import Any, Dict, List, Sequence, Union from typing import Any, Dict, List, Sequence, Union
from urllib.parse import urljoin, urlparse from urllib.parse import urljoin, urlparse
from zoneinfo import ZoneInfo
import pytz
import requests import requests
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from celery import chain from celery import chain
@@ -218,11 +218,11 @@ def mail(email: Union[str, Sequence[str]], subject: str, template: Union[str, La
if event: if event:
timezone = event.timezone timezone = event.timezone
elif user: elif user:
timezone = ZoneInfo(user.timezone) timezone = pytz.timezone(user.timezone)
elif organizer: elif organizer:
timezone = organizer.timezone timezone = organizer.timezone
else: else:
timezone = ZoneInfo(settings.TIME_ZONE) timezone = pytz.timezone(settings.TIME_ZONE)
if settings_holder: if settings_holder:
if settings_holder.settings.mail_bcc: if settings_holder.settings.mail_bcc:
+3 -2
View File
@@ -20,10 +20,11 @@
# <https://www.gnu.org/licenses/>. # <https://www.gnu.org/licenses/>.
# #
import calendar import calendar
from datetime import date, datetime, time, timedelta, timezone from datetime import date, datetime, time, timedelta
from itertools import groupby from itertools import groupby
from typing import Optional, Tuple from typing import Optional, Tuple
import pytz
from django import forms from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.formats import date_format from django.utils.formats import date_format
@@ -389,7 +390,7 @@ class SerializerDateFrameField(serializers.CharField):
if data is None: if data is None:
return None return None
try: try:
resolve_timeframe_to_dates_inclusive(now(), data, timezone.utc) resolve_timeframe_to_dates_inclusive(now(), data, pytz.UTC)
except: except:
raise ValidationError("Invalid date frame") raise ValidationError("Invalid date frame")
+3 -3
View File
@@ -21,9 +21,9 @@
# #
import logging import logging
from importlib import import_module from importlib import import_module
from zoneinfo import ZoneInfo
import celery.exceptions import celery.exceptions
import pytz
from celery import states from celery import states
from celery.result import AsyncResult from celery.result import AsyncResult
from django.conf import settings from django.conf import settings
@@ -252,7 +252,7 @@ class AsyncFormView(AsyncMixin, FormView):
task_self = self task_self = self
view_instance._task_self = task_self view_instance._task_self = task_self
with translation.override(locale), timezone.override(ZoneInfo(tz)): with translation.override(locale), timezone.override(pytz.timezone(tz)):
form_class = view_instance.get_form_class() form_class = view_instance.get_form_class()
if form_kwargs.get('instance'): if form_kwargs.get('instance'):
form_kwargs['instance'] = cls.model.objects.get(pk=form_kwargs['instance']) form_kwargs['instance'] = cls.model.objects.get(pk=form_kwargs['instance'])
@@ -377,7 +377,7 @@ class AsyncPostView(AsyncMixin, View):
task_self = self task_self = self
view_instance._task_self = task_self view_instance._task_self = task_self
with translation.override(locale), timezone.override(ZoneInfo(tz)): with translation.override(locale), timezone.override(pytz.timezone(tz)):
return view_instance.async_post(view_instance.request, *url_args, **url_kwargs) return view_instance.async_post(view_instance.request, *url_args, **url_kwargs)
cls.async_execute = app.task( cls.async_execute = app.task(
+3 -4
View File
@@ -36,7 +36,6 @@
from decimal import Decimal from decimal import Decimal
from urllib.parse import urlencode, urlparse from urllib.parse import urlencode, urlparse
from zoneinfo import ZoneInfo
from django import forms from django import forms
from django.conf import settings from django.conf import settings
@@ -56,7 +55,7 @@ from django_countries.fields import LazyTypedChoiceField
from i18nfield.forms import ( from i18nfield.forms import (
I18nForm, I18nFormField, I18nFormSetMixin, I18nTextarea, I18nTextInput, I18nForm, I18nFormField, I18nFormSetMixin, I18nTextarea, I18nTextInput,
) )
from pytz import common_timezones from pytz import common_timezones, timezone
from pretix.base.channels import get_all_sales_channels from pretix.base.channels import get_all_sales_channels
from pretix.base.email import get_available_placeholders from pretix.base.email import get_available_placeholders
@@ -222,7 +221,7 @@ class EventWizardBasicsForm(I18nModelForm):
}) })
# change timezone # change timezone
zone = ZoneInfo(data.get('timezone')) zone = timezone(data.get('timezone'))
data['date_from'] = self.reset_timezone(zone, data.get('date_from')) data['date_from'] = self.reset_timezone(zone, data.get('date_from'))
data['date_to'] = self.reset_timezone(zone, data.get('date_to')) data['date_to'] = self.reset_timezone(zone, data.get('date_to'))
data['presale_start'] = self.reset_timezone(zone, data.get('presale_start')) data['presale_start'] = self.reset_timezone(zone, data.get('presale_start'))
@@ -231,7 +230,7 @@ class EventWizardBasicsForm(I18nModelForm):
@staticmethod @staticmethod
def reset_timezone(tz, dt): def reset_timezone(tz, dt):
return dt.replace(tzinfo=tz) if dt is not None else None return tz.localize(dt.replace(tzinfo=None)) if dt is not None else None
def clean_slug(self): def clean_slug(self):
slug = self.cleaned_data['slug'] slug = self.cleaned_data['slug']
+3 -2
View File
@@ -39,6 +39,7 @@ from decimal import Decimal
import bleach import bleach
import dateutil.parser import dateutil.parser
import pytz
from django.dispatch import receiver from django.dispatch import receiver
from django.urls import reverse from django.urls import reverse
from django.utils.formats import date_format from django.utils.formats import date_format
@@ -189,7 +190,7 @@ def _display_checkin(event, logentry):
if 'datetime' in data: if 'datetime' in data:
dt = dateutil.parser.parse(data.get('datetime')) dt = dateutil.parser.parse(data.get('datetime'))
show_dt = abs((logentry.datetime - dt).total_seconds()) > 5 or 'forced' in data show_dt = abs((logentry.datetime - dt).total_seconds()) > 5 or 'forced' in data
tz = event.timezone tz = pytz.timezone(event.settings.timezone)
dt_formatted = date_format(dt.astimezone(tz), "SHORT_DATETIME_FORMAT") dt_formatted = date_format(dt.astimezone(tz), "SHORT_DATETIME_FORMAT")
if 'list' in data: if 'list' in data:
@@ -581,7 +582,7 @@ def pretixcontrol_logentry_display(sender: Event, logentry: LogEntry, **kwargs):
if logentry.action_type == 'pretix.control.views.checkin': if logentry.action_type == 'pretix.control.views.checkin':
# deprecated # deprecated
dt = dateutil.parser.parse(data.get('datetime')) dt = dateutil.parser.parse(data.get('datetime'))
tz = sender.timezone tz = pytz.timezone(sender.settings.timezone)
dt_formatted = date_format(dt.astimezone(tz), "SHORT_DATETIME_FORMAT") dt_formatted = date_format(dt.astimezone(tz), "SHORT_DATETIME_FORMAT")
if 'list' in data: if 'list' in data:
try: try:
+17 -17
View File
@@ -19,7 +19,18 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see # 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/>. # <https://www.gnu.org/licenses/>.
# #
from datetime import timezone
# This file is based on an earlier version of pretix which was released under the Apache License 2.0. The full text of
# the Apache License 2.0 can be obtained at <http://www.apache.org/licenses/LICENSE-2.0>.
#
# This file may have since been changed and any changes are released under the terms of AGPLv3 as described above. A
# full history of changes and contributors is available at <https://github.com/pretix/pretix>.
#
# This file contains Apache-licensed contributions copyrighted by: Jakob Schnell, jasonwaiting@live.hk, pajowu
#
# Unless required by applicable law or agreed to in writing, software distributed under the Apache License 2.0 is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License.
import dateutil.parser import dateutil.parser
from django.contrib import messages from django.contrib import messages
@@ -33,6 +44,7 @@ from django.utils.functional import cached_property
from django.utils.timezone import is_aware, make_aware, now from django.utils.timezone import is_aware, make_aware, now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views.generic import ListView from django.views.generic import ListView
from pytz import UTC
from pretix.base.channels import get_all_sales_channels from pretix.base.channels import get_all_sales_channels
from pretix.base.models import Checkin, Order, OrderPosition from pretix.base.models import Checkin, Order, OrderPosition
@@ -48,18 +60,6 @@ from pretix.control.views import CreateView, PaginationMixin, UpdateView
from pretix.helpers.compat import CompatDeleteView from pretix.helpers.compat import CompatDeleteView
from pretix.helpers.models import modelcopy from pretix.helpers.models import modelcopy
# This file is based on an earlier version of pretix which was released under the Apache License 2.0. The full text of
# the Apache License 2.0 can be obtained at <http://www.apache.org/licenses/LICENSE-2.0>.
#
# This file may have since been changed and any changes are released under the terms of AGPLv3 as described above. A
# full history of changes and contributors is available at <https://github.com/pretix/pretix>.
#
# This file contains Apache-licensed contributions copyrighted by: Jakob Schnell, jasonwaiting@live.hk, pajowu
#
# Unless required by applicable law or agreed to in writing, software distributed under the Apache License 2.0 is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License.
class CheckInListQueryMixin: class CheckInListQueryMixin:
@@ -156,20 +156,20 @@ class CheckInListShow(EventPermissionRequiredMixin, PaginationMixin, CheckInList
if e.last_entry: if e.last_entry:
if isinstance(e.last_entry, str): if isinstance(e.last_entry, str):
# Apparently only happens on SQLite # Apparently only happens on SQLite
e.last_entry_aware = make_aware(dateutil.parser.parse(e.last_entry), timezone.utc) e.last_entry_aware = make_aware(dateutil.parser.parse(e.last_entry), UTC)
elif not is_aware(e.last_entry): elif not is_aware(e.last_entry):
# Apparently only happens on MySQL # Apparently only happens on MySQL
e.last_entry_aware = make_aware(e.last_entry, timezone.utc) e.last_entry_aware = make_aware(e.last_entry, UTC)
else: else:
# This would be correct, so guess on which database it works… Yes, it's PostgreSQL. # This would be correct, so guess on which database it works… Yes, it's PostgreSQL.
e.last_entry_aware = e.last_entry e.last_entry_aware = e.last_entry
if e.last_exit: if e.last_exit:
if isinstance(e.last_exit, str): if isinstance(e.last_exit, str):
# Apparently only happens on SQLite # Apparently only happens on SQLite
e.last_exit_aware = make_aware(dateutil.parser.parse(e.last_exit), timezone.utc) e.last_exit_aware = make_aware(dateutil.parser.parse(e.last_exit), UTC)
elif not is_aware(e.last_exit): elif not is_aware(e.last_exit):
# Apparently only happens on MySQL # Apparently only happens on MySQL
e.last_exit_aware = make_aware(e.last_exit, timezone.utc) e.last_exit_aware = make_aware(e.last_exit, UTC)
else: else:
# This would be correct, so guess on which database it works… Yes, it's PostgreSQL. # This would be correct, so guess on which database it works… Yes, it's PostgreSQL.
e.last_exit_aware = e.last_exit e.last_exit_aware = e.last_exit
+2 -2
View File
@@ -34,8 +34,8 @@
from datetime import timedelta from datetime import timedelta
from decimal import Decimal from decimal import Decimal
from zoneinfo import ZoneInfo
import pytz
from django.conf import settings from django.conf import settings
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db.models import ( from django.db.models import (
@@ -510,7 +510,7 @@ def widgets_for_event_qs(request, qs, user, nmax, lazy=False):
for event in events: for event in events:
if not lazy: if not lazy:
tzname = event.cache.get_or_set('timezone', lambda: event.settings.timezone) tzname = event.cache.get_or_set('timezone', lambda: event.settings.timezone)
tz = ZoneInfo(tzname) tz = pytz.timezone(tzname)
if event.has_subevents: if event.has_subevents:
if event.min_from is None: if event.min_from is None:
dr = pgettext("subevent", "No dates") dr = pgettext("subevent", "No dates")
+3 -3
View File
@@ -40,7 +40,6 @@ from collections import OrderedDict
from decimal import Decimal from decimal import Decimal
from itertools import groupby from itertools import groupby
from urllib.parse import urlsplit from urllib.parse import urlsplit
from zoneinfo import ZoneInfo
import bleach import bleach
from django.apps import apps from django.apps import apps
@@ -65,6 +64,7 @@ from django.views.generic.base import TemplateView, View
from django.views.generic.detail import SingleObjectMixin from django.views.generic.detail import SingleObjectMixin
from i18nfield.strings import LazyI18nString from i18nfield.strings import LazyI18nString
from i18nfield.utils import I18nJSONEncoder from i18nfield.utils import I18nJSONEncoder
from pytz import timezone
from pretix.base.channels import get_all_sales_channels from pretix.base.channels import get_all_sales_channels
from pretix.base.email import get_available_placeholders from pretix.base.email import get_available_placeholders
@@ -250,7 +250,7 @@ class EventUpdate(DecoupleMixin, EventSettingsViewMixin, EventPermissionRequired
self.item_meta_property_formset.is_valid() and self.confirm_texts_formset.is_valid() and \ self.item_meta_property_formset.is_valid() and self.confirm_texts_formset.is_valid() and \
self.footer_links_formset.is_valid(): self.footer_links_formset.is_valid():
# reset timezone # reset timezone
zone = ZoneInfo(self.sform.cleaned_data['timezone']) zone = timezone(self.sform.cleaned_data['timezone'])
event = form.instance event = form.instance
event.date_from = self.reset_timezone(zone, event.date_from) event.date_from = self.reset_timezone(zone, event.date_from)
event.date_to = self.reset_timezone(zone, event.date_to) event.date_to = self.reset_timezone(zone, event.date_to)
@@ -263,7 +263,7 @@ class EventUpdate(DecoupleMixin, EventSettingsViewMixin, EventPermissionRequired
@staticmethod @staticmethod
def reset_timezone(tz, dt): def reset_timezone(tz, dt):
return dt.replace(tzinfo=tz) if dt is not None else None return tz.localize(dt.replace(tzinfo=None)) if dt is not None else None
@cached_property @cached_property
def item_meta_property_formset(self): def item_meta_property_formset(self):
+2 -2
View File
@@ -33,8 +33,8 @@
# License for the specific language governing permissions and limitations under the License. # License for the specific language governing permissions and limitations under the License.
from datetime import datetime, time from datetime import datetime, time
from zoneinfo import ZoneInfo
import pytz
from dateutil.parser import parse from dateutil.parser import parse
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.db.models import F, Max, Min, Q from django.db.models import F, Max, Min, Q
@@ -87,7 +87,7 @@ def serialize_event(e):
if e.min_from is None: if e.min_from is None:
dr = pgettext('subevent', 'No dates') dr = pgettext('subevent', 'No dates')
else: else:
tz = ZoneInfo(e.settings.timezone) tz = pytz.timezone(e.settings.timezone)
dr = _('Series:') + ' ' + daterange( dr = _('Series:') + ' ' + daterange(
e.min_from.astimezone(tz), e.min_from.astimezone(tz),
(e.max_fromto or e.max_to or e.max_from).astimezone(tz) (e.max_fromto or e.max_to or e.max_from).astimezone(tz)
+3 -3
View File
@@ -33,7 +33,6 @@
# License for the specific language governing permissions and limitations under the License. # License for the specific language governing permissions and limitations under the License.
from collections import OrderedDict from collections import OrderedDict
from datetime import timezone
import bleach import bleach
import dateutil.parser import dateutil.parser
@@ -48,6 +47,7 @@ from django.utils.timezone import is_aware, make_aware, now
from django.utils.translation import ( from django.utils.translation import (
gettext as _, gettext_lazy, pgettext, pgettext_lazy, gettext as _, gettext_lazy, pgettext, pgettext_lazy,
) )
from pytz import UTC
from reportlab.lib.units import mm from reportlab.lib.units import mm
from reportlab.platypus import Flowable, Paragraph, Spacer, Table, TableStyle from reportlab.platypus import Flowable, Paragraph, Spacer, Table, TableStyle
@@ -493,7 +493,7 @@ class CSVCheckinList(CheckInListMixin, ListExporter):
elif op.last_checked_in: elif op.last_checked_in:
last_checked_in = op.last_checked_in last_checked_in = op.last_checked_in
if last_checked_in and not is_aware(last_checked_in): if last_checked_in and not is_aware(last_checked_in):
last_checked_in = make_aware(last_checked_in, timezone.utc) last_checked_in = make_aware(last_checked_in, UTC)
last_checked_out = None last_checked_out = None
if isinstance(op.last_checked_out, str): # SQLite if isinstance(op.last_checked_out, str): # SQLite
@@ -501,7 +501,7 @@ class CSVCheckinList(CheckInListMixin, ListExporter):
elif op.last_checked_out: elif op.last_checked_out:
last_checked_out = op.last_checked_out last_checked_out = op.last_checked_out
if last_checked_out and not is_aware(last_checked_out): if last_checked_out and not is_aware(last_checked_out):
last_checked_out = make_aware(last_checked_out, timezone.utc) last_checked_out = make_aware(last_checked_out, UTC)
row = [ row = [
op.order.code, op.order.code,
+3 -2
View File
@@ -37,6 +37,7 @@ import tempfile
from collections import OrderedDict, defaultdict from collections import OrderedDict, defaultdict
from decimal import Decimal from decimal import Decimal
import pytz
from dateutil.parser import parse from dateutil.parser import parse
from django import forms from django import forms
from django.conf import settings from django.conf import settings
@@ -82,7 +83,7 @@ class ReportlabExportMixin:
return 'report-%s.pdf' % self.event.slug, 'application/pdf', self.create(form_data) return 'report-%s.pdf' % self.event.slug, 'application/pdf', self.create(form_data)
def get_filename(self): def get_filename(self):
tz = self.event.timezone tz = pytz.timezone(self.event.settings.timezone)
return "%s-%s.pdf" % (self.name, now().astimezone(tz).strftime("%Y-%m-%d-%H-%M-%S")) return "%s-%s.pdf" % (self.name, now().astimezone(tz).strftime("%Y-%m-%d-%H-%M-%S"))
@staticmethod @staticmethod
@@ -443,7 +444,7 @@ class OrderTaxListReportPDF(Report):
headlinestyle = self.get_style() headlinestyle = self.get_style()
headlinestyle.fontSize = 15 headlinestyle.fontSize = 15
headlinestyle.fontName = 'OpenSansBd' headlinestyle.fontName = 'OpenSansBd'
tz = self.event.timezone tz = pytz.timezone(self.event.settings.timezone)
tax_rates = set( tax_rates = set(
a for a a for a
+5 -4
View File
@@ -22,6 +22,7 @@
import datetime import datetime
from urllib.parse import urlparse from urllib.parse import urlparse
import pytz
import vobject import vobject
from django.conf import settings from django.conf import settings
from django.utils.formats import date_format from django.utils.formats import date_format
@@ -40,11 +41,11 @@ def get_public_ical(events):
""" """
cal = vobject.iCalendar() cal = vobject.iCalendar()
cal.add('prodid').value = '-//pretix//{}//'.format(settings.PRETIX_INSTANCE_NAME.replace(" ", "_")) cal.add('prodid').value = '-//pretix//{}//'.format(settings.PRETIX_INSTANCE_NAME.replace(" ", "_"))
creation_time = datetime.datetime.now(datetime.timezone.utc) creation_time = datetime.datetime.now(pytz.utc)
for ev in events: for ev in events:
event = ev if isinstance(ev, Event) else ev.event event = ev if isinstance(ev, Event) else ev.event
tz = event.timezone tz = pytz.timezone(event.settings.timezone)
if isinstance(ev, Event): if isinstance(ev, Event):
url = build_absolute_uri(event, 'presale:event.index') url = build_absolute_uri(event, 'presale:event.index')
else: else:
@@ -112,9 +113,9 @@ def get_private_icals(event, positions):
- It would be pretty hard to implement it in a way that doesn't require us to use distinct - It would be pretty hard to implement it in a way that doesn't require us to use distinct
settings fields for emails to customers and to attendees, which feels like an overcomplication. settings fields for emails to customers and to attendees, which feels like an overcomplication.
""" """
tz = event.timezone tz = pytz.timezone(event.settings.timezone)
creation_time = datetime.datetime.now(datetime.timezone.utc) creation_time = datetime.datetime.now(pytz.utc)
calobjects = [] calobjects = []
evs = set(p.subevent or event for p in positions) evs = set(p.subevent or event for p in positions)
+3 -3
View File
@@ -38,10 +38,10 @@ from collections import defaultdict
from datetime import date, datetime, time, timedelta from datetime import date, datetime, time, timedelta
from functools import reduce from functools import reduce
from urllib.parse import quote, urlencode from urllib.parse import quote, urlencode
from zoneinfo import ZoneInfo
import dateutil import dateutil
import isoweek import isoweek
import pytz
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 Exists, Max, Min, OuterRef, Prefetch, Q
@@ -392,7 +392,7 @@ class OrganizerIndex(OrganizerViewMixin, EventListMixin, ListView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
for event in ctx['events']: for event in ctx['events']:
event.tzname = ZoneInfo(event.cache.get_or_set('timezone', lambda: event.settings.timezone)) event.tzname = pytz.timezone(event.cache.get_or_set('timezone', lambda: event.settings.timezone))
if event.has_subevents: if event.has_subevents:
event.daterange = daterange( event.daterange = daterange(
event.min_from.astimezone(event.tzname), event.min_from.astimezone(event.tzname),
@@ -508,7 +508,7 @@ def add_subevents_for_days(qs, before, after, ebd, timezones, event=None, cart_n
continue continue
timezones.add(s.timezone) timezones.add(s.timezone)
tz = ZoneInfo(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()
if s.show_date_to and se.date_to: if s.show_date_to and se.date_to:
+3 -3
View File
@@ -26,9 +26,9 @@ import logging
from collections import defaultdict from collections import defaultdict
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta
from urllib.parse import urljoin from urllib.parse import urljoin
from zoneinfo import ZoneInfo
import isoweek import isoweek
import pytz
from compressor.filters.jsmin import rJSMinFilter from compressor.filters.jsmin import rJSMinFilter
from django.conf import settings from django.conf import settings
from django.contrib.staticfiles import finders from django.contrib.staticfiles import finders
@@ -427,7 +427,7 @@ class WidgetAPIProductList(EventListMixin, View):
event = ev.event event = ev.event
else: else:
event = ev event = ev
tz = ZoneInfo(e['timezone']) tz = pytz.timezone(e['timezone'])
time = date_format(ev.date_from.astimezone(tz), 'TIME_FORMAT') if e.get('time') and event.settings.show_times else None time = date_format(ev.date_from.astimezone(tz), 'TIME_FORMAT') if e.get('time') and event.settings.show_times else None
if time and ev.date_to and ev.date_from.astimezone(tz).date() == ev.date_to.astimezone(tz).date() and event.settings.show_date_to: if time and ev.date_to and ev.date_from.astimezone(tz).date() == ev.date_to.astimezone(tz).date() and event.settings.show_date_to:
time += ' ' + date_format(ev.date_to.astimezone(tz), 'TIME_FORMAT') time += ' ' + date_format(ev.date_to.astimezone(tz), 'TIME_FORMAT')
@@ -607,7 +607,7 @@ class WidgetAPIProductList(EventListMixin, View):
data['events'] = [] data['events'] = []
qs = self._get_event_queryset() qs = self._get_event_queryset()
for event in qs: for event in qs:
tz = ZoneInfo(event.cache.get_or_set('timezone', lambda: event.settings.timezone)) tz = pytz.timezone(event.cache.get_or_set('timezone', lambda: event.settings.timezone))
if event.has_subevents: if event.has_subevents:
dr = daterange( dr = daterange(
event.min_from.astimezone(tz), event.min_from.astimezone(tz),
-1
View File
@@ -217,7 +217,6 @@ setup(
'python-dateutil==2.8.*', 'python-dateutil==2.8.*',
'python-u2flib-server==4.*', 'python-u2flib-server==4.*',
'pytz', 'pytz',
'pytz-deprecation-shim==0.1.*',
'pyuca', 'pyuca',
'redis==4.4.*', 'redis==4.4.*',
'reportlab==3.6.*', 'reportlab==3.6.*',
+7 -6
View File
@@ -32,12 +32,13 @@
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License. # License for the specific language governing permissions and limitations under the License.
from datetime import datetime, timezone from datetime import datetime
import pytest import pytest
from django.test import utils from django.test import utils
from django.utils.timezone import now from django.utils.timezone import now
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from rest_framework.test import APIClient from rest_framework.test import APIClient
from pretix.base.models import Device, Event, Organizer, Team, User from pretix.base.models import Device, Event, Organizer, Team, User
@@ -66,7 +67,7 @@ def meta_prop(organizer):
def event(organizer, meta_prop): def event(organizer, meta_prop):
e = Event.objects.create( e = Event.objects.create(
organizer=organizer, name='Dummy', slug='dummy', organizer=organizer, name='Dummy', slug='dummy',
date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc), date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC),
plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf', plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf',
is_public=True is_public=True
) )
@@ -81,7 +82,7 @@ def event(organizer, meta_prop):
def event2(organizer, meta_prop): def event2(organizer, meta_prop):
e = Event.objects.create( e = Event.objects.create(
organizer=organizer, name='Dummy2', slug='dummy2', organizer=organizer, name='Dummy2', slug='dummy2',
date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc), date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC),
plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf' plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf'
) )
e.meta_values.create(property=meta_prop, value="Conference") e.meta_values.create(property=meta_prop, value="Conference")
@@ -93,7 +94,7 @@ def event2(organizer, meta_prop):
def event3(organizer, meta_prop): def event3(organizer, meta_prop):
e = Event.objects.create( e = Event.objects.create(
organizer=organizer, name='Dummy3', slug='dummy3', organizer=organizer, name='Dummy3', slug='dummy3',
date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc), date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC),
plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf' plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf'
) )
e.meta_values.create(property=meta_prop, value="Conference") e.meta_values.create(property=meta_prop, value="Conference")
@@ -171,7 +172,7 @@ def device_client(client, device):
def subevent(event, meta_prop): def subevent(event, meta_prop):
event.has_subevents = True event.has_subevents = True
event.save() event.save()
se = event.subevents.create(name="Foobar", date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc)) se = event.subevents.create(name="Foobar", date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
se.meta_values.create(property=meta_prop, value="Workshop") se.meta_values.create(property=meta_prop, value="Workshop")
return se return se
@@ -182,7 +183,7 @@ def subevent(event, meta_prop):
def subevent2(event2, meta_prop): def subevent2(event2, meta_prop):
event2.has_subevents = True event2.has_subevents = True
event2.save() event2.save()
se = event2.subevents.create(name="Foobar", date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc)) se = event2.subevents.create(name="Foobar", date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
se.meta_values.create(property=meta_prop, value="Workshop") se.meta_values.create(property=meta_prop, value="Workshop")
return se return se
+15 -14
View File
@@ -28,6 +28,7 @@ import pytest
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.utils.timezone import now from django.utils.timezone import now
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from tests.const import SAMPLE_PNG from tests.const import SAMPLE_PNG
from pretix.base.models import Question, SeatingPlan from pretix.base.models import Question, SeatingPlan
@@ -94,15 +95,15 @@ TEST_CARTPOSITION_RES = {
@pytest.mark.django_db @pytest.mark.django_db
def test_cp_list(token_client, organizer, event, item, taxrule, question): def test_cp_list(token_client, organizer, event, item, taxrule, question):
testtime = datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc) testtime = datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
cr = CartPosition.objects.create( cr = CartPosition.objects.create(
event=event, cart_id="aaa", item=item, event=event, cart_id="aaa", item=item,
price=23, attendee_name_parts={'full_name': 'Peter'}, price=23, attendee_name_parts={'full_name': 'Peter'},
datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc), datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC),
expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc) expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC)
) )
res = dict(TEST_CARTPOSITION_RES) res = dict(TEST_CARTPOSITION_RES)
res["id"] = cr.pk res["id"] = cr.pk
@@ -115,15 +116,15 @@ def test_cp_list(token_client, organizer, event, item, taxrule, question):
@pytest.mark.django_db @pytest.mark.django_db
def test_cp_list_api(token_client, organizer, event, item, taxrule, question): def test_cp_list_api(token_client, organizer, event, item, taxrule, question):
testtime = datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc) testtime = datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
cr = CartPosition.objects.create( cr = CartPosition.objects.create(
event=event, cart_id="aaa@api", item=item, event=event, cart_id="aaa@api", item=item,
price=23, attendee_name_parts={'full_name': 'Peter'}, price=23, attendee_name_parts={'full_name': 'Peter'},
datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc), datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC),
expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc) expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC)
) )
res = dict(TEST_CARTPOSITION_RES) res = dict(TEST_CARTPOSITION_RES)
res["id"] = cr.pk res["id"] = cr.pk
@@ -136,15 +137,15 @@ def test_cp_list_api(token_client, organizer, event, item, taxrule, question):
@pytest.mark.django_db @pytest.mark.django_db
def test_cp_detail(token_client, organizer, event, item, taxrule, question): def test_cp_detail(token_client, organizer, event, item, taxrule, question):
testtime = datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc) testtime = datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
cr = CartPosition.objects.create( cr = CartPosition.objects.create(
event=event, cart_id="aaa@api", item=item, event=event, cart_id="aaa@api", item=item,
price=23, attendee_name_parts={'full_name': 'Peter'}, price=23, attendee_name_parts={'full_name': 'Peter'},
datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc), datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC),
expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc) expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC)
) )
res = dict(TEST_CARTPOSITION_RES) res = dict(TEST_CARTPOSITION_RES)
res["id"] = cr.pk res["id"] = cr.pk
@@ -157,21 +158,21 @@ def test_cp_detail(token_client, organizer, event, item, taxrule, question):
@pytest.mark.django_db @pytest.mark.django_db
def test_cp_delete(token_client, organizer, event, item, taxrule, question): def test_cp_delete(token_client, organizer, event, item, taxrule, question):
testtime = datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc) testtime = datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
cr = CartPosition.objects.create( cr = CartPosition.objects.create(
event=event, cart_id="aaa@api", item=item, event=event, cart_id="aaa@api", item=item,
price=23, attendee_name_parts={'full_name': 'Peter'}, price=23, attendee_name_parts={'full_name': 'Peter'},
datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc), datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC),
expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc) expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC)
) )
CartPosition.objects.create( CartPosition.objects.create(
event=event, cart_id="aaa@api", item=item, addon_to=cr, event=event, cart_id="aaa@api", item=item, addon_to=cr,
price=23, attendee_name_parts={'full_name': 'Peter'}, price=23, attendee_name_parts={'full_name': 'Peter'},
datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc), datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC),
expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=datetime.timezone.utc) expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0, tzinfo=UTC)
) )
res = dict(TEST_CARTPOSITION_RES) res = dict(TEST_CARTPOSITION_RES)
res["id"] = cr.pk res["id"] = cr.pk
+6 -5
View File
@@ -31,6 +31,7 @@ from django.utils.timezone import now
from django_countries.fields import Country from django_countries.fields import Country
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from i18nfield.strings import LazyI18nString from i18nfield.strings import LazyI18nString
from pytz import UTC
from tests.const import SAMPLE_PNG from tests.const import SAMPLE_PNG
from pretix.api.serializers.item import QuestionSerializer from pretix.api.serializers.item import QuestionSerializer
@@ -56,15 +57,15 @@ def other_item(event):
@pytest.fixture @pytest.fixture
def order(event, item, other_item, taxrule): def order(event, item, other_item, taxrule):
testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc) testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
o = Order.objects.create( o = Order.objects.create(
code='FOO', event=event, email='dummy@dummy.test', code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PAID, secret="k24fiuwvu8kxz3y1", status=Order.STATUS_PAID, secret="k24fiuwvu8kxz3y1",
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc), datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC),
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc), expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=UTC),
total=46, locale='en' total=46, locale='en'
) )
InvoiceAddress.objects.create(order=o, company="Sample company", country=Country('NZ')) InvoiceAddress.objects.create(order=o, company="Sample company", country=Country('NZ'))
@@ -248,7 +249,7 @@ def test_list_list(token_client, organizer, event, clist, item, subevent, django
'/api/v1/organizers/{}/events/{}/checkinlists/?subevent_match={}'.format(organizer.slug, event.slug, subevent.pk)) '/api/v1/organizers/{}/events/{}/checkinlists/?subevent_match={}'.format(organizer.slug, event.slug, subevent.pk))
assert [res] == resp.data['results'] assert [res] == resp.data['results']
with scopes_disabled(): with scopes_disabled():
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=datetime.timezone.utc)) se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
resp = token_client.get( resp = token_client.get(
'/api/v1/organizers/{}/events/{}/checkinlists/?subevent={}'.format(organizer.slug, event.slug, se2.pk)) '/api/v1/organizers/{}/events/{}/checkinlists/?subevent={}'.format(organizer.slug, event.slug, se2.pk))
assert [] == resp.data['results'] assert [] == resp.data['results']
@@ -567,7 +568,7 @@ def test_list_all_items_positions(token_client, organizer, event, clist, clist_a
@pytest.mark.django_db @pytest.mark.django_db
def test_list_all_items_positions_by_subevent(token_client, organizer, event, clist, clist_all, item, other_item, order, subevent): def test_list_all_items_positions_by_subevent(token_client, organizer, event, clist, clist_all, item, other_item, order, subevent):
with scopes_disabled(): with scopes_disabled():
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=datetime.timezone.utc)) se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
pfirst = order.positions.get(positionid=1) pfirst = order.positions.get(positionid=1)
pfirst.subevent = se2 pfirst.subevent = se2
pfirst.save() pfirst.save()
+7 -6
View File
@@ -29,6 +29,7 @@ from django.utils.timezone import now
from django_countries.fields import Country from django_countries.fields import Country
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from i18nfield.strings import LazyI18nString from i18nfield.strings import LazyI18nString
from pytz import UTC
from tests.const import SAMPLE_PNG from tests.const import SAMPLE_PNG
from pretix.api.serializers.item import QuestionSerializer from pretix.api.serializers.item import QuestionSerializer
@@ -56,15 +57,15 @@ def other_item(event):
@pytest.fixture @pytest.fixture
def order(event, item, other_item, taxrule): def order(event, item, other_item, taxrule):
testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc) testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
o = Order.objects.create( o = Order.objects.create(
code='FOO', event=event, email='dummy@dummy.test', code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PAID, secret="k24fiuwvu8kxz3y1", status=Order.STATUS_PAID, secret="k24fiuwvu8kxz3y1",
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc), datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC),
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc), expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=UTC),
total=46, locale='en' total=46, locale='en'
) )
InvoiceAddress.objects.create(order=o, company="Sample company", country=Country('NZ')) InvoiceAddress.objects.create(order=o, company="Sample company", country=Country('NZ'))
@@ -103,15 +104,15 @@ def order(event, item, other_item, taxrule):
@pytest.fixture @pytest.fixture
def order2(event2, item_on_event2): def order2(event2, item_on_event2):
testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc) testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
o = Order.objects.create( o = Order.objects.create(
code='BAR', event=event2, email='dummy@dummy.test', code='BAR', event=event2, email='dummy@dummy.test',
status=Order.STATUS_PAID, secret="ylptCPNOxTyA", status=Order.STATUS_PAID, secret="ylptCPNOxTyA",
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc), datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC),
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc), expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=UTC),
total=46, locale='en' total=46, locale='en'
) )
InvoiceAddress.objects.create(order=o, company="Sample company", country=Country('NZ')) InvoiceAddress.objects.create(order=o, company="Sample company", country=Country('NZ'))
+24 -24
View File
@@ -20,13 +20,13 @@
# <https://www.gnu.org/licenses/>. # <https://www.gnu.org/licenses/>.
# #
from datetime import datetime from datetime import datetime
from zoneinfo import ZoneInfo
import pytest import pytest
import pytz
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from freezegun import freeze_time from freezegun import freeze_time
tz = ZoneInfo("Asia/Tokyo") tz = pytz.timezone("Asia/Tokyo")
@pytest.mark.django_db @pytest.mark.django_db
@@ -40,22 +40,22 @@ def test_choose_between_events(device_client, device):
with scopes_disabled(): with scopes_disabled():
e1 = device.organizer.events.create( e1 = device.organizer.events.create(
name="Event", slug="e1", live=True, name="Event", slug="e1", live=True,
date_from=datetime(2020, 1, 10, 14, 0, tzinfo=tz), date_from=tz.localize(datetime(2020, 1, 10, 14, 0)),
date_to=datetime(2020, 1, 10, 15, 0, tzinfo=tz), date_to=tz.localize(datetime(2020, 1, 10, 15, 0)),
) )
cl1 = e1.checkin_lists.create(name="Same name") cl1 = e1.checkin_lists.create(name="Same name")
e2 = device.organizer.events.create( e2 = device.organizer.events.create(
name="Event", slug="e2", live=True, name="Event", slug="e2", live=True,
date_from=datetime(2020, 1, 10, 16, 0, tzinfo=tz), date_from=tz.localize(datetime(2020, 1, 10, 16, 0)),
date_to=datetime(2020, 1, 10, 17, 0, tzinfo=tz), date_to=tz.localize(datetime(2020, 1, 10, 17, 0)),
) )
e2.checkin_lists.create(name="Other name") e2.checkin_lists.create(name="Other name")
cl2 = e2.checkin_lists.create(name="Same name") cl2 = e2.checkin_lists.create(name="Same name")
e2.checkin_lists.create(name="Yet another name") e2.checkin_lists.create(name="Yet another name")
tomorrow = device.organizer.events.create( tomorrow = device.organizer.events.create(
name="Event", slug="tomorrow", live=True, name="Event", slug="tomorrow", live=True,
date_from=datetime(2020, 1, 11, 15, 0, tzinfo=tz), date_from=tz.localize(datetime(2020, 1, 11, 15, 0)),
date_to=datetime(2020, 1, 11, 16, 0, tzinfo=tz), date_to=tz.localize(datetime(2020, 1, 11, 16, 0)),
) )
cl3 = tomorrow.checkin_lists.create(name="Just any name") cl3 = tomorrow.checkin_lists.create(name="Just any name")
for e in device.organizer.events.all(): for e in device.organizer.events.all():
@@ -117,7 +117,7 @@ def test_choose_between_events(device_client, device):
assert resp.data['event']['slug'] == 'e2' assert resp.data['event']['slug'] == 'e2'
# check for overlapping events # check for overlapping events
e2.date_admission = datetime(2020, 1, 10, 14, 45, tzinfo=tz) e2.date_admission = tz.localize(datetime(2020, 1, 10, 14, 45))
e2.save() e2.save()
with freeze_time("2020-01-10T14:45:00+09:00"): with freeze_time("2020-01-10T14:45:00+09:00"):
resp = device_client.get('/api/v1/device/eventselection?current_event=e1') resp = device_client.get('/api/v1/device/eventselection?current_event=e1')
@@ -131,28 +131,28 @@ def test_choose_between_subevents(device_client, device):
with scopes_disabled(): with scopes_disabled():
e = device.organizer.events.create( e = device.organizer.events.create(
name="Event", slug="e1", live=True, name="Event", slug="e1", live=True,
date_from=datetime(2020, 1, 10, 14, 0, tzinfo=tz), date_from=tz.localize(datetime(2020, 1, 10, 14, 0)),
has_subevents=True, has_subevents=True,
) )
e.settings.timezone = "Asia/Tokyo" e.settings.timezone = "Asia/Tokyo"
se1 = e.subevents.create( se1 = e.subevents.create(
name="Event", active=True, name="Event", active=True,
date_from=datetime(2020, 1, 10, 14, 0, tzinfo=tz), date_from=tz.localize(datetime(2020, 1, 10, 14, 0)),
date_to=datetime(2020, 1, 10, 15, 0, tzinfo=tz), date_to=tz.localize(datetime(2020, 1, 10, 15, 0)),
) )
cl1 = e.checkin_lists.create(name="Same name", subevent=se1) cl1 = e.checkin_lists.create(name="Same name", subevent=se1)
se2 = e.subevents.create( se2 = e.subevents.create(
name="Event", active=True, name="Event", active=True,
date_from=datetime(2020, 1, 10, 16, 0, tzinfo=tz), date_from=tz.localize(datetime(2020, 1, 10, 16, 0)),
date_to=datetime(2020, 1, 10, 17, 0, tzinfo=tz), date_to=tz.localize(datetime(2020, 1, 10, 17, 0)),
) )
cl2 = e.checkin_lists.create(name="Same name", subevent=se2) cl2 = e.checkin_lists.create(name="Same name", subevent=se2)
cl3 = e.checkin_lists.create(name="Other name") cl3 = e.checkin_lists.create(name="Other name")
e.checkin_lists.create(name="Yet another name", subevent=se2) e.checkin_lists.create(name="Yet another name", subevent=se2)
se_tomorrow = e.subevents.create( se_tomorrow = e.subevents.create(
name="Event", active=True, name="Event", active=True,
date_from=datetime(2020, 1, 11, 15, 0, tzinfo=tz), date_from=tz.localize(datetime(2020, 1, 11, 15, 0)),
date_to=datetime(2020, 1, 11, 16, 0, tzinfo=tz), date_to=tz.localize(datetime(2020, 1, 11, 16, 0)),
) )
with freeze_time("2020-01-10T14:30:00+09:00"): with freeze_time("2020-01-10T14:30:00+09:00"):
resp = device_client.get(f'/api/v1/device/eventselection?current_event=e1&current_subevent={se1.pk}') resp = device_client.get(f'/api/v1/device/eventselection?current_event=e1&current_subevent={se1.pk}')
@@ -217,7 +217,7 @@ def test_choose_between_subevents(device_client, device):
assert resp.data['subevent'] == se2.pk assert resp.data['subevent'] == se2.pk
# check for overlapping events # check for overlapping events
se2.date_admission = datetime(2020, 1, 10, 14, 45, tzinfo=tz) se2.date_admission = tz.localize(datetime(2020, 1, 10, 14, 45))
se2.save() se2.save()
with freeze_time("2020-01-10T14:45:00+09:00"): with freeze_time("2020-01-10T14:45:00+09:00"):
resp = device_client.get(f'/api/v1/device/eventselection?current_event=e1&current_subevent={se1.pk}') resp = device_client.get(f'/api/v1/device/eventselection?current_event=e1&current_subevent={se1.pk}')
@@ -234,25 +234,25 @@ def test_require_gate(device_client, device):
device.save() device.save()
e = device.organizer.events.create( e = device.organizer.events.create(
name="Event", slug="e1", live=True, name="Event", slug="e1", live=True,
date_from=datetime(2020, 1, 10, 14, 0, tzinfo=tz), date_from=tz.localize(datetime(2020, 1, 10, 14, 0)),
has_subevents=True, has_subevents=True,
) )
e.settings.timezone = "Asia/Tokyo" e.settings.timezone = "Asia/Tokyo"
se0 = e.subevents.create( se0 = e.subevents.create(
name="Event", active=True, name="Event", active=True,
date_from=datetime(2020, 1, 10, 9, 0, tzinfo=tz), date_from=tz.localize(datetime(2020, 1, 10, 9, 0)),
date_to=datetime(2020, 1, 10, 10, 0, tzinfo=tz), date_to=tz.localize(datetime(2020, 1, 10, 10, 0)),
) )
e.subevents.create( e.subevents.create(
name="Event", active=True, name="Event", active=True,
date_from=datetime(2020, 1, 10, 14, 0, tzinfo=tz), date_from=tz.localize(datetime(2020, 1, 10, 14, 0)),
date_to=datetime(2020, 1, 10, 15, 0, tzinfo=tz), date_to=tz.localize(datetime(2020, 1, 10, 15, 0)),
) )
cl1 = e.checkin_lists.create(name="Same name", subevent=se0) cl1 = e.checkin_lists.create(name="Same name", subevent=se0)
se2 = e.subevents.create( se2 = e.subevents.create(
name="Event", active=True, name="Event", active=True,
date_from=datetime(2020, 1, 10, 16, 0, tzinfo=tz), date_from=tz.localize(datetime(2020, 1, 10, 16, 0)),
date_to=datetime(2020, 1, 10, 17, 0, tzinfo=tz), date_to=tz.localize(datetime(2020, 1, 10, 17, 0)),
) )
e.checkin_lists.create(name="Same name", subevent=se2) e.checkin_lists.create(name="Same name", subevent=se2)
cl3 = e.checkin_lists.create(name="Other name", subevent=se2) cl3 = e.checkin_lists.create(name="Other name", subevent=se2)
+5 -4
View File
@@ -33,7 +33,7 @@
# License for the specific language governing permissions and limitations under the License. # License for the specific language governing permissions and limitations under the License.
import copy import copy
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta
from decimal import Decimal from decimal import Decimal
from unittest import mock from unittest import mock
@@ -43,6 +43,7 @@ from django.core.files.base import ContentFile
from django.utils.timezone import now from django.utils.timezone import now
from django_countries.fields import Country from django_countries.fields import Country
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from tests.const import SAMPLE_PNG from tests.const import SAMPLE_PNG
from pretix.base.models import ( from pretix.base.models import (
@@ -62,15 +63,15 @@ def variations(item):
@pytest.fixture @pytest.fixture
def order(event, item, taxrule): def order(event, item, taxrule):
testtime = datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.utc) testtime = datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
o = Order.objects.create( o = Order.objects.create(
code='FOO', event=event, email='dummy@dummy.test', code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1", status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
datetime=datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.utc), datetime=datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC),
expires=datetime(2017, 12, 10, 10, 0, 0, tzinfo=timezone.utc), expires=datetime(2017, 12, 10, 10, 0, 0, tzinfo=UTC),
total=23, locale='en' total=23, locale='en'
) )
o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'), o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'),
+5 -4
View File
@@ -27,6 +27,7 @@ import freezegun
import pytest import pytest
from django_countries.fields import Country from django_countries.fields import Country
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.models import InvoiceAddress, Order, OrderPosition from pretix.base.models import InvoiceAddress, Order, OrderPosition
from pretix.base.models.orders import OrderFee from pretix.base.models.orders import OrderFee
@@ -74,7 +75,7 @@ def quota(event, item):
@pytest.fixture @pytest.fixture
def order(event, item, taxrule, question): def order(event, item, taxrule, question):
testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc) testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
event.plugins += ",pretix.plugins.stripe" event.plugins += ",pretix.plugins.stripe"
event.save() event.save()
@@ -83,8 +84,8 @@ def order(event, item, taxrule, question):
o = Order.objects.create( o = Order.objects.create(
code='FOO', event=event, email='dummy@dummy.test', code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1", status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc), datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC),
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc), expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=UTC),
total=23, locale='en' total=23, locale='en'
) )
p1 = o.payments.create( p1 = o.payments.create(
@@ -139,7 +140,7 @@ def order(event, item, taxrule, question):
@pytest.fixture @pytest.fixture
def invoice(order): def invoice(order):
testtime = datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc) testtime = datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
+7 -6
View File
@@ -33,7 +33,7 @@
# License for the specific language governing permissions and limitations under the License. # License for the specific language governing permissions and limitations under the License.
import os import os
import time import time
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta
from decimal import Decimal from decimal import Decimal
from unittest import mock from unittest import mock
@@ -42,6 +42,7 @@ from django.conf import settings
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django_countries.fields import Country from django_countries.fields import Country
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from tests.const import SAMPLE_PNG from tests.const import SAMPLE_PNG
from pretix.base.channels import get_all_sales_channels from pretix.base.channels import get_all_sales_channels
@@ -72,15 +73,15 @@ def category3(event, item):
@pytest.fixture @pytest.fixture
def order(event, item, taxrule): def order(event, item, taxrule):
testtime = datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.utc) testtime = datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
o = Order.objects.create( o = Order.objects.create(
code='FOO', event=event, email='dummy@dummy.test', code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1", status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
datetime=datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.utc), datetime=datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC),
expires=datetime(2017, 12, 10, 10, 0, 0, tzinfo=timezone.utc), expires=datetime(2017, 12, 10, 10, 0, 0, tzinfo=UTC),
total=23, locale='en' total=23, locale='en'
) )
o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'), o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'),
@@ -107,7 +108,7 @@ def order_position(item, order, taxrule, variations):
@pytest.fixture @pytest.fixture
def cart_position(event, item, variations): def cart_position(event, item, variations):
testtime = datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.utc) testtime = datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
@@ -1770,7 +1771,7 @@ def test_quota_list(token_client, organizer, event, quota, item, subevent):
'/api/v1/organizers/{}/events/{}/quotas/?subevent={}'.format(organizer.slug, event.slug, subevent.pk)) '/api/v1/organizers/{}/events/{}/quotas/?subevent={}'.format(organizer.slug, event.slug, subevent.pk))
assert [res] == resp.data['results'] assert [res] == resp.data['results']
with scopes_disabled(): with scopes_disabled():
se2 = event.subevents.create(name="Foobar", date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc)) se2 = event.subevents.create(name="Foobar", date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
resp = token_client.get( resp = token_client.get(
'/api/v1/organizers/{}/events/{}/quotas/?subevent={}'.format(organizer.slug, event.slug, se2.pk)) '/api/v1/organizers/{}/events/{}/quotas/?subevent={}'.format(organizer.slug, event.slug, se2.pk))
assert [] == resp.data['results'] assert [] == resp.data['results']
+4 -3
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 # 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/>. # <https://www.gnu.org/licenses/>.
# #
from datetime import datetime, timezone from datetime import datetime
import pytest import pytest
import pytz
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from i18nfield.strings import LazyI18nString from i18nfield.strings import LazyI18nString
@@ -53,8 +54,8 @@ def customer(organizer):
def membership(organizer, customer, membershiptype): def membership(organizer, customer, membershiptype):
return customer.memberships.create( return customer.memberships.create(
membership_type=membershiptype, membership_type=membershiptype,
date_start=datetime(2021, 4, 1, 0, 0, 0, 0, tzinfo=timezone.utc), date_start=datetime(2021, 4, 1, 0, 0, 0, 0, tzinfo=pytz.UTC),
date_end=datetime(2021, 4, 8, 23, 59, 59, 999999, tzinfo=timezone.utc), date_end=datetime(2021, 4, 8, 23, 59, 59, 999999, tzinfo=pytz.UTC),
attendee_name_parts={ attendee_name_parts={
"_scheme": "given_family", "_scheme": "given_family",
'given_name': 'John', 'given_name': 'John',
+9 -8
View File
@@ -30,6 +30,7 @@ from django.core.files.base import ContentFile
from django.utils.timezone import now from django.utils.timezone import now
from django_countries.fields import Country from django_countries.fields import Country
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from tests.const import SAMPLE_PNG from tests.const import SAMPLE_PNG
from pretix.base.models import ( from pretix.base.models import (
@@ -89,7 +90,7 @@ def seat(event, organizer, item):
@pytest.fixture @pytest.fixture
def order(event, item, taxrule, question): def order(event, item, taxrule, question):
testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc) testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
event.plugins += ",pretix.plugins.stripe" event.plugins += ",pretix.plugins.stripe"
event.save() event.save()
@@ -98,8 +99,8 @@ def order(event, item, taxrule, question):
o = Order.objects.create( o = Order.objects.create(
code='FOO', event=event, email='dummy@dummy.test', code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1", status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc), datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC),
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc), expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=UTC),
total=23, locale='en' total=23, locale='en'
) )
p1 = o.payments.create( p1 = o.payments.create(
@@ -658,7 +659,7 @@ def test_orderposition_price_calculation_subevent(token_client, organizer, event
def test_orderposition_price_calculation_subevent_with_override(token_client, organizer, event, order, subevent): def test_orderposition_price_calculation_subevent_with_override(token_client, organizer, event, order, subevent):
with scopes_disabled(): with scopes_disabled():
item2 = event.items.create(name="Budget Ticket", default_price=23) item2 = event.items.create(name="Budget Ticket", default_price=23)
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=datetime.timezone.utc)) se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
se2.subeventitem_set.create(item=item2, price=12) se2.subeventitem_set.create(item=item2, price=12)
op = order.positions.first() op = order.positions.first()
op.subevent = subevent op.subevent = subevent
@@ -1200,7 +1201,7 @@ def test_position_update_change_item_variation_mismatch(token_client, organizer,
@pytest.mark.django_db @pytest.mark.django_db
def test_position_update_change_subevent(token_client, organizer, event, order, quota, item, subevent): def test_position_update_change_subevent(token_client, organizer, event, order, quota, item, subevent):
with scopes_disabled(): with scopes_disabled():
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=datetime.timezone.utc)) se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
q2 = se2.quotas.create(name="foo", size=1, event=event) q2 = se2.quotas.create(name="foo", size=1, event=event)
q2.items.add(item) q2.items.add(item)
op = order.positions.first() op = order.positions.first()
@@ -1222,7 +1223,7 @@ def test_position_update_change_subevent(token_client, organizer, event, order,
@pytest.mark.django_db @pytest.mark.django_db
def test_position_update_change_subevent_quota_empty(token_client, organizer, event, order, quota, item, subevent): def test_position_update_change_subevent_quota_empty(token_client, organizer, event, order, quota, item, subevent):
with scopes_disabled(): with scopes_disabled():
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=datetime.timezone.utc)) se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
q2 = se2.quotas.create(name="foo", size=0, event=event) q2 = se2.quotas.create(name="foo", size=0, event=event)
q2.items.add(item) q2.items.add(item)
op = order.positions.first() op = order.positions.first()
@@ -1303,7 +1304,7 @@ def test_position_update_change_subevent_keep_seat(token_client, organizer, even
with scopes_disabled(): with scopes_disabled():
seat.subevent = subevent seat.subevent = subevent
seat.save() seat.save()
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=datetime.timezone.utc)) se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
seat2 = event.seats.create(seat_number="A1", product=item, seat_guid="A1", subevent=se2) seat2 = event.seats.create(seat_number="A1", product=item, seat_guid="A1", subevent=se2)
q2 = se2.quotas.create(name="foo", size=1, event=event) q2 = se2.quotas.create(name="foo", size=1, event=event)
q2.items.add(item) q2.items.add(item)
@@ -1330,7 +1331,7 @@ def test_position_update_change_subevent_missing_seat(token_client, organizer, e
with scopes_disabled(): with scopes_disabled():
seat.subevent = subevent seat.subevent = subevent
seat.save() seat.save()
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=datetime.timezone.utc)) se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
q2 = se2.quotas.create(name="foo", size=1, event=event) q2 = se2.quotas.create(name="foo", size=1, event=event)
q2.items.add(item) q2.items.add(item)
op = order.positions.first() op = order.positions.first()
+4 -3
View File
@@ -31,6 +31,7 @@ from django.core.files.base import ContentFile
from django.utils.timezone import now from django.utils.timezone import now
from django_countries.fields import Country from django_countries.fields import Country
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from tests.const import SAMPLE_PNG from tests.const import SAMPLE_PNG
from pretix.base.models import ( from pretix.base.models import (
@@ -78,7 +79,7 @@ def quota(event, item):
@pytest.fixture @pytest.fixture
def order(event, item, taxrule, question): def order(event, item, taxrule, question):
testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc) testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
event.plugins += ",pretix.plugins.stripe" event.plugins += ",pretix.plugins.stripe"
event.save() event.save()
@@ -87,8 +88,8 @@ def order(event, item, taxrule, question):
o = Order.objects.create( o = Order.objects.create(
code='FOO', event=event, email='dummy@dummy.test', code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1", status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc), datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC),
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc), expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=UTC),
total=23, locale='en' total=23, locale='en'
) )
p1 = o.payments.create( p1 = o.payments.create(
+6 -5
View File
@@ -30,6 +30,7 @@ from django.core import mail as djmail
from django.utils.timezone import now from django.utils.timezone import now
from django_countries.fields import Country from django_countries.fields import Country
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from stripe.error import APIConnectionError from stripe.error import APIConnectionError
from tests.plugins.stripe.test_provider import MockedCharge from tests.plugins.stripe.test_provider import MockedCharge
@@ -76,7 +77,7 @@ def quota(event, item):
@pytest.fixture @pytest.fixture
def order(event, item, taxrule, question): def order(event, item, taxrule, question):
testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc) testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
event.plugins += ",pretix.plugins.stripe" event.plugins += ",pretix.plugins.stripe"
event.save() event.save()
@@ -85,8 +86,8 @@ def order(event, item, taxrule, question):
o = Order.objects.create( o = Order.objects.create(
code='FOO', event=event, email='dummy@dummy.test', code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1", status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc), datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC),
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc), expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=UTC),
total=23, locale='en' total=23, locale='en'
) )
p1 = o.payments.create( p1 = o.payments.create(
@@ -927,8 +928,8 @@ def test_orderposition_list(token_client, organizer, event, order, item, subeven
with scopes_disabled(): with scopes_disabled():
cl = event.checkin_lists.create(name="Default") cl = event.checkin_lists.create(name="Default")
c = op.checkins.create(datetime=datetime.datetime(2017, 12, 26, 10, 0, 0, tzinfo=datetime.timezone.utc), list=cl) c = op.checkins.create(datetime=datetime.datetime(2017, 12, 26, 10, 0, 0, tzinfo=UTC), list=cl)
op.checkins.create(datetime=datetime.datetime(2017, 12, 26, 10, 0, 0, tzinfo=datetime.timezone.utc), list=cl, successful=False) op.checkins.create(datetime=datetime.datetime(2017, 12, 26, 10, 0, 0, tzinfo=UTC), list=cl, successful=False)
res['checkins'] = [{ # successful only res['checkins'] = [{ # successful only
'id': c.pk, 'id': c.pk,
'datetime': '2017-12-26T10:00:00Z', 'datetime': '2017-12-26T10:00:00Z',
+4 -3
View File
@@ -34,12 +34,13 @@
import copy import copy
import uuid import uuid
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta
from decimal import Decimal from decimal import Decimal
import pytest import pytest
from django.utils.timezone import now from django.utils.timezone import now
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.models import Order, OrderPosition from pretix.base.models import Order, OrderPosition
@@ -55,8 +56,8 @@ def order(event, item):
o = Order.objects.create( o = Order.objects.create(
code='FOO', event=event, email='dummy@dummy.test', code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1", status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
datetime=datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.utc), datetime=datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC),
expires=datetime(2017, 12, 10, 10, 0, 0, tzinfo=timezone.utc), expires=datetime(2017, 12, 10, 10, 0, 0, tzinfo=UTC),
total=23, locale='en' total=23, locale='en'
) )
OrderPosition.objects.create( OrderPosition.objects.create(
+7 -6
View File
@@ -19,13 +19,14 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see # 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/>. # <https://www.gnu.org/licenses/>.
# #
from datetime import datetime, timezone from datetime import datetime
from decimal import Decimal from decimal import Decimal
from unittest import mock from unittest import mock
import pytest import pytest
from django_countries.fields import Country from django_countries.fields import Country
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.models import ( from pretix.base.models import (
InvoiceAddress, Order, OrderPosition, SeatingPlan, SubEvent, InvoiceAddress, Order, OrderPosition, SeatingPlan, SubEvent,
@@ -51,15 +52,15 @@ def variations2(item2):
@pytest.fixture @pytest.fixture
def order(event, item, taxrule): def order(event, item, taxrule):
testtime = datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.utc) testtime = datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
o = Order.objects.create( o = Order.objects.create(
code='FOO', event=event, email='dummy@dummy.test', code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1", status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
datetime=datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.utc), datetime=datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC),
expires=datetime(2017, 12, 10, 10, 0, 0, tzinfo=timezone.utc), expires=datetime(2017, 12, 10, 10, 0, 0, tzinfo=UTC),
total=23, locale='en' total=23, locale='en'
) )
o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'), o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'),
@@ -343,8 +344,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
assert resp.status_code == 200 assert resp.status_code == 200
with scopes_disabled(): with scopes_disabled():
subevent = event.subevents.get(id=subevent.id) subevent = event.subevents.get(id=subevent.id)
assert subevent.date_from == datetime(2018, 12, 27, 10, 0, tzinfo=timezone.utc) assert subevent.date_from == datetime(2018, 12, 27, 10, 0, tzinfo=UTC)
assert subevent.date_to == datetime(2018, 12, 28, 10, 0, tzinfo=timezone.utc) assert subevent.date_to == datetime(2018, 12, 28, 10, 0, tzinfo=UTC)
resp = token_client.patch( resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk), '/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
+9 -8
View File
@@ -40,6 +40,7 @@ import pytest
from django.utils import timezone from django.utils import timezone
from django.utils.timezone import now from django.utils.timezone import now
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.models import Event, SeatingPlan, Voucher from pretix.base.models import Event, SeatingPlan, Voucher
@@ -248,7 +249,7 @@ def test_voucher_list(token_client, organizer, event, voucher, item, quota, sube
'/api/v1/organizers/{}/events/{}/vouchers/?subevent={}'.format(organizer.slug, event.slug, subevent.pk)) '/api/v1/organizers/{}/events/{}/vouchers/?subevent={}'.format(organizer.slug, event.slug, subevent.pk))
assert [res] == resp.data['results'] assert [res] == resp.data['results']
with scopes_disabled(): with scopes_disabled():
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc)) se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
resp = token_client.get( resp = token_client.get(
'/api/v1/organizers/{}/events/{}/vouchers/?subevent={}'.format(organizer.slug, event.slug, '/api/v1/organizers/{}/events/{}/vouchers/?subevent={}'.format(organizer.slug, event.slug,
se2.pk)) se2.pk))
@@ -610,7 +611,7 @@ def test_change_to_item_of_other_event(token_client, organizer, event, item):
organizer=organizer, organizer=organizer,
name='Dummy2', name='Dummy2',
slug='dummy2', slug='dummy2',
date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc), date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC),
plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf' plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf'
) )
ticket2 = e2.items.create(name='Late-bird ticket', default_price=23) ticket2 = e2.items.create(name='Late-bird ticket', default_price=23)
@@ -1253,8 +1254,8 @@ def test_set_seat_subevent(token_client, organizer, event, seatingplan, seat1, i
with scopes_disabled(): with scopes_disabled():
event.has_subevents = True event.has_subevents = True
event.save() event.save()
se1 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc)) se1 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
se2 = event.subevents.create(name="Baz", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc)) se2 = event.subevents.create(name="Baz", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
seat1 = event.seats.create(seat_number="A1", product=item, seat_guid="A1", subevent=se1) seat1 = event.seats.create(seat_number="A1", product=item, seat_guid="A1", subevent=se1)
event.seats.create(seat_number="A1", product=item, seat_guid="A1", subevent=se2) event.seats.create(seat_number="A1", product=item, seat_guid="A1", subevent=se2)
v = event.vouchers.create(item=item) v = event.vouchers.create(item=item)
@@ -1276,8 +1277,8 @@ def test_set_seat_subevent_required(token_client, organizer, event, seatingplan,
with scopes_disabled(): with scopes_disabled():
event.has_subevents = True event.has_subevents = True
event.save() event.save()
se1 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc)) se1 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
se2 = event.subevents.create(name="Baz", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc)) se2 = event.subevents.create(name="Baz", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
seat1 = event.seats.create(seat_number="A1", product=item, seat_guid="A1", subevent=se1) seat1 = event.seats.create(seat_number="A1", product=item, seat_guid="A1", subevent=se1)
event.seats.create(seat_number="A1", product=item, seat_guid="A1", subevent=se2) event.seats.create(seat_number="A1", product=item, seat_guid="A1", subevent=se2)
event.vouchers.create(item=item, seat=seat1) event.vouchers.create(item=item, seat=seat1)
@@ -1296,8 +1297,8 @@ def test_set_seat_subevent_invalid(token_client, organizer, event, seatingplan,
with scopes_disabled(): with scopes_disabled():
event.has_subevents = True event.has_subevents = True
event.save() event.save()
se1 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc)) se1 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
se2 = event.subevents.create(name="Baz", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc)) se2 = event.subevents.create(name="Baz", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
seat1 = event.seats.create(seat_number="A1", product=item, seat_guid="A1", subevent=se1) seat1 = event.seats.create(seat_number="A1", product=item, seat_guid="A1", subevent=se1)
event.seats.create(seat_number="B1", product=item, seat_guid="B1", subevent=se2) event.seats.create(seat_number="B1", product=item, seat_guid="B1", subevent=se2)
event.vouchers.create(item=item, seat=seat1, subevent=se2) event.vouchers.create(item=item, seat=seat1, subevent=se2)
+3 -2
View File
@@ -25,6 +25,7 @@ from unittest import mock
import pytest import pytest
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.models import WaitingListEntry from pretix.base.models import WaitingListEntry
@@ -43,7 +44,7 @@ def quota(event, item):
@pytest.fixture @pytest.fixture
def wle(event, item): def wle(event, item):
testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.UTC) testtime = datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
@@ -139,7 +140,7 @@ def test_wle_list(token_client, organizer, event, wle, item, subevent):
'/api/v1/organizers/{}/events/{}/waitinglistentries/?subevent={}'.format(organizer.slug, event.slug, subevent.pk)) '/api/v1/organizers/{}/events/{}/waitinglistentries/?subevent={}'.format(organizer.slug, event.slug, subevent.pk))
assert [res] == resp.data['results'] assert [res] == resp.data['results']
with scopes_disabled(): with scopes_disabled():
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=datetime.timezone.UTC)) se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
resp = token_client.get( resp = token_client.get(
'/api/v1/organizers/{}/events/{}/waitinglistentries/?subevent={}'.format(organizer.slug, event.slug, '/api/v1/organizers/{}/events/{}/waitinglistentries/?subevent={}'.format(organizer.slug, event.slug,
se2.pk)) se2.pk))
+5 -4
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 # 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/>. # <https://www.gnu.org/licenses/>.
# #
from datetime import datetime, time, timedelta, timezone from datetime import datetime, time, timedelta
import pytest import pytest
import pytz
from django.core import mail as djmail from django.core import mail as djmail
from django.utils.timezone import now from django.utils.timezone import now
from django_scopes import scope from django_scopes import scope
@@ -38,7 +39,7 @@ def event():
o = Organizer.objects.create(name='Dummy', slug='dummy') o = Organizer.objects.create(name='Dummy', slug='dummy')
event = Event.objects.create( event = Event.objects.create(
organizer=o, name='Dummy', slug='dummy', 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' plugins='pretix.plugins.banktransfer'
) )
o.settings.timezone = "Europe/Berlin" o.settings.timezone = "Europe/Berlin"
@@ -303,7 +304,7 @@ def test_organizer_limited_to_events(event, user, team):
event2 = Event.objects.create( event2 = Event.objects.create(
organizer=event.organizer, name='Dummy', slug='dummy2', 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' plugins='pretix.plugins.banktransfer'
) )
team.all_events = False team.all_events = False
@@ -343,7 +344,7 @@ def test_organizer_ok(event, user, team):
Event.objects.create( Event.objects.create(
organizer=event.organizer, name='Dummy', slug='dummy2', 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' plugins='pretix.plugins.banktransfer'
) )
+25 -25
View File
@@ -21,9 +21,9 @@
# #
from datetime import datetime, timedelta from datetime import datetime, timedelta
from decimal import Decimal from decimal import Decimal
from zoneinfo import ZoneInfo
import pytest import pytest
import pytz
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.timezone import now from django.utils.timezone import now
@@ -42,7 +42,7 @@ from pretix.base.services.orders import (
) )
from pretix.plugins.banktransfer.payment import BankTransfer from pretix.plugins.banktransfer.payment import BankTransfer
TZ = ZoneInfo('Europe/Berlin') TZ = pytz.timezone('Europe/Berlin')
@pytest.fixture(scope='function') @pytest.fixture(scope='function')
@@ -51,9 +51,9 @@ def event():
o.settings.customer_accounts = True o.settings.customer_accounts = True
event = Event.objects.create( event = Event.objects.create(
organizer=o, name='Dummy', slug='dummy', organizer=o, name='Dummy', slug='dummy',
date_from=datetime(2021, 4, 27, 10, 0, 0, 0, tzinfo=TZ), date_from=TZ.localize(datetime(2021, 4, 27, 10, 0, 0, 0)),
date_to=datetime(2021, 4, 28, 10, 0, 0, 0, tzinfo=TZ), date_to=TZ.localize(datetime(2021, 4, 28, 10, 0, 0, 0)),
presale_end=datetime(2221, 4, 28, 10, 0, 0, 0, tzinfo=TZ), presale_end=TZ.localize(datetime(2221, 4, 28, 10, 0, 0, 0)),
plugins='pretix.plugins.banktransfer' plugins='pretix.plugins.banktransfer'
) )
event.settings.timezone = 'Europe/Berlin' event.settings.timezone = 'Europe/Berlin'
@@ -75,8 +75,8 @@ def membership_type(event):
def membership(event, membership_type, customer): def membership(event, membership_type, customer):
return customer.memberships.create( return customer.memberships.create(
membership_type=membership_type, membership_type=membership_type,
date_start=datetime(2021, 4, 1, 0, 0, 0, 0, tzinfo=TZ), date_start=TZ.localize(datetime(2021, 4, 1, 0, 0, 0, 0)),
date_end=datetime(2021, 4, 30, 23, 59, 59, 999999, tzinfo=TZ), date_end=TZ.localize(datetime(2021, 4, 30, 23, 59, 59, 999999)),
) )
@@ -107,7 +107,7 @@ def subevent(event):
event.has_subevents = True event.has_subevents = True
return event.subevents.create( return event.subevents.create(
name='Foo', 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): def test_validity_membership_duration_like_event(event, granting_ticket, membership_type):
granting_ticket.grant_membership_duration_like_event = True granting_ticket.grant_membership_duration_like_event = True
assert membership_validity(granting_ticket, None, event) == ( assert membership_validity(granting_ticket, None, event) == (
datetime(2021, 4, 27, 10, 0, 0, 0, tzinfo=TZ), TZ.localize(datetime(2021, 4, 27, 10, 0, 0, 0)),
datetime(2021, 4, 28, 10, 0, 0, 0, tzinfo=TZ), 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): def test_validity_membership_duration_like_subevent_without_end(event, granting_ticket, subevent, membership_type):
granting_ticket.grant_membership_duration_like_event = True granting_ticket.grant_membership_duration_like_event = True
assert membership_validity(granting_ticket, subevent, event) == ( assert membership_validity(granting_ticket, subevent, event) == (
datetime(2021, 4, 29, 10, 0, 0, 0, tzinfo=TZ), TZ.localize(datetime(2021, 4, 29, 10, 0, 0, 0)),
datetime(2021, 4, 29, 23, 59, 59, 999999, tzinfo=TZ), 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 granting_ticket.grant_membership_duration_days = 3
with freeze_time("2021-04-10T11:00:00+02:00"): with freeze_time("2021-04-10T11:00:00+02:00"):
assert membership_validity(granting_ticket, subevent, event) == ( assert membership_validity(granting_ticket, subevent, event) == (
datetime(2021, 4, 10, 0, 0, 0, 0, tzinfo=TZ), TZ.localize(datetime(2021, 4, 10, 0, 0, 0, 0)),
datetime(2021, 4, 12, 23, 59, 59, 999999, tzinfo=TZ), 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 granting_ticket.grant_membership_duration_months = 1
with freeze_time("2021-02-01T11:00:00+01:00"): with freeze_time("2021-02-01T11:00:00+01:00"):
assert membership_validity(granting_ticket, subevent, event) == ( assert membership_validity(granting_ticket, subevent, event) == (
datetime(2021, 2, 1, 0, 0, 0, 0, tzinfo=TZ), TZ.localize(datetime(2021, 2, 1, 0, 0, 0, 0)),
datetime(2021, 2, 28, 23, 59, 59, 999999, tzinfo=TZ), TZ.localize(datetime(2021, 2, 28, 23, 59, 59, 999999)),
) )
with freeze_time("2021-02-28T11:00:00+01:00"): with freeze_time("2021-02-28T11:00:00+01:00"):
assert membership_validity(granting_ticket, subevent, event) == ( assert membership_validity(granting_ticket, subevent, event) == (
datetime(2021, 2, 28, 0, 0, 0, 0, tzinfo=TZ), TZ.localize(datetime(2021, 2, 28, 0, 0, 0, 0)),
datetime(2021, 3, 27, 23, 59, 59, 999999, tzinfo=TZ), 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 granting_ticket.grant_membership_duration_days = 2
with freeze_time("2021-02-01T11:00:00+01:00"): with freeze_time("2021-02-01T11:00:00+01:00"):
assert membership_validity(granting_ticket, subevent, event) == ( assert membership_validity(granting_ticket, subevent, event) == (
datetime(2021, 2, 1, 0, 0, 0, 0, tzinfo=TZ), TZ.localize(datetime(2021, 2, 1, 0, 0, 0, 0)),
datetime(2021, 3, 2, 23, 59, 59, 999999, tzinfo=TZ), TZ.localize(datetime(2021, 3, 2, 23, 59, 59, 999999)),
) )
with freeze_time("2021-02-28T11:00:00+01:00"): with freeze_time("2021-02-28T11:00:00+01:00"):
assert membership_validity(granting_ticket, subevent, event) == ( assert membership_validity(granting_ticket, subevent, event) == (
datetime(2021, 2, 28, 0, 0, 0, 0, tzinfo=TZ), TZ.localize(datetime(2021, 2, 28, 0, 0, 0, 0)),
datetime(2021, 3, 29, 23, 59, 59, 999999, tzinfo=TZ), 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): def test_validate_membership_parallel(event, customer, membership, subevent, requiring_ticket, membership_type):
se2 = event.subevents.create( se2 = event.subevents.create(
name='Foo', 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 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() m = customer.memberships.get()
assert m.granted_in == order.positions.first() assert m.granted_in == order.positions.first()
assert m.membership_type == granting_ticket.grant_membership_type 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_start == TZ.localize(datetime(2021, 4, 27, 10, 0, 0, 0))
assert m.date_end == datetime(2021, 4, 28, 10, 0, 0, 0, tzinfo=TZ) assert m.date_end == TZ.localize(datetime(2021, 4, 28, 10, 0, 0, 0))
+8 -7
View File
@@ -39,6 +39,7 @@ from datetime import date, timedelta
from decimal import Decimal from decimal import Decimal
import pytest import pytest
import pytz
from dateutil.tz import tzoffset from dateutil.tz import tzoffset
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
@@ -1187,13 +1188,13 @@ class OrderTestCase(BaseQuotaTestCase):
@classscope(attr='o') @classscope(attr='o')
def test_payment_term_last_relative(self): def test_payment_term_last_relative(self):
self.event.settings.set('payment_term_last', date(2017, 5, 3)) 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) 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=datetime.timezone.utc) self.event.date_from = datetime.datetime(2017, 5, 3, 12, 0, 0, tzinfo=pytz.UTC)
self.event.save() self.event.save()
self.event.settings.set('payment_term_last', RelativeDateWrapper( self.event.settings.set('payment_term_last', RelativeDateWrapper(
RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) 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') @classscope(attr='o')
def test_payment_term_last_subevent(self): def test_payment_term_last_subevent(self):
@@ -1218,14 +1219,14 @@ class OrderTestCase(BaseQuotaTestCase):
@classscope(attr='o') @classscope(attr='o')
def test_ticket_download_date_relative(self): 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)) 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=datetime.timezone.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=datetime.timezone.utc) self.event.date_from = datetime.datetime(2017, 5, 3, 12, 0, 0, tzinfo=pytz.UTC)
self.event.save() self.event.save()
self.event.settings.set('ticket_download_date', RelativeDateWrapper( self.event.settings.set('ticket_download_date', RelativeDateWrapper(
RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) 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') @classscope(attr='o')
def test_ticket_download_date_subevent(self): def test_ticket_download_date_subevent(self):
+4 -4
View File
@@ -22,9 +22,9 @@
import json import json
from datetime import datetime, timedelta from datetime import datetime, timedelta
from decimal import Decimal from decimal import Decimal
from zoneinfo import ZoneInfo
import pytest import pytest
import pytz
from django.core import mail as djmail from django.core import mail as djmail
from django.db.models import F, Sum from django.db.models import F, Sum
from django.test import TestCase from django.test import TestCase
@@ -255,9 +255,9 @@ def test_expiry_last_relative_subevents(event):
@pytest.mark.django_db @pytest.mark.django_db
def test_expiry_dst(event): def test_expiry_dst(event):
event.settings.set('timezone', 'Europe/Berlin') event.settings.set('timezone', 'Europe/Berlin')
tz = ZoneInfo('Europe/Berlin') tz = pytz.timezone('Europe/Berlin')
utc = ZoneInfo('UTC') utc = pytz.timezone('UTC')
today = datetime(2016, 10, 29, 12, 0, 0, tzinfo=tz).astimezone(utc) today = tz.localize(datetime(2016, 10, 29, 12, 0, 0)).astimezone(utc)
order = _create_order(event, email='dummy@example.org', positions=[], order = _create_order(event, email='dummy@example.org', positions=[],
now_dt=today, now_dt=today,
payment_requests=[{ payment_requests=[{
+12 -12
View File
@@ -34,9 +34,9 @@
import datetime import datetime
from decimal import Decimal from decimal import Decimal
from zoneinfo import ZoneInfo
import pytest import pytest
import pytz
from django.utils.timezone import now from django.utils.timezone import now
from django_scopes import scope from django_scopes import scope
from tests.testdummy.payment import DummyPaymentProvider from tests.testdummy.payment import DummyPaymentProvider
@@ -112,18 +112,18 @@ def test_availability_date_not_available(event):
@pytest.mark.django_db @pytest.mark.django_db
def test_availability_date_relative(event): def test_availability_date_relative(event):
event.settings.set('timezone', 'US/Pacific') event.settings.set('timezone', 'US/Pacific')
tz = ZoneInfo('US/Pacific') tz = pytz.timezone('US/Pacific')
event.date_from = datetime.datetime(2016, 12, 3, 12, 0, 0, tzinfo=tz) event.date_from = tz.localize(datetime.datetime(2016, 12, 3, 12, 0, 0))
event.save() event.save()
prov = DummyPaymentProvider(event) prov = DummyPaymentProvider(event)
prov.settings.set('_availability_date', RelativeDateWrapper( prov.settings.set('_availability_date', RelativeDateWrapper(
RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None) RelativeDate(days_before=2, time=None, base_date_name='date_from', minutes_before=None)
)) ))
utc = datetime.timezone.utc utc = pytz.timezone('UTC')
assert prov._is_still_available(datetime.datetime(2016, 11, 30, 23, 0, 0, tzinfo=tz).astimezone(utc)) assert prov._is_still_available(tz.localize(datetime.datetime(2016, 11, 30, 23, 0, 0)).astimezone(utc))
assert prov._is_still_available(datetime.datetime(2016, 12, 1, 23, 59, 0, tzinfo=tz).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(datetime.datetime(2016, 12, 2, 0, 0, 1, tzinfo=tz).astimezone(utc)) assert not prov._is_still_available(tz.localize(datetime.datetime(2016, 12, 2, 0, 0, 1)).astimezone(utc))
@pytest.mark.django_db @pytest.mark.django_db
@@ -132,11 +132,11 @@ def test_availability_date_timezones(event):
prov = DummyPaymentProvider(event) prov = DummyPaymentProvider(event)
prov.settings.set('_availability_date', '2016-12-01') prov.settings.set('_availability_date', '2016-12-01')
tz = ZoneInfo('US/Pacific') tz = pytz.timezone('US/Pacific')
utc = ZoneInfo('UTC') utc = pytz.timezone('UTC')
assert prov._is_still_available(datetime.datetime(2016, 11, 30, 23, 0, 0, tzinfo=tz).astimezone(utc)) assert prov._is_still_available(tz.localize(datetime.datetime(2016, 11, 30, 23, 0, 0)).astimezone(utc))
assert prov._is_still_available(datetime.datetime(2016, 12, 1, 23, 59, 0, tzinfo=tz).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(datetime.datetime(2016, 12, 2, 0, 0, 1, tzinfo=tz).astimezone(utc)) assert not prov._is_still_available(tz.localize(datetime.datetime(2016, 12, 2, 0, 0, 1)).astimezone(utc))
@pytest.mark.django_db @pytest.mark.django_db
+20 -20
View File
@@ -20,16 +20,16 @@
# <https://www.gnu.org/licenses/>. # <https://www.gnu.org/licenses/>.
# #
from datetime import datetime, time from datetime import datetime, time
from zoneinfo import ZoneInfo
import pytest import pytest
import pytz
from django_scopes import scope from django_scopes import scope
from pretix.base.models import Event, Organizer from pretix.base.models import Event, Organizer
from pretix.base.reldate import RelativeDate, RelativeDateWrapper from pretix.base.reldate import RelativeDate, RelativeDateWrapper
TOKYO = ZoneInfo('Asia/Tokyo') TOKYO = pytz.timezone('Asia/Tokyo')
BERLIN = ZoneInfo('Europe/Berlin') BERLIN = pytz.timezone('Europe/Berlin')
@pytest.fixture @pytest.fixture
@@ -37,8 +37,8 @@ def event():
o = Organizer.objects.create(name='Dummy', slug='dummy') o = Organizer.objects.create(name='Dummy', slug='dummy')
event = Event.objects.create( event = Event.objects.create(
organizer=o, name='Dummy', slug='dummy', organizer=o, name='Dummy', slug='dummy',
date_from=datetime(2017, 12, 27, 5, 0, 0, tzinfo=TOKYO), date_from=TOKYO.localize(datetime(2017, 12, 27, 5, 0, 0)),
presale_start=datetime(2017, 12, 1, 5, 0, 0, tzinfo=TOKYO), presale_start=TOKYO.localize(datetime(2017, 12, 1, 5, 0, 0)),
plugins='pretix.plugins.banktransfer' plugins='pretix.plugins.banktransfer'
) )
@@ -57,7 +57,7 @@ def test_absolute_date(event):
@pytest.mark.django_db @pytest.mark.django_db
def test_relative_date_without_time(event): def test_relative_date_without_time(event):
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='date_from', minutes_before=None)) 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/' 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): def test_relative_date_other_base_point(event):
with scope(organizer=event.organizer): with scope(organizer=event.organizer):
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_start', minutes_before=None)) 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/' assert rdw.to_string() == 'RELDATE/1/-/presale_start/'
# presale_end is unset, defaults to date_from # presale_end is unset, defaults to date_from
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_end', minutes_before=None)) 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/' assert rdw.to_string() == 'RELDATE/1/-/presale_end/'
# subevent base # 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)) 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 # 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)) 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 # 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)) 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 @pytest.mark.django_db
def test_relative_date_in_minutes(event): def test_relative_date_in_minutes(event):
rdw = RelativeDateWrapper(RelativeDate(days_before=0, time=None, base_date_name='date_from', minutes_before=60)) 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.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 @pytest.mark.django_db
def test_relative_date_with_time(event): 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)) 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.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 @pytest.mark.django_db
def test_relative_date_with_time_around_dst(event): def test_relative_date_with_time_around_dst(event):
event.settings.timezone = "Europe/Berlin" 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)) 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.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)) 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.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)) 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.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)) 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.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(): def test_unserialize():
+3 -3
View File
@@ -21,20 +21,20 @@
# #
from datetime import date, datetime from datetime import date, datetime
from zoneinfo import ZoneInfo
import pytest import pytest
import pytz
from pretix.base.timeframes import ( from pretix.base.timeframes import (
REPORTING_DATE_TIMEFRAMES, resolve_timeframe_to_dates_inclusive, REPORTING_DATE_TIMEFRAMES, resolve_timeframe_to_dates_inclusive,
resolve_timeframe_to_datetime_start_inclusive_end_exclusive, resolve_timeframe_to_datetime_start_inclusive_end_exclusive,
) )
tz = ZoneInfo("Europe/Berlin") tz = pytz.timezone("Europe/Berlin")
def dt(*args): def dt(*args):
return datetime(*args, tzinfo=tz) return tz.localize(datetime(*args))
ref_date = date(2023, 3, 28) ref_date = date(2023, 3, 28)
+2 -2
View File
@@ -21,16 +21,16 @@
# #
from datetime import datetime from datetime import datetime
from decimal import Decimal from decimal import Decimal
from zoneinfo import ZoneInfo
import pytest import pytest
import pytz
from django_scopes import scope from django_scopes import scope
from pretix.base.i18n import language from pretix.base.i18n import language
from pretix.base.models import Event, Organizer from pretix.base.models import Event, Organizer
from pretix.base.timeline import timeline_for_event from pretix.base.timeline import timeline_for_event
tz = ZoneInfo('Europe/Berlin') tz = pytz.timezone('Europe/Berlin')
def one(iterable): def one(iterable):
+19 -18
View File
@@ -37,13 +37,14 @@ import datetime
import time import time
from decimal import Decimal from decimal import Decimal
from smtplib import SMTPResponseException from smtplib import SMTPResponseException
from zoneinfo import ZoneInfo
import pytest import pytest
import pytz
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils.timezone import now from django.utils.timezone import now
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from i18nfield.strings import LazyI18nString from i18nfield.strings import LazyI18nString
from pytz import timezone
from tests.base import SoupTest, extract_form_fields from tests.base import SoupTest, extract_form_fields
from pretix.base.models import Event, LogEntry, Order, Organizer, Team, User from pretix.base.models import Event, LogEntry, Order, Organizer, Team, User
@@ -834,11 +835,11 @@ class EventsTest(SoupTest):
assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'}) assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'})
assert Team.objects.filter(limit_events=ev, members=self.user).exists() assert Team.objects.filter(limit_events=ev, members=self.user).exists()
berlin_tz = ZoneInfo('Europe/Berlin') berlin_tz = timezone('Europe/Berlin')
assert ev.date_from == datetime.datetime(2016, 12, 27, 10, 0, 0, tzinfo=berlin_tz).astimezone(datetime.timezone.utc) assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
assert ev.date_to == datetime.datetime(2016, 12, 30, 19, 0, 0, tzinfo=berlin_tz).astimezone(datetime.timezone.utc) assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
assert ev.presale_start == datetime.datetime(2016, 11, 1, 10, 0, 0, tzinfo=berlin_tz).astimezone(datetime.timezone.utc) assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
assert ev.presale_end == datetime.datetime(2016, 11, 30, 18, 0, 0, tzinfo=berlin_tz).astimezone(datetime.timezone.utc) assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
assert ev.tax_rules.filter(rate=Decimal('19.00')).exists() assert ev.tax_rules.filter(rate=Decimal('19.00')).exists()
@@ -953,11 +954,11 @@ class EventsTest(SoupTest):
assert Team.objects.filter(limit_events=ev, members=self.user).exists() assert Team.objects.filter(limit_events=ev, members=self.user).exists()
assert ev.items.count() == 1 assert ev.items.count() == 1
berlin_tz = ZoneInfo('Europe/Berlin') berlin_tz = timezone('Europe/Berlin')
assert ev.date_from == datetime.datetime(2016, 12, 27, 10, 0, 0, tzinfo=berlin_tz).astimezone(datetime.timezone.utc) assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
assert ev.date_to == datetime.datetime(2016, 12, 30, 19, 0, 0, tzinfo=berlin_tz).astimezone(datetime.timezone.utc) assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
assert ev.presale_start == datetime.datetime(2016, 11, 1, 10, 0, 0, tzinfo=berlin_tz).astimezone(datetime.timezone.utc) assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
assert ev.presale_end == datetime.datetime(2016, 11, 30, 18, 0, 0, tzinfo=berlin_tz).astimezone(datetime.timezone.utc) assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
assert ev.tax_rules.filter(rate=Decimal('19.00')).count() == 1 assert ev.tax_rules.filter(rate=Decimal('19.00')).count() == 1
i = ev.items.get() i = ev.items.get()
@@ -1026,11 +1027,11 @@ class EventsTest(SoupTest):
assert Team.objects.filter(limit_events=ev, members=self.user).exists() assert Team.objects.filter(limit_events=ev, members=self.user).exists()
assert ev.items.count() == 1 assert ev.items.count() == 1
berlin_tz = ZoneInfo('Europe/Berlin') berlin_tz = timezone('Europe/Berlin')
assert ev.date_from == datetime.datetime(2016, 12, 27, 10, 0, 0, tzinfo=berlin_tz).astimezone(datetime.timezone.utc) assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
assert ev.date_to == datetime.datetime(2016, 12, 30, 19, 0, 0, tzinfo=berlin_tz).astimezone(datetime.timezone.utc) assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
assert ev.presale_start == datetime.datetime(2016, 11, 1, 10, 0, 0, tzinfo=berlin_tz).astimezone(datetime.timezone.utc) assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
assert ev.presale_end == datetime.datetime(2016, 11, 30, 18, 0, 0, tzinfo=berlin_tz).astimezone(datetime.timezone.utc) assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
assert ev.tax_rules.filter(rate=Decimal('19.00')).count() == 1 assert ev.tax_rules.filter(rate=Decimal('19.00')).count() == 1
@@ -1078,7 +1079,7 @@ class EventsTest(SoupTest):
assert ev.organizer == self.orga1 assert ev.organizer == self.orga1
assert ev.location == LazyI18nString({'en': 'Hamburg'}) assert ev.location == LazyI18nString({'en': 'Hamburg'})
assert Team.objects.filter(limit_events=ev, members=self.user).exists() assert Team.objects.filter(limit_events=ev, members=self.user).exists()
assert ev.date_from == datetime.datetime(2016, 12, 27, 10, 0, 0, tzinfo=datetime.timezone.utc) assert ev.date_from == datetime.datetime(2016, 12, 27, 10, 0, 0, tzinfo=pytz.utc)
assert ev.date_to is None assert ev.date_to is None
assert ev.presale_start is None assert ev.presale_start is None
assert ev.presale_end is None assert ev.presale_end is None
@@ -1127,7 +1128,7 @@ class EventsTest(SoupTest):
assert ev.location == LazyI18nString({'en': 'Hamburg'}) assert ev.location == LazyI18nString({'en': 'Hamburg'})
team = Team.objects.filter(limit_events=ev, members=self.user).first() team = Team.objects.filter(limit_events=ev, members=self.user).first()
assert team == self.team2 assert team == self.team2
assert ev.date_from == datetime.datetime(2016, 12, 27, 10, 0, 0, tzinfo=datetime.timezone.utc) assert ev.date_from == datetime.datetime(2016, 12, 27, 10, 0, 0, tzinfo=pytz.utc)
assert ev.date_to is None assert ev.date_to is None
assert ev.presale_start is None assert ev.presale_start is None
assert ev.presale_end is None assert ev.presale_end is None
+4 -3
View File
@@ -21,12 +21,13 @@
# #
import copy import copy
import json import json
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta
from unittest import mock from unittest import mock
import pytest import pytest
from django.utils.timezone import now from django.utils.timezone import now
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.models import ( from pretix.base.models import (
Event, Item, Order, OrderPosition, Organizer, Quota, Team, User, Event, Item, Order, OrderPosition, Organizer, Quota, Team, User,
@@ -88,7 +89,7 @@ RES_JOB = {
@pytest.mark.django_db @pytest.mark.django_db
def test_api_list(env, client): def test_api_list(env, client):
testtime = datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.utc) testtime = datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
@@ -108,7 +109,7 @@ def test_api_list(env, client):
@pytest.mark.django_db @pytest.mark.django_db
def test_api_detail(env, client): def test_api_detail(env, client):
testtime = datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.UTC) testtime = datetime(2017, 12, 1, 10, 0, 0, tzinfo=UTC)
with mock.patch('django.utils.timezone.now') as mock_now: with mock.patch('django.utils.timezone.now') as mock_now:
mock_now.return_value = testtime mock_now.return_value = testtime
+9 -9
View File
@@ -21,9 +21,9 @@
# #
import datetime import datetime
from zoneinfo import ZoneInfo
import pytest import pytest
import pytz
from django.core import mail as djmail from django.core import mail as djmail
from django.utils.timezone import now, utc from django.utils.timezone import now, utc
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
@@ -46,8 +46,8 @@ def test_sendmail_rule_create_single(event):
dt_now = now() dt_now = now()
NZ = ZoneInfo('NZ') NZ = pytz.timezone('NZ')
Berlin = ZoneInfo('Europe/Berlin') Berlin = pytz.timezone('Europe/Berlin')
@pytest.mark.django_db @pytest.mark.django_db
@@ -101,28 +101,28 @@ Berlin = ZoneInfo('Europe/Berlin')
datetime.datetime(2020, 2, 29, 9, tzinfo=utc) datetime.datetime(2020, 2, 29, 9, tzinfo=utc)
), ),
( # Test timezone far off from UTC ( # Test timezone far off from UTC
datetime.datetime(2021, 5, 17, 22, tzinfo=NZ), NZ.localize(datetime.datetime(2021, 5, 17, 22)),
None, None,
'NZ', 'NZ',
Rule(date_is_absolute=False, offset_is_after=True, send_offset_days=1, send_offset_time=datetime.time(hour=9)), Rule(date_is_absolute=False, offset_is_after=True, send_offset_days=1, send_offset_time=datetime.time(hour=9)),
datetime.datetime(2021, 5, 18, 9, tzinfo=NZ) NZ.localize(datetime.datetime(2021, 5, 18, 9))
), ),
( # Test across DST change ( # Test across DST change
datetime.datetime(2021, 10, 29, 16, 30, tzinfo=Berlin), Berlin.localize(datetime.datetime(2021, 10, 29, 16, 30)),
None, None,
'Europe/Berlin', 'Europe/Berlin',
Rule(date_is_absolute=False, offset_is_after=True, send_offset_days=4, send_offset_time=datetime.time(hour=2, minute=30)), Rule(date_is_absolute=False, offset_is_after=True, send_offset_days=4, send_offset_time=datetime.time(hour=2, minute=30)),
datetime.datetime(2021, 11, 2, 2, 30, tzinfo=Berlin) Berlin.localize(datetime.datetime(2021, 11, 2, 2, 30))
), ),
( # Test ambiguous time at DST change ( # Test ambiguous time at DST change
datetime.datetime(2021, 10, 29, 18, 30, tzinfo=Berlin), Berlin.localize(datetime.datetime(2021, 10, 29, 18, 30)),
None, None,
'Europe/Berlin', 'Europe/Berlin',
Rule(date_is_absolute=False, offset_is_after=True, send_offset_days=2, send_offset_time=datetime.time(hour=2, minute=30)), Rule(date_is_absolute=False, offset_is_after=True, send_offset_days=2, send_offset_time=datetime.time(hour=2, minute=30)),
datetime.datetime(2021, 10, 31, 1, 30, tzinfo=utc) datetime.datetime(2021, 10, 31, 1, 30, tzinfo=utc)
), ),
( # Test non-existing time at DST change ( # Test non-existing time at DST change
datetime.datetime(2021, 3, 29, 14, 30, tzinfo=Berlin), Berlin.localize(datetime.datetime(2021, 3, 29, 14, 30)),
None, None,
'Europe/Berlin', 'Europe/Berlin',
Rule(date_is_absolute=False, offset_is_after=False, send_offset_days=1, send_offset_time=datetime.time(hour=2, minute=30)), Rule(date_is_absolute=False, offset_is_after=False, send_offset_days=1, send_offset_time=datetime.time(hour=2, minute=30)),
+3 -2
View File
@@ -23,6 +23,7 @@ import datetime
from decimal import Decimal from decimal import Decimal
import pytest import pytest
import pytz
from django.utils.timezone import now from django.utils.timezone import now
from django_scopes import scope from django_scopes import scope
@@ -50,7 +51,7 @@ def event():
order_paid = Order.objects.create( order_paid = Order.objects.create(
code='FOO', event=event, email='dummy@dummy.test', phone="+498912345678", code='FOO', event=event, email='dummy@dummy.test', phone="+498912345678",
status=Order.STATUS_PAID, status=Order.STATUS_PAID,
datetime=datetime.datetime(2019, 2, 22, 14, 0, 0, tzinfo=datetime.timezone.utc), expires=now() + datetime.timedelta(days=10), datetime=datetime.datetime(2019, 2, 22, 14, 0, 0, tzinfo=pytz.UTC), expires=now() + datetime.timedelta(days=10),
total=33, locale='en' total=33, locale='en'
) )
item_ticket = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True) item_ticket = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True)
@@ -146,7 +147,7 @@ def test_csv_order_by_inherited_name_parts(event): # noqa
order2 = Order.objects.create( order2 = Order.objects.create(
code='BAR', event=event, email='dummy@dummy.test', phone='+498912345678', code='BAR', event=event, email='dummy@dummy.test', phone='+498912345678',
status=Order.STATUS_PAID, status=Order.STATUS_PAID,
datetime=datetime.datetime(2019, 2, 22, 14, 0, 0, tzinfo=datetime.timezone.utc), expires=now() + datetime.timedelta(days=10), datetime=datetime.datetime(2019, 2, 22, 14, 0, 0, tzinfo=pytz.UTC), expires=now() + datetime.timedelta(days=10),
total=33, locale='en' total=33, locale='en'
) )
OrderPosition.objects.create( OrderPosition.objects.create(
+4 -4
View File
@@ -37,7 +37,6 @@ import datetime
import re import re
from decimal import Decimal from decimal import Decimal
from json import loads from json import loads
from zoneinfo import ZoneInfo
from django.conf import settings from django.conf import settings
from django.core import mail from django.core import mail
@@ -45,6 +44,7 @@ from django.core.exceptions import ValidationError
from django.test import TestCase from django.test import TestCase
from django.utils.timezone import now from django.utils.timezone import now
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import timezone
from tests.base import SoupTest from tests.base import SoupTest
from tests.testdummy.signals import FoobarSalesChannel from tests.testdummy.signals import FoobarSalesChannel
@@ -1390,11 +1390,11 @@ class EventIcalDownloadTest(EventTestMixin, SoupTest):
fmt = '%Y%m%dT%H%M%S' fmt = '%Y%m%dT%H%M%S'
self.assertIn('DTSTART;TZID=%s:%s' % self.assertIn('DTSTART;TZID=%s:%s' %
(self.event.settings.timezone, (self.event.settings.timezone,
self.event.date_from.astimezone(ZoneInfo(self.event.settings.timezone)).strftime(fmt)), self.event.date_from.astimezone(timezone(self.event.settings.timezone)).strftime(fmt)),
ical, 'incorrect start time') ical, 'incorrect start time')
self.assertIn('DTEND;TZID=%s:%s' % self.assertIn('DTEND;TZID=%s:%s' %
(self.event.settings.timezone, (self.event.settings.timezone,
self.event.date_to.astimezone(ZoneInfo(self.event.settings.timezone)).strftime(fmt)), self.event.date_to.astimezone(timezone(self.event.settings.timezone)).strftime(fmt)),
ical, 'incorrect end time') ical, 'incorrect end time')
self.assertIn('TZID:%s' % self.event.settings.timezone, ical, 'missing VCALENDAR') self.assertIn('TZID:%s' % self.event.settings.timezone, ical, 'missing VCALENDAR')
@@ -1413,7 +1413,7 @@ class EventIcalDownloadTest(EventTestMixin, SoupTest):
fmt = '%Y%m%dT%H%M%S' fmt = '%Y%m%dT%H%M%S'
self.assertIn('DTSTART;TZID=%s:%s' % self.assertIn('DTSTART;TZID=%s:%s' %
(self.event.settings.timezone, (self.event.settings.timezone,
self.event.date_from.astimezone(ZoneInfo(self.event.settings.timezone)).strftime(fmt)), self.event.date_from.astimezone(timezone(self.event.settings.timezone)).strftime(fmt)),
ical, 'incorrect start time') ical, 'incorrect start time')
self.assertNotIn('DTEND', ical, 'unexpected end time attribute') self.assertNotIn('DTEND', ical, 'unexpected end time attribute')
+9 -8
View File
@@ -19,11 +19,12 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see # 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/>. # <https://www.gnu.org/licenses/>.
# #
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta
import pytest import pytest
from django.utils.timezone import now from django.utils.timezone import now
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.models import Event, Organizer from pretix.base.models import Event, Organizer
@@ -148,7 +149,7 @@ def test_calendar(env, client):
env[0].settings.event_list_type = 'calendar' env[0].settings.event_list_type = 'calendar'
e = Event.objects.create( e = Event.objects.create(
organizer=env[0], name='MRMCD2017', slug='2017', organizer=env[0], name='MRMCD2017', slug='2017',
date_from=datetime(now().year + 1, 9, 1, tzinfo=timezone.utc), date_from=datetime(now().year + 1, 9, 1, tzinfo=UTC),
live=True, is_public=False live=True, is_public=False
) )
r = client.get('/mrmcd/?style=calendar') r = client.get('/mrmcd/?style=calendar')
@@ -168,7 +169,7 @@ def test_week_calendar(env, client):
env[0].settings.event_list_type = 'calendar' env[0].settings.event_list_type = 'calendar'
e = Event.objects.create( e = Event.objects.create(
organizer=env[0], name='MRMCD2017', slug='2017', organizer=env[0], name='MRMCD2017', slug='2017',
date_from=datetime(now().year + 1, 9, 1, tzinfo=timezone.utc), date_from=datetime(now().year + 1, 9, 1, tzinfo=UTC),
live=True, is_public=False live=True, is_public=False
) )
r = client.get('/mrmcd/?style=week') r = client.get('/mrmcd/?style=week')
@@ -186,7 +187,7 @@ def test_attributes_in_calendar(env, client):
env[0].settings.event_list_type = 'calendar' env[0].settings.event_list_type = 'calendar'
e = Event.objects.create( e = Event.objects.create(
organizer=env[0], name='MRMCD2017', slug='2017', organizer=env[0], name='MRMCD2017', slug='2017',
date_from=datetime(now().year + 1, 9, 1, tzinfo=timezone.utc), date_from=datetime(now().year + 1, 9, 1, tzinfo=UTC),
live=True, is_public=True live=True, is_public=True
) )
prop = env[0].meta_properties.create(name='loc') prop = env[0].meta_properties.create(name='loc')
@@ -202,7 +203,7 @@ def test_attributes_in_calendar(env, client):
def test_ics(env, client): def test_ics(env, client):
e = Event.objects.create( e = Event.objects.create(
organizer=env[0], name='MRMCD2017', slug='2017', organizer=env[0], name='MRMCD2017', slug='2017',
date_from=datetime(now().year + 1, 9, 1, tzinfo=timezone.utc), date_from=datetime(now().year + 1, 9, 1, tzinfo=UTC),
live=True, is_public=False live=True, is_public=False
) )
r = client.get('/mrmcd/events/ical/') r = client.get('/mrmcd/events/ical/')
@@ -217,7 +218,7 @@ def test_ics(env, client):
def test_ics_subevents(env, client): def test_ics_subevents(env, client):
e = Event.objects.create( e = Event.objects.create(
organizer=env[0], name='MRMCD2017', slug='2017', organizer=env[0], name='MRMCD2017', slug='2017',
date_from=datetime(now().year + 1, 9, 1, tzinfo=timezone.utc), date_from=datetime(now().year + 1, 9, 1, tzinfo=UTC),
live=True, is_public=True, has_subevents=True live=True, is_public=True, has_subevents=True
) )
with scopes_disabled(): with scopes_disabled():
@@ -231,12 +232,12 @@ def test_ics_subevents(env, client):
def test_ics_subevents_attributes(env, client): def test_ics_subevents_attributes(env, client):
e0 = Event.objects.create( e0 = Event.objects.create(
organizer=env[0], name='DS2017', slug='DS2017', organizer=env[0], name='DS2017', slug='DS2017',
date_from=datetime(now().year + 1, 9, 1, tzinfo=timezone.utc), date_from=datetime(now().year + 1, 9, 1, tzinfo=UTC),
live=True, is_public=True live=True, is_public=True
) )
e = Event.objects.create( e = Event.objects.create(
organizer=env[0], name='MRMCD2017', slug='2017', organizer=env[0], name='MRMCD2017', slug='2017',
date_from=datetime(now().year + 1, 9, 1, tzinfo=timezone.utc), date_from=datetime(now().year + 1, 9, 1, tzinfo=UTC),
live=True, is_public=True, has_subevents=True live=True, is_public=True, has_subevents=True
) )
with scopes_disabled(): with scopes_disabled():