diff --git a/.travis.yml b/.travis.yml index b0746561c5..bfd309e5eb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,24 +13,24 @@ services: - postgresql matrix: include: - - python: 3.7 + - python: 3.8 env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_sqlite.cfg - - python: 3.7 + - python: 3.8 env: JOB=tests-cov PRETIX_CONFIG_FILE=tests/travis_postgres.cfg - - python: 3.7 + - python: 3.8 env: JOB=style - - python: 3.7 + - python: 3.8 env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_mysql.cfg - - python: 3.7 - env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg - - python: 3.5 + - python: 3.8 env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg - python: 3.7 + env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg + - python: 3.8 env: JOB=doc-spelling - - python: 3.7 + - python: 3.8 env: JOB=translation-spelling addons: - postgresql: "9.4" + postgresql: "10" mariadb: '10.3' apt: packages: diff --git a/doc/admin/installation/manual_smallscale.rst b/doc/admin/installation/manual_smallscale.rst index 48c4f5856a..1ffe31529e 100644 --- a/doc/admin/installation/manual_smallscale.rst +++ b/doc/admin/installation/manual_smallscale.rst @@ -12,7 +12,7 @@ solution with many things readily set-up, look at :ref:`dockersmallscale`. get it right. If you're not feeling comfortable managing a Linux server, check out our hosting and service offers at `pretix.eu`_. -We tested this guide on the Linux distribution **Debian 8.0** but it should work very similar on other +We tested this guide on the Linux distribution **Debian 10.0** but it should work very similar on other modern distributions, especially on all systemd-based ones. Requirements @@ -133,7 +133,7 @@ command if you're running MySQL:: (venv)$ pip3 install "pretix[postgres]" gunicorn -Note that you need Python 3.5 or newer. You can find out your Python version using ``python -V``. +Note that you need Python 3.6 or newer. You can find out your Python version using ``python -V``. We also need to create a data directory:: diff --git a/doc/development/api/customview.rst b/doc/development/api/customview.rst index fbf1f6b90f..0302e78424 100644 --- a/doc/development/api/customview.rst +++ b/doc/development/api/customview.rst @@ -66,7 +66,7 @@ event-related views, there is also a signal that allows you to add the view to t from django.urls import resolve, reverse from django.dispatch import receiver - from django.utils.translation import ugettext_lazy as _ + from django.utils.translation import gettext_lazy as _ from pretix.control.signals import nav_event diff --git a/doc/development/api/plugins.rst b/doc/development/api/plugins.rst index fc27696046..f762700c60 100644 --- a/doc/development/api/plugins.rst +++ b/doc/development/api/plugins.rst @@ -61,7 +61,7 @@ A working example would be:: from pretix.base.plugins import PluginConfig except ImportError: raise RuntimeError("Please use pretix 2.7 or above to run this plugin!") - from django.utils.translation import ugettext_lazy as _ + from django.utils.translation import gettext_lazy as _ class PaypalApp(PluginConfig): diff --git a/doc/development/implementation/logging.rst b/doc/development/implementation/logging.rst index 62d1916b2d..bce420b721 100644 --- a/doc/development/implementation/logging.rst +++ b/doc/development/implementation/logging.rst @@ -69,7 +69,7 @@ We now need a way to translate the action codes like ``pretix.event.changed`` in strings. The :py:attr:`pretix.base.signals.logentry_display` signals allows you to do so. A simple implementation could look like:: - from django.utils.translation import ugettext as _ + from django.utils.translation import gettext as _ from pretix.base.signals import logentry_display @receiver(signal=logentry_display) diff --git a/src/pretix/api/models.py b/src/pretix/api/models.py index 2fbd38388a..299dfd7a90 100644 --- a/src/pretix/api/models.py +++ b/src/pretix/api/models.py @@ -3,7 +3,7 @@ from datetime import timedelta from django.db import models from django.urls import reverse from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from oauth2_provider.generators import ( generate_client_id, generate_client_secret, ) diff --git a/src/pretix/api/serializers/cart.py b/src/pretix/api/serializers/cart.py index 3792780dd4..bcd6205a46 100644 --- a/src/pretix/api/serializers/cart.py +++ b/src/pretix/api/serializers/cart.py @@ -2,7 +2,7 @@ from datetime import timedelta from django.utils.crypto import get_random_string from django.utils.timezone import now -from django.utils.translation import ugettext_lazy +from django.utils.translation import gettext_lazy from rest_framework import serializers from rest_framework.exceptions import ValidationError @@ -56,7 +56,7 @@ class CartPositionCreateSerializer(I18nAwareModelSerializer): else validated_data.get('item').quotas.filter(subevent=validated_data.get('subevent'))) if len(new_quotas) == 0: raise ValidationError( - ugettext_lazy('The product "{}" is not assigned to a quota.').format( + gettext_lazy('The product "{}" is not assigned to a quota.').format( str(validated_data.get('item')) ) ) @@ -64,8 +64,8 @@ class CartPositionCreateSerializer(I18nAwareModelSerializer): avail = quota.availability() if avail[0] != Quota.AVAILABILITY_OK or (avail[1] is not None and avail[1] < 1): raise ValidationError( - ugettext_lazy('There is not enough quota available on quota "{}" to perform ' - 'the operation.').format( + gettext_lazy('There is not enough quota available on quota "{}" to perform ' + 'the operation.').format( quota.name ) ) @@ -88,7 +88,7 @@ class CartPositionCreateSerializer(I18nAwareModelSerializer): else: validated_data['seat'] = seat if not seat.is_available(sales_channel=validated_data.get('sales_channel', 'web')): - raise ValidationError(ugettext_lazy('The selected seat "{seat}" is not available.').format(seat=seat.name)) + raise ValidationError(gettext_lazy('The selected seat "{seat}" is not available.').format(seat=seat.name)) elif seated: raise ValidationError('The specified product requires to choose a seat.') diff --git a/src/pretix/api/serializers/checkin.py b/src/pretix/api/serializers/checkin.py index 8cfd43392b..b6aac58d62 100644 --- a/src/pretix/api/serializers/checkin.py +++ b/src/pretix/api/serializers/checkin.py @@ -1,4 +1,4 @@ -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from rest_framework import serializers from rest_framework.exceptions import ValidationError diff --git a/src/pretix/api/serializers/event.py b/src/pretix/api/serializers/event.py index 4402230953..4e858ca9e0 100644 --- a/src/pretix/api/serializers/event.py +++ b/src/pretix/api/serializers/event.py @@ -2,7 +2,7 @@ from django.conf import settings from django.core.exceptions import ValidationError from django.db import transaction from django.utils.functional import cached_property -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django_countries.serializers import CountryFieldMixin from hierarkey.proxy import HierarkeyProxy from pytz import common_timezones diff --git a/src/pretix/api/serializers/item.py b/src/pretix/api/serializers/item.py index df2f83bf2b..7f9662f7e1 100644 --- a/src/pretix/api/serializers/item.py +++ b/src/pretix/api/serializers/item.py @@ -3,7 +3,7 @@ from decimal import Decimal from django.core.exceptions import ValidationError from django.db import transaction from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from pretix.api.serializers.event import MetaDataField diff --git a/src/pretix/api/serializers/order.py b/src/pretix/api/serializers/order.py index 4c938951ec..cdd0e9e857 100644 --- a/src/pretix/api/serializers/order.py +++ b/src/pretix/api/serializers/order.py @@ -5,7 +5,7 @@ from decimal import Decimal import pycountry from django.db.models import F, Q from django.utils.timezone import now -from django.utils.translation import ugettext_lazy +from django.utils.translation import gettext_lazy from django_countries.fields import Country from rest_framework import serializers from rest_framework.exceptions import ValidationError @@ -862,7 +862,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer): else: pos_data['seat'] = seat if (seat not in free_seats and not seat.is_available(sales_channel=validated_data.get('sales_channel', 'web'))) or seat in seats_seen: - errs[i]['seat'] = [ugettext_lazy('The selected seat "{seat}" is not available.').format(seat=seat.name)] + errs[i]['seat'] = [gettext_lazy('The selected seat "{seat}" is not available.').format(seat=seat.name)] seats_seen.add(seat) elif seated: errs[i]['seat'] = ['The specified product requires to choose a seat.'] @@ -877,7 +877,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer): if pos_data.get('variation') else pos_data.get('item').quotas.filter(subevent=pos_data.get('subevent'))) if len(new_quotas) == 0: - errs[i]['item'] = [ugettext_lazy('The product "{}" is not assigned to a quota.').format( + errs[i]['item'] = [gettext_lazy('The product "{}" is not assigned to a quota.').format( str(pos_data.get('item')) )] else: @@ -889,7 +889,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer): quota_avail_cache[quota][1] -= 1 if quota_avail_cache[quota][1] < 0: errs[i]['item'] = [ - ugettext_lazy('There is not enough quota available on quota "{}" to perform the operation.').format( + gettext_lazy('There is not enough quota available on quota "{}" to perform the operation.').format( quota.name ) ] diff --git a/src/pretix/api/serializers/organizer.py b/src/pretix/api/serializers/organizer.py index 3e520c4d7d..5d9ec912b3 100644 --- a/src/pretix/api/serializers/organizer.py +++ b/src/pretix/api/serializers/organizer.py @@ -1,7 +1,7 @@ from decimal import Decimal from django.db.models import Q -from django.utils.translation import get_language, ugettext_lazy as _ +from django.utils.translation import get_language, gettext_lazy as _ from rest_framework import serializers from rest_framework.exceptions import ValidationError diff --git a/src/pretix/api/views/oauth.py b/src/pretix/api/views/oauth.py index 51920495e6..8123770106 100644 --- a/src/pretix/api/views/oauth.py +++ b/src/pretix/api/views/oauth.py @@ -2,7 +2,7 @@ import logging from django import forms from django.conf import settings -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from oauth2_provider.exceptions import OAuthToolkitError from oauth2_provider.forms import AllowForm from oauth2_provider.views import ( diff --git a/src/pretix/api/views/order.py b/src/pretix/api/views/order.py index 4d6aa505be..398836d789 100644 --- a/src/pretix/api/views/order.py +++ b/src/pretix/api/views/order.py @@ -9,7 +9,7 @@ from django.db.models.functions import Coalesce, Concat from django.http import FileResponse, HttpResponse from django.shortcuts import get_object_or_404 from django.utils.timezone import make_aware, now -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django_filters.rest_framework import DjangoFilterBackend, FilterSet from django_scopes import scopes_disabled from rest_framework import mixins, serializers, status, viewsets diff --git a/src/pretix/api/webhooks.py b/src/pretix/api/webhooks.py index 71a0182332..0af6a76cae 100644 --- a/src/pretix/api/webhooks.py +++ b/src/pretix/api/webhooks.py @@ -7,7 +7,7 @@ import requests from celery.exceptions import MaxRetriesExceededError from django.db.models import Exists, OuterRef, Q from django.dispatch import receiver -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django_scopes import scope, scopes_disabled from requests import RequestException diff --git a/src/pretix/base/channels.py b/src/pretix/base/channels.py index f6db148dfb..1de4ede069 100644 --- a/src/pretix/base/channels.py +++ b/src/pretix/base/channels.py @@ -2,7 +2,7 @@ import logging from collections import OrderedDict from django.dispatch import receiver -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.signals import register_sales_channels diff --git a/src/pretix/base/email.py b/src/pretix/base/email.py index 29657007d7..9f3dd0605d 100644 --- a/src/pretix/base/email.py +++ b/src/pretix/base/email.py @@ -9,7 +9,7 @@ from django.core.mail.backends.smtp import EmailBackend from django.dispatch import receiver from django.template.loader import get_template from django.utils.timezone import now -from django.utils.translation import get_language, ugettext_lazy as _ +from django.utils.translation import get_language, gettext_lazy as _ from inlinestyler.utils import inline_css from pretix.base.i18n import LazyCurrencyNumber, LazyDate, LazyNumber diff --git a/src/pretix/base/exporter.py b/src/pretix/base/exporter.py index 8683568a42..ee8ffc7c2b 100644 --- a/src/pretix/base/exporter.py +++ b/src/pretix/base/exporter.py @@ -7,7 +7,7 @@ from typing import Tuple from defusedcsv import csv from django import forms from django.utils.formats import localize -from django.utils.translation import ugettext, ugettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _ from openpyxl import Workbook from openpyxl.cell.cell import KNOWN_TYPES @@ -180,9 +180,9 @@ class MultiSheetListExporter(ListExporter): ] for s, l in self.sheets: choices += [ - (s + ':default', str(l) + ' – ' + ugettext('CSV (with commas)')), - (s + ':excel', str(l) + ' – ' + ugettext('CSV (Excel-style)')), - (s + ':semicolon', str(l) + ' – ' + ugettext('CSV (with semicolons)')), + (s + ':default', str(l) + ' – ' + gettext('CSV (with commas)')), + (s + ':excel', str(l) + ' – ' + gettext('CSV (Excel-style)')), + (s + ':semicolon', str(l) + ' – ' + gettext('CSV (with semicolons)')), ] ff = OrderedDict( [ diff --git a/src/pretix/base/exporters/answers.py b/src/pretix/base/exporters/answers.py index 36f6f61716..1166a027ed 100644 --- a/src/pretix/base/exporters/answers.py +++ b/src/pretix/base/exporters/answers.py @@ -5,7 +5,7 @@ from zipfile import ZipFile from django import forms from django.dispatch import receiver -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.models import QuestionAnswer diff --git a/src/pretix/base/exporters/dekodi.py b/src/pretix/base/exporters/dekodi.py index b254dec1ab..8de71b6375 100644 --- a/src/pretix/base/exporters/dekodi.py +++ b/src/pretix/base/exporters/dekodi.py @@ -6,7 +6,7 @@ import dateutil from django import forms from django.core.serializers.json import DjangoJSONEncoder from django.dispatch import receiver -from django.utils.translation import ugettext, ugettext_lazy +from django.utils.translation import gettext, gettext_lazy from pretix.base.i18n import language from pretix.base.models import Invoice, OrderPayment @@ -79,7 +79,7 @@ class DekodiNREIExporter(BaseExporter): payments.append({ 'PTID': '5', 'PTN': 'Lastschrift', - 'PTNo4': ugettext('Event ticket {event}-{code}').format( + 'PTNo4': gettext('Event ticket {event}-{code}').format( event=self.event.slug.upper(), code=invoice.order.code ), @@ -199,19 +199,19 @@ class DekodiNREIExporter(BaseExporter): [ ('date_from', forms.DateField( - label=ugettext_lazy('Start date'), + label=gettext_lazy('Start date'), widget=forms.DateInput(attrs={'class': 'datepickerfield'}), required=False, - help_text=ugettext_lazy('Only include invoices issued on or after this date. Note that the invoice date does ' - 'not always correspond to the order or payment date.') + help_text=gettext_lazy('Only include invoices issued on or after this date. Note that the invoice date does ' + 'not always correspond to the order or payment date.') )), ('date_to', forms.DateField( - label=ugettext_lazy('End date'), + label=gettext_lazy('End date'), widget=forms.DateInput(attrs={'class': 'datepickerfield'}), required=False, - help_text=ugettext_lazy('Only include invoices issued on or before this date. Note that the invoice date ' - 'does not always correspond to the order or payment date.') + help_text=gettext_lazy('Only include invoices issued on or before this date. Note that the invoice date ' + 'does not always correspond to the order or payment date.') )), ] ) diff --git a/src/pretix/base/exporters/invoices.py b/src/pretix/base/exporters/invoices.py index 31b242bb95..201981e78b 100644 --- a/src/pretix/base/exporters/invoices.py +++ b/src/pretix/base/exporters/invoices.py @@ -7,7 +7,7 @@ import dateutil.parser from django import forms from django.db.models import Exists, OuterRef, Q from django.dispatch import receiver -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.models import OrderPayment diff --git a/src/pretix/base/exporters/mail.py b/src/pretix/base/exporters/mail.py index 2fd6ab8f71..cb6b84fd90 100644 --- a/src/pretix/base/exporters/mail.py +++ b/src/pretix/base/exporters/mail.py @@ -2,7 +2,7 @@ from collections import OrderedDict from django import forms from django.dispatch import receiver -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.models import OrderPosition diff --git a/src/pretix/base/exporters/orderlist.py b/src/pretix/base/exporters/orderlist.py index 961164bcc3..6504249b28 100644 --- a/src/pretix/base/exporters/orderlist.py +++ b/src/pretix/base/exporters/orderlist.py @@ -8,7 +8,7 @@ from django.db.models import ( ) from django.dispatch import receiver from django.utils.formats import date_format -from django.utils.translation import pgettext, ugettext as _, ugettext_lazy +from django.utils.translation import gettext as _, gettext_lazy, pgettext from pretix.base.models import ( InvoiceAddress, InvoiceLine, Order, OrderPosition, Question, @@ -22,7 +22,7 @@ from ..signals import register_data_exporters class OrderListExporter(MultiSheetListExporter): identifier = 'orderlist' - verbose_name = ugettext_lazy('Order data') + verbose_name = gettext_lazy('Order data') @property def sheets(self): @@ -414,7 +414,7 @@ class OrderListExporter(MultiSheetListExporter): class PaymentListExporter(ListExporter): identifier = 'paymentlist' - verbose_name = ugettext_lazy('Order payments and refunds') + verbose_name = gettext_lazy('Order payments and refunds') @property def additional_form_fields(self): @@ -485,7 +485,7 @@ class PaymentListExporter(ListExporter): class QuotaListExporter(ListExporter): identifier = 'quotalist' - verbose_name = ugettext_lazy('Quota availabilities') + verbose_name = gettext_lazy('Quota availabilities') def iterate_list(self, form_data): headers = [ @@ -514,7 +514,7 @@ class QuotaListExporter(ListExporter): class InvoiceDataExporter(MultiSheetListExporter): identifier = 'invoicedata' - verbose_name = ugettext_lazy('Invoice data') + verbose_name = gettext_lazy('Invoice data') @property def sheets(self): diff --git a/src/pretix/base/forms/__init__.py b/src/pretix/base/forms/__init__.py index 62d5fe1075..a9462cd014 100644 --- a/src/pretix/base/forms/__init__.py +++ b/src/pretix/base/forms/__init__.py @@ -3,7 +3,6 @@ import logging import i18nfield.forms from django import forms from django.forms.models import ModelFormMetaclass -from django.utils import six from django.utils.crypto import get_random_string from formtools.wizard.views import SessionWizardView from hierarkey.forms import HierarkeyForm @@ -25,7 +24,7 @@ class BaseI18nModelForm(i18nfield.forms.BaseI18nModelForm): super().__init__(*args, **kwargs) -class I18nModelForm(six.with_metaclass(ModelFormMetaclass, BaseI18nModelForm)): +class I18nModelForm(BaseI18nModelForm, metaclass=ModelFormMetaclass): pass diff --git a/src/pretix/base/forms/auth.py b/src/pretix/base/forms/auth.py index f67eacfd53..4b2b7183b7 100644 --- a/src/pretix/base/forms/auth.py +++ b/src/pretix/base/forms/auth.py @@ -3,9 +3,10 @@ from django.conf import settings from django.contrib.auth.password_validation import ( password_validators_help_texts, validate_password, ) -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.models import User +from pretix.helpers.dicts import move_to_end class LoginForm(forms.Form): @@ -36,7 +37,7 @@ class LoginForm(forms.Form): if not settings.PRETIX_LONG_SESSIONS or backend.url: del self.fields['keep_logged_in'] else: - self.fields.move_to_end('keep_logged_in') + move_to_end(self.fields, 'keep_logged_in') def clean(self): if all(k in self.cleaned_data for k, f in self.fields.items() if f.required): diff --git a/src/pretix/base/forms/questions.py b/src/pretix/base/forms/questions.py index ddec765dea..7abfddf004 100644 --- a/src/pretix/base/forms/questions.py +++ b/src/pretix/base/forms/questions.py @@ -18,7 +18,7 @@ from django.forms import Select from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.translation import ( - get_language, pgettext_lazy, ugettext_lazy as _, + get_language, gettext_lazy as _, pgettext_lazy, ) from django_countries import countries from django_countries.fields import Country, CountryField diff --git a/src/pretix/base/forms/user.py b/src/pretix/base/forms/user.py index fbb594a47e..30f2f8de86 100644 --- a/src/pretix/base/forms/user.py +++ b/src/pretix/base/forms/user.py @@ -4,7 +4,7 @@ from django.contrib.auth.password_validation import ( password_validators_help_texts, validate_password, ) from django.db.models import Q -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pytz import common_timezones from pretix.base.models import User diff --git a/src/pretix/base/forms/validators.py b/src/pretix/base/forms/validators.py index b219e3d8db..dca61f01d1 100644 --- a/src/pretix/base/forms/validators.py +++ b/src/pretix/base/forms/validators.py @@ -2,7 +2,7 @@ import re from django.core.exceptions import ValidationError from django.core.validators import BaseValidator -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from i18nfield.strings import LazyI18nString diff --git a/src/pretix/base/forms/widgets.py b/src/pretix/base/forms/widgets.py index 8abdd5eff7..5aff1b7bf1 100644 --- a/src/pretix/base/forms/widgets.py +++ b/src/pretix/base/forms/widgets.py @@ -4,7 +4,7 @@ from django import forms from django.utils.formats import get_format from django.utils.functional import lazy from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ class DatePickerWidget(forms.DateInput): diff --git a/src/pretix/base/i18n.py b/src/pretix/base/i18n.py index 083115d610..366abd0b59 100644 --- a/src/pretix/base/i18n.py +++ b/src/pretix/base/i18n.py @@ -3,7 +3,7 @@ from contextlib import contextmanager from django.conf import settings from django.utils import translation from django.utils.formats import date_format, number_format -from django.utils.translation import ugettext +from django.utils.translation import gettext from i18nfield.fields import ( # noqa I18nCharField, I18nTextarea, I18nTextField, I18nTextInput, ) @@ -69,6 +69,6 @@ class LazyLocaleException(Exception): def __str__(self): if self.msgargs: - return ugettext(self.msg) % self.msgargs + return gettext(self.msg) % self.msgargs else: - return ugettext(self.msg) + return gettext(self.msg) diff --git a/src/pretix/base/invoice.py b/src/pretix/base/invoice.py index c513c9cca0..da0b7ad4c1 100644 --- a/src/pretix/base/invoice.py +++ b/src/pretix/base/invoice.py @@ -10,7 +10,7 @@ from django.contrib.staticfiles import finders from django.dispatch import receiver from django.utils.formats import date_format, localize from django.utils.translation import ( - get_language, pgettext, ugettext, ugettext_lazy, + get_language, gettext, gettext_lazy, pgettext, ) from PIL.Image import BICUBIC from reportlab.lib import pagesizes @@ -423,7 +423,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): canvas.saveState() canvas.setFont('OpenSansBd', 30) canvas.setFillColorRGB(32, 0, 0) - canvas.drawRightString(self.pagesize[0] - 20 * mm, (297 - 100) * mm, ugettext('TEST MODE')) + canvas.drawRightString(self.pagesize[0] - 20 * mm, (297 - 100) * mm, gettext('TEST MODE')) canvas.restoreState() def _on_first_page(self, canvas: Canvas, doc): @@ -688,7 +688,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): class Modern1Renderer(ClassicInvoiceRenderer): identifier = 'modern1' - verbose_name = ugettext_lazy('Modern Invoice Renderer (pretix 2.7)') + verbose_name = gettext_lazy('Modern Invoice Renderer (pretix 2.7)') bottom_margin = 16.9 * mm top_margin = 16.9 * mm right_margin = 20 * mm diff --git a/src/pretix/base/migrations/0077_auto_20171124_1629.py b/src/pretix/base/migrations/0077_auto_20171124_1629.py index c5c0f9c123..2a65ccf4ec 100644 --- a/src/pretix/base/migrations/0077_auto_20171124_1629.py +++ b/src/pretix/base/migrations/0077_auto_20171124_1629.py @@ -6,7 +6,7 @@ import django.core.validators import django.db.models.deletion from django.conf import settings from django.db import migrations, models -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ import pretix.base.validators from pretix.base.i18n import language diff --git a/src/pretix/base/migrations/0077_auto_20171124_1629_squashed_0088_auto_20180328_1217.py b/src/pretix/base/migrations/0077_auto_20171124_1629_squashed_0088_auto_20180328_1217.py index 9a68747c7b..f3f952f71f 100644 --- a/src/pretix/base/migrations/0077_auto_20171124_1629_squashed_0088_auto_20180328_1217.py +++ b/src/pretix/base/migrations/0077_auto_20171124_1629_squashed_0088_auto_20180328_1217.py @@ -7,7 +7,7 @@ from django.db import migrations, models from django.db.models import F from django.db.models.functions import Concat from django.utils.crypto import get_random_string -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ import pretix.base.models.auth import pretix.base.validators diff --git a/src/pretix/base/models/auth.py b/src/pretix/base/models/auth.py index c51983b52c..e4d754cc98 100644 --- a/src/pretix/base/models/auth.py +++ b/src/pretix/base/models/auth.py @@ -14,7 +14,7 @@ from django.db import models from django.db.models import Q from django.utils.crypto import get_random_string, salted_hmac from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django_otp.models import Device from django_scopes import scopes_disabled from u2flib_server.utils import ( diff --git a/src/pretix/base/models/checkin.py b/src/pretix/base/models/checkin.py index bb7148e7d9..35eff8a9a4 100644 --- a/src/pretix/base/models/checkin.py +++ b/src/pretix/base/models/checkin.py @@ -1,7 +1,7 @@ from django.db import models from django.db.models import Exists, OuterRef from django.utils.timezone import now -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django_scopes import ScopedManager from pretix.base.models import LoggedModel diff --git a/src/pretix/base/models/devices.py b/src/pretix/base/models/devices.py index 5bcac45eaf..aa286dc6e7 100644 --- a/src/pretix/base/models/devices.py +++ b/src/pretix/base/models/devices.py @@ -3,7 +3,7 @@ import string from django.db import models from django.db.models import Max from django.utils.crypto import get_random_string -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django_scopes import ScopedManager, scopes_disabled from pretix.base.models import LoggedModel diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index ced8fd7fac..1199b7009b 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -17,7 +17,7 @@ from django.template.defaultfilters import date as _date from django.utils.crypto import get_random_string from django.utils.functional import cached_property from django.utils.timezone import make_aware, now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django_scopes import ScopedManager, scopes_disabled from i18nfield.fields import I18nCharField, I18nTextField diff --git a/src/pretix/base/models/giftcards.py b/src/pretix/base/models/giftcards.py index 67181fa470..625c79e823 100644 --- a/src/pretix/base/models/giftcards.py +++ b/src/pretix/base/models/giftcards.py @@ -5,7 +5,7 @@ from django.core.validators import RegexValidator from django.db import models from django.db.models import Sum from django.utils.crypto import get_random_string -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.banlist import banned from pretix.base.models import LoggedModel @@ -83,6 +83,7 @@ class GiftCard(LoggedModel): class Meta: unique_together = (('secret', 'issuer'),) + ordering = ("issuance",) class GiftCardTransaction(models.Model): diff --git a/src/pretix/base/models/items.py b/src/pretix/base/models/items.py index b72bd97b90..b463c94332 100644 --- a/src/pretix/base/models/items.py +++ b/src/pretix/base/models/items.py @@ -16,7 +16,7 @@ from django.utils import formats from django.utils.crypto import get_random_string from django.utils.functional import cached_property from django.utils.timezone import is_naive, make_aware, now -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django_countries.fields import Country from django_scopes import ScopedManager from i18nfield.fields import I18nCharField, I18nTextField diff --git a/src/pretix/base/models/log.py b/src/pretix/base/models/log.py index 988d014502..e112e7baf0 100644 --- a/src/pretix/base/models/log.py +++ b/src/pretix/base/models/log.py @@ -6,7 +6,7 @@ from django.db import models from django.urls import reverse from django.utils.functional import cached_property from django.utils.html import escape -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from pretix.base.signals import logentry_object_link diff --git a/src/pretix/base/models/notifications.py b/src/pretix/base/models/notifications.py index 73905cc63f..ad563236b2 100644 --- a/src/pretix/base/models/notifications.py +++ b/src/pretix/base/models/notifications.py @@ -1,5 +1,5 @@ from django.db import models -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ class NotificationSetting(models.Model): diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index b8363fe389..9931cbecda 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -26,7 +26,7 @@ from django.utils.encoding import escape_uri_path from django.utils.formats import date_format from django.utils.functional import cached_property from django.utils.timezone import make_aware, now -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django_countries.fields import Country, CountryField from django_scopes import ScopedManager, scopes_disabled from i18nfield.strings import LazyI18nString diff --git a/src/pretix/base/models/organizer.py b/src/pretix/base/models/organizer.py index 94fd00a242..8195a48117 100644 --- a/src/pretix/base/models/organizer.py +++ b/src/pretix/base/models/organizer.py @@ -5,7 +5,7 @@ from django.db import models from django.db.models import Exists, OuterRef, Q from django.utils.crypto import get_random_string from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.models.base import LoggedModel from pretix.base.validators import OrganizerSlugBanlistValidator diff --git a/src/pretix/base/models/seating.py b/src/pretix/base/models/seating.py index 6d45457bec..a3cebcd59b 100644 --- a/src/pretix/base/models/seating.py +++ b/src/pretix/base/models/seating.py @@ -8,7 +8,7 @@ from django.db import models from django.db.models import F, Q from django.utils.deconstruct import deconstructible from django.utils.timezone import now -from django.utils.translation import gettext, ugettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _ from pretix.base.models import Event, Item, LoggedModel, Organizer, SubEvent diff --git a/src/pretix/base/models/tax.py b/src/pretix/base/models/tax.py index 88427bb617..66fe8d5daa 100644 --- a/src/pretix/base/models/tax.py +++ b/src/pretix/base/models/tax.py @@ -4,7 +4,7 @@ from decimal import Decimal from django.core.exceptions import ValidationError from django.db import models from django.utils.formats import localize -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django_countries.fields import CountryField from i18nfield.fields import I18nCharField diff --git a/src/pretix/base/models/vouchers.py b/src/pretix/base/models/vouchers.py index 8239bed77b..0e458054be 100644 --- a/src/pretix/base/models/vouchers.py +++ b/src/pretix/base/models/vouchers.py @@ -8,7 +8,7 @@ from django.db.models import F, OuterRef, Q, Subquery, Sum from django.db.models.functions import Coalesce from django.utils.crypto import get_random_string from django.utils.timezone import now -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django_scopes import ScopedManager, scopes_disabled from pretix.base.banlist import banned diff --git a/src/pretix/base/models/waitinglist.py b/src/pretix/base/models/waitinglist.py index 13c78a69c1..63a549a0a9 100644 --- a/src/pretix/base/models/waitinglist.py +++ b/src/pretix/base/models/waitinglist.py @@ -3,7 +3,7 @@ from datetime import timedelta from django.core.exceptions import ValidationError from django.db import models, transaction from django.utils.timezone import now -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django_scopes import ScopedManager from pretix.base.email import get_email_context diff --git a/src/pretix/base/notifications.py b/src/pretix/base/notifications.py index 707ca25c3d..b8cd25b85a 100644 --- a/src/pretix/base/notifications.py +++ b/src/pretix/base/notifications.py @@ -3,7 +3,7 @@ from collections import OrderedDict, namedtuple from django.dispatch import receiver from django.utils.formats import date_format -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from pretix.base.models import Event, LogEntry from pretix.base.signals import register_notification_types diff --git a/src/pretix/base/payment.py b/src/pretix/base/payment.py index 1c7e56b340..1ffb0171f0 100644 --- a/src/pretix/base/payment.py +++ b/src/pretix/base/payment.py @@ -17,7 +17,7 @@ from django.http import HttpRequest from django.template.loader import get_template from django.utils.crypto import get_random_string from django.utils.timezone import now -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django_countries import Countries from i18nfield.forms import I18nFormField, I18nTextarea, I18nTextInput from i18nfield.strings import LazyI18nString diff --git a/src/pretix/base/pdf.py b/src/pretix/base/pdf.py index e41f59b33f..f634d9a66a 100644 --- a/src/pretix/base/pdf.py +++ b/src/pretix/base/pdf.py @@ -17,7 +17,7 @@ from django.dispatch import receiver from django.utils.formats import date_format from django.utils.html import conditional_escape from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from PyPDF2 import PdfFileReader from pytz import timezone from reportlab.graphics import renderPDF diff --git a/src/pretix/base/reldate.py b/src/pretix/base/reldate.py index a9a34817e4..6846e8eba2 100644 --- a/src/pretix/base/reldate.py +++ b/src/pretix/base/reldate.py @@ -7,7 +7,7 @@ from dateutil import parser from django import forms from django.core.exceptions import ValidationError from django.db import models -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from rest_framework import serializers BASE_CHOICES = ( diff --git a/src/pretix/base/services/cart.py b/src/pretix/base/services/cart.py index b54bb56114..68e518e011 100644 --- a/src/pretix/base/services/cart.py +++ b/src/pretix/base/services/cart.py @@ -9,7 +9,7 @@ from django.db import DatabaseError, transaction from django.db.models import Count, Exists, OuterRef, Q from django.dispatch import receiver from django.utils.timezone import make_aware, now -from django.utils.translation import pgettext_lazy, ugettext as _ +from django.utils.translation import gettext as _, pgettext_lazy from django_scopes import scopes_disabled from pretix.base.channels import get_all_sales_channels @@ -213,7 +213,7 @@ class CartManager: has_variations=Count('variations'), ).filter( id__in=[i for i in item_ids if i and i not in self._items_cache] - ) + ).order_by() }) self._variations_cache.update({ v.pk: v @@ -221,7 +221,7 @@ class CartManager: 'quotas' ).select_related('item', 'item__event').filter( id__in=[i for i in variation_ids if i and i not in self._variations_cache] - ) + ).order_by() }) def _check_max_cart_size(self): diff --git a/src/pretix/base/services/checkin.py b/src/pretix/base/services/checkin.py index af834746ad..38580e0139 100644 --- a/src/pretix/base/services/checkin.py +++ b/src/pretix/base/services/checkin.py @@ -2,7 +2,7 @@ from django.db import transaction from django.db.models import Prefetch from django.dispatch import receiver from django.utils.timezone import now -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from pretix.base.models import ( Checkin, CheckinList, Order, OrderPosition, Question, QuestionOption, diff --git a/src/pretix/base/services/export.py b/src/pretix/base/services/export.py index b547d62f30..47caaba5fe 100644 --- a/src/pretix/base/services/export.py +++ b/src/pretix/base/services/export.py @@ -2,7 +2,7 @@ from typing import Any, Dict from django.core.files.base import ContentFile from django.utils.timezone import override -from django.utils.translation import ugettext +from django.utils.translation import gettext from pretix.base.i18n import LazyLocaleException, language from pretix.base.models import CachedFile, Event, cachedfile_name @@ -26,7 +26,7 @@ def export(event: Event, fileid: str, provider: str, form_data: Dict[str, Any]) d = ex.render(form_data) if d is None: raise ExportError( - ugettext('Your export did not contain any data.') + gettext('Your export did not contain any data.') ) file.filename, file.type, data = d file.file.save(cachedfile_name(file, file.filename), ContentFile(data)) diff --git a/src/pretix/base/services/invoices.py b/src/pretix/base/services/invoices.py index b78fd9e4d5..5763d5be7a 100644 --- a/src/pretix/base/services/invoices.py +++ b/src/pretix/base/services/invoices.py @@ -15,7 +15,7 @@ from django.dispatch import receiver from django.utils import timezone from django.utils.formats import date_format from django.utils.timezone import now -from django.utils.translation import pgettext, ugettext as _ +from django.utils.translation import gettext as _, pgettext from django_countries.fields import Country from django_scopes import scope, scopes_disabled from i18nfield.strings import LazyI18nString diff --git a/src/pretix/base/services/mail.py b/src/pretix/base/services/mail.py index 43459b0668..884f2e8edb 100644 --- a/src/pretix/base/services/mail.py +++ b/src/pretix/base/services/mail.py @@ -20,7 +20,7 @@ from django.core.mail import ( ) from django.core.mail.message import SafeMIMEText from django.template.loader import get_template -from django.utils.translation import pgettext, ugettext as _ +from django.utils.translation import gettext as _, pgettext from django_scopes import scope, scopes_disabled from i18nfield.strings import LazyI18nString diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 3a21572075..e0ab3579ce 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -15,7 +15,7 @@ from django.db.transaction import get_connection from django.dispatch import receiver from django.utils.functional import cached_property from django.utils.timezone import make_aware, now -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django_scopes import scopes_disabled from pretix.api.models import OAuthApplication diff --git a/src/pretix/base/services/seating.py b/src/pretix/base/services/seating.py index a735471b42..8a31d77380 100644 --- a/src/pretix/base/services/seating.py +++ b/src/pretix/base/services/seating.py @@ -1,5 +1,5 @@ from django.db.models import Count, Q -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.i18n import LazyLocaleException from pretix.base.models import CartPosition, Seat @@ -25,7 +25,7 @@ def validate_plan_change(event, subevent, plan): subevent=subevent, ).filter( Q(has_v=True) | Q(has_op=True) - ).values_list('seat_guid', flat=True) + ).values_list('seat_guid', flat=True).order_by() ) new_seats = { ss.guid for ss in plan.iter_all_seats() @@ -40,7 +40,7 @@ def generate_seats(event, subevent, plan, mapping): current_seats = {} for s in event.seats.select_related('product').annotate( has_op=Count('orderposition'), has_v=Count('vouchers') - ).filter(subevent=subevent): + ).filter(subevent=subevent).order_by(): if s.seat_guid in current_seats: s.delete() # Duplicates should not exist else: diff --git a/src/pretix/base/services/shredder.py b/src/pretix/base/services/shredder.py index 9956c5d221..e0e38572f0 100644 --- a/src/pretix/base/services/shredder.py +++ b/src/pretix/base/services/shredder.py @@ -8,7 +8,7 @@ from dateutil.parser import parse from django.conf import settings from django.utils.crypto import get_random_string from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.models import CachedFile, Event, cachedfile_name from pretix.base.services.tasks import ProfiledEventTask diff --git a/src/pretix/base/services/stats.py b/src/pretix/base/services/stats.py index a75a6f3cd2..96d0ca6acb 100644 --- a/src/pretix/base/services/stats.py +++ b/src/pretix/base/services/stats.py @@ -6,7 +6,7 @@ from django.db.models import ( Case, Count, DateTimeField, F, Max, OuterRef, Subquery, Sum, Value, When, ) from django.utils.timezone import make_aware -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.models import Event, Item, ItemCategory, Order, OrderPosition from pretix.base.models.event import SubEvent diff --git a/src/pretix/base/services/tickets.py b/src/pretix/base/services/tickets.py index 1a2f762ca9..70033c21a4 100644 --- a/src/pretix/base/services/tickets.py +++ b/src/pretix/base/services/tickets.py @@ -3,7 +3,7 @@ import os from django.core.files.base import ContentFile from django.utils.timezone import now -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django_scopes import scopes_disabled from pretix.base.i18n import language diff --git a/src/pretix/base/services/update_check.py b/src/pretix/base/services/update_check.py index eba9726340..67af17701d 100644 --- a/src/pretix/base/services/update_check.py +++ b/src/pretix/base/services/update_check.py @@ -5,7 +5,7 @@ from datetime import timedelta import requests from django.dispatch import receiver from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _, ugettext_noop +from django.utils.translation import gettext_lazy as _, gettext_noop from django_scopes import scopes_disabled from i18nfield.strings import LazyI18nString @@ -91,7 +91,7 @@ def send_update_notification_email(): gs.settings.update_check_email, _('pretix update available'), LazyI18nString.from_gettext( - ugettext_noop( + gettext_noop( 'Hi!\n\nAn update is available for pretix or for one of the plugins you installed in your ' 'pretix installation. Please click on the following link for more information:\n\n {url} \n\n' 'You can always find information on the latest updates on the pretix.eu blog:\n\n' diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 8e211729b4..990ab2056a 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -11,7 +11,7 @@ from django.core.files import File from django.core.validators import MaxValueValidator, MinValueValidator from django.db.models import Model from django.utils.translation import ( - pgettext, pgettext_lazy, ugettext_lazy as _, ugettext_noop, + gettext_lazy as _, gettext_noop, pgettext, pgettext_lazy, ) from django_countries import countries from hierarkey.models import GlobalSettingsBase, Hierarkey @@ -1006,7 +1006,7 @@ DEFAULTS = { }, 'mail_text_resend_link': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, you receive this message because you asked us to send you the link to your order for {event}. @@ -1019,7 +1019,7 @@ Your {event} team""")) }, 'mail_text_resend_all_links': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, somebody requested a list of your orders for {event}. The list is as follows: @@ -1031,7 +1031,7 @@ Your {event} team""")) }, 'mail_text_order_free_attendee': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello {attendee_name}, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello {attendee_name}, you have been registered for {event} successfully. @@ -1043,7 +1043,7 @@ Your {event} team""")) }, 'mail_text_order_free': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, your order for {event} was successful. As you only ordered free products, no payment is required. @@ -1060,7 +1060,7 @@ Your {event} team""")) }, 'mail_text_order_placed_require_approval': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, we successfully received your order for {event}. Since you ordered a product that requires approval by the event organizer, we ask you to @@ -1074,7 +1074,7 @@ Your {event} team""")) }, 'mail_text_order_placed': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, we successfully received your order for {event} with a total value of {total_with_currency}. Please complete your payment before {expire_date}. @@ -1093,7 +1093,7 @@ Your {event} team""")) }, 'mail_text_order_placed_attendee': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello {attendee_name}, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello {attendee_name}, a ticket for {event} has been ordered for you. @@ -1105,7 +1105,7 @@ Your {event} team""")) }, 'mail_text_order_changed': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, your order for {event} has been changed. @@ -1117,7 +1117,7 @@ Your {event} team""")) }, 'mail_text_order_paid': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, we successfully received your payment for {event}. Thank you! @@ -1135,7 +1135,7 @@ Your {event} team""")) }, 'mail_text_order_paid_attendee': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello {attendee_name}, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello {attendee_name}, a ticket for {event} that has been ordered for you is now paid. @@ -1151,7 +1151,7 @@ Your {event} team""")) }, 'mail_text_order_expire_warning': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, we did not yet receive a full payment for your order for {event}. Please keep in mind that we only guarantee your order if we receive @@ -1165,7 +1165,7 @@ Your {event} team""")) }, 'mail_text_waiting_list': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, you submitted yourself to the waiting list for {event}, for the product {product}. @@ -1188,7 +1188,7 @@ Your {event} team""")) }, 'mail_text_order_canceled': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, your order {code} for {event} has been canceled. @@ -1200,7 +1200,7 @@ Your {event} team""")) }, 'mail_text_order_approved': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, we approved your order for {event} and will be happy to welcome you at our event. @@ -1216,7 +1216,7 @@ Your {event} team""")) }, 'mail_text_order_denied': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, unfortunately, we denied your order request for {event}. @@ -1231,7 +1231,7 @@ Your {event} team""")) }, 'mail_text_order_custom_mail': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, You can change your order details and view the status of your order at {url} @@ -1249,7 +1249,7 @@ Your {event} team""")) }, 'mail_text_download_reminder_attendee': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello {attendee_name}, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello {attendee_name}, you are registered for {event}. @@ -1261,7 +1261,7 @@ Your {event} team""")) }, 'mail_text_download_reminder': { 'type': LazyI18nString, - 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + 'default': LazyI18nString.from_gettext(gettext_noop("""Hello, you bought a ticket for {event}. @@ -1391,7 +1391,7 @@ Your {event} team""")) ) }, 'checkout_email_helptext': { - 'default': LazyI18nString.from_gettext(ugettext_noop( + 'default': LazyI18nString.from_gettext(gettext_noop( 'Make sure to enter a valid email address. We will send you an order ' 'confirmation including a link that you need to access your order later.' )), diff --git a/src/pretix/base/shredder.py b/src/pretix/base/shredder.py index bb6880c0a8..3584d7f38d 100644 --- a/src/pretix/base/shredder.py +++ b/src/pretix/base/shredder.py @@ -7,7 +7,7 @@ from django.db.models import Max, Q from django.db.models.functions import Greatest from django.dispatch import receiver from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.api.serializers.order import ( AnswerSerializer, InvoiceAddressSerializer, diff --git a/src/pretix/base/templatetags/rich_text.py b/src/pretix/base/templatetags/rich_text.py index 54a1a206d1..b010462c46 100644 --- a/src/pretix/base/templatetags/rich_text.py +++ b/src/pretix/base/templatetags/rich_text.py @@ -7,7 +7,7 @@ from django import template from django.conf import settings from django.core import signing from django.urls import reverse -from django.utils.http import is_safe_url +from django.utils.http import url_has_allowed_host_and_scheme from django.utils.safestring import mark_safe register = template.Library() @@ -66,7 +66,7 @@ ALLOWED_PROTOCOLS = ['http', 'https', 'mailto', 'tel'] def safelink_callback(attrs, new=False): url = attrs.get((None, 'href'), '/') - if not is_safe_url(url, allowed_hosts=None) and not url.startswith('mailto:') and not url.startswith('tel:'): + if not url_has_allowed_host_and_scheme(url, allowed_hosts=None) and not url.startswith('mailto:') and not url.startswith('tel:'): signer = signing.Signer(salt='safe-redirect') attrs[None, 'href'] = reverse('redirect') + '?url=' + urllib.parse.quote(signer.sign(url)) attrs[None, 'target'] = '_blank' diff --git a/src/pretix/base/ticketoutput.py b/src/pretix/base/ticketoutput.py index 16aa6bc412..96d00609d4 100644 --- a/src/pretix/base/ticketoutput.py +++ b/src/pretix/base/ticketoutput.py @@ -6,7 +6,7 @@ from zipfile import ZipFile from django import forms from django.http import HttpRequest -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.models import Event, Order, OrderPosition from pretix.base.settings import SettingsSandbox diff --git a/src/pretix/base/validators.py b/src/pretix/base/validators.py index 1ffb078bd4..871295cdaf 100644 --- a/src/pretix/base/validators.py +++ b/src/pretix/base/validators.py @@ -1,7 +1,7 @@ from django.conf import settings from django.core.exceptions import ValidationError from django.utils.deconstruct import deconstructible -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ class BanlistValidator: diff --git a/src/pretix/base/views/errors.py b/src/pretix/base/views/errors.py index 2814354470..a0958d5718 100644 --- a/src/pretix/base/views/errors.py +++ b/src/pretix/base/views/errors.py @@ -5,7 +5,7 @@ from django.middleware.csrf import REASON_NO_CSRF_COOKIE, REASON_NO_REFERER from django.template import TemplateDoesNotExist, loader from django.template.loader import get_template from django.utils.functional import Promise -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views.decorators.csrf import requires_csrf_token from sentry_sdk import last_event_id diff --git a/src/pretix/base/views/tasks.py b/src/pretix/base/views/tasks.py index 9b6b5876dd..0c6ef456be 100644 --- a/src/pretix/base/views/tasks.py +++ b/src/pretix/base/views/tasks.py @@ -6,7 +6,7 @@ from django.conf import settings from django.contrib import messages from django.http import JsonResponse from django.shortcuts import redirect, render -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from pretix.celery_app import app diff --git a/src/pretix/control/forms/__init__.py b/src/pretix/control/forms/__init__.py index cda5e3f187..c8ee4af090 100644 --- a/src/pretix/control/forms/__init__.py +++ b/src/pretix/control/forms/__init__.py @@ -6,7 +6,7 @@ from django.conf import settings from django.core.exceptions import ValidationError from django.core.files import File from django.forms.utils import from_current_timezone -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from ...base.forms import I18nModelForm # Import for backwards compatibility with okd import paths diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index d2f577d938..09e819f8b5 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -10,7 +10,7 @@ from django.urls import reverse from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.timezone import get_current_timezone_name -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django_countries import Countries from django_countries.fields import LazyTypedChoiceField from i18nfield.forms import ( diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py index 7a1b746416..58c12f4938 100644 --- a/src/pretix/control/forms/filter.py +++ b/src/pretix/control/forms/filter.py @@ -8,7 +8,7 @@ from django.db.models.functions import Coalesce, ExtractWeekDay from django.urls import reverse, reverse_lazy from django.utils.functional import cached_property from django.utils.timezone import get_current_timezone, make_aware, now -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from pretix.base.forms.widgets import DatePickerWidget from pretix.base.models import ( diff --git a/src/pretix/control/forms/global_settings.py b/src/pretix/control/forms/global_settings.py index 7699089713..4e98345bed 100644 --- a/src/pretix/control/forms/global_settings.py +++ b/src/pretix/control/forms/global_settings.py @@ -1,7 +1,7 @@ from collections import OrderedDict from django import forms -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from i18nfield.forms import I18nFormField, I18nTextarea, I18nTextInput from pretix.base.forms import SettingsForm diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index f8ffed5d48..07c2ac0fbf 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -7,7 +7,7 @@ from django.db.models import Max from django.forms.formsets import DELETION_FIELD_NAME from django.urls import reverse from django.utils.translation import ( - pgettext_lazy, ugettext as __, ugettext_lazy as _, + gettext as __, gettext_lazy as _, pgettext_lazy, ) from django_scopes.forms import ( SafeModelChoiceField, SafeModelMultipleChoiceField, diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py index 489f66f915..894e6ee882 100644 --- a/src/pretix/control/forms/orders.py +++ b/src/pretix/control/forms/orders.py @@ -8,7 +8,7 @@ from django.db import models from django.urls import reverse from django.utils.timezone import make_aware, now from django.utils.translation import ( - gettext_noop, pgettext_lazy, ugettext_lazy as _, + gettext_lazy as _, gettext_noop, pgettext_lazy, ) from i18nfield.forms import I18nFormField, I18nTextarea, I18nTextInput from i18nfield.strings import LazyI18nString diff --git a/src/pretix/control/forms/organizer.py b/src/pretix/control/forms/organizer.py index 117e82f319..b89c38a990 100644 --- a/src/pretix/control/forms/organizer.py +++ b/src/pretix/control/forms/organizer.py @@ -7,7 +7,7 @@ from django.core.exceptions import ValidationError from django.core.validators import RegexValidator from django.db.models import Q from django.utils.safestring import mark_safe -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django_scopes.forms import SafeModelMultipleChoiceField from i18nfield.forms import I18nFormField, I18nTextarea diff --git a/src/pretix/control/forms/subevents.py b/src/pretix/control/forms/subevents.py index e6440126ee..7e65d2b134 100644 --- a/src/pretix/control/forms/subevents.py +++ b/src/pretix/control/forms/subevents.py @@ -7,7 +7,7 @@ from django.urls import reverse from django.utils.dates import MONTHS, WEEKDAYS from django.utils.functional import cached_property from django.utils.timezone import now -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from i18nfield.forms import I18nInlineFormSet from pretix.base.forms import I18nModelForm diff --git a/src/pretix/control/forms/users.py b/src/pretix/control/forms/users.py index 5195d9a362..ddd80a5e22 100644 --- a/src/pretix/control/forms/users.py +++ b/src/pretix/control/forms/users.py @@ -4,7 +4,7 @@ from django.contrib.auth.password_validation import ( password_validators_help_texts, validate_password, ) from django.db.models import Q -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pytz import common_timezones from pretix.base.models import User diff --git a/src/pretix/control/forms/vouchers.py b/src/pretix/control/forms/vouchers.py index 0c7bb2f783..c3b1a9982a 100644 --- a/src/pretix/control/forms/vouchers.py +++ b/src/pretix/control/forms/vouchers.py @@ -7,7 +7,7 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.core.validators import EmailValidator from django.db.models.functions import Lower from django.urls import reverse -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django_scopes.forms import SafeModelChoiceField from pretix.base.email import get_available_placeholders diff --git a/src/pretix/control/logdisplay.py b/src/pretix/control/logdisplay.py index 517fcfb1b8..2ff4845363 100644 --- a/src/pretix/control/logdisplay.py +++ b/src/pretix/control/logdisplay.py @@ -10,7 +10,7 @@ from django.urls import reverse from django.utils.formats import date_format from django.utils.html import escape from django.utils.safestring import mark_safe -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from i18nfield.strings import LazyI18nString from pretix.base.models import ( diff --git a/src/pretix/control/middleware.py b/src/pretix/control/middleware.py index a53de2e78d..46a20bad41 100644 --- a/src/pretix/control/middleware.py +++ b/src/pretix/control/middleware.py @@ -7,7 +7,7 @@ from django.shortcuts import get_object_or_404, redirect, resolve_url from django.template.response import TemplateResponse from django.urls import get_script_prefix, resolve, reverse from django.utils.encoding import force_str -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django_scopes import scope from hijack.templatetags.hijack_tags import is_hijacked diff --git a/src/pretix/control/navigation.py b/src/pretix/control/navigation.py index 16f1a645bb..0675c68e9d 100644 --- a/src/pretix/control/navigation.py +++ b/src/pretix/control/navigation.py @@ -1,6 +1,6 @@ from django.http import HttpRequest from django.urls import reverse -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from pretix.control.signals import ( nav_event, nav_event_settings, nav_global, nav_organizer, diff --git a/src/pretix/control/permissions.py b/src/pretix/control/permissions.py index 5a253cb5e7..378b25698e 100644 --- a/src/pretix/control/permissions.py +++ b/src/pretix/control/permissions.py @@ -3,7 +3,7 @@ from urllib.parse import quote from django.core.exceptions import PermissionDenied from django.shortcuts import redirect from django.urls import reverse -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ def event_permission_required(permission): diff --git a/src/pretix/control/templatetags/hierarkey_form.py b/src/pretix/control/templatetags/hierarkey_form.py index faede40d1e..8b1b11db8d 100644 --- a/src/pretix/control/templatetags/hierarkey_form.py +++ b/src/pretix/control/templatetags/hierarkey_form.py @@ -1,6 +1,6 @@ from django import template from django.template import Node -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from pretix.base.models import Event diff --git a/src/pretix/control/views/__init__.py b/src/pretix/control/views/__init__.py index 27ddfb0d31..71e3465b78 100644 --- a/src/pretix/control/views/__init__.py +++ b/src/pretix/control/views/__init__.py @@ -4,7 +4,7 @@ import warnings from django.core.paginator import ( EmptyPage, PageNotAnInteger, UnorderedObjectListWarning, ) -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.generic import edit diff --git a/src/pretix/control/views/auth.py b/src/pretix/control/views/auth.py index 176520a46f..33bbef7b8d 100644 --- a/src/pretix/control/views/auth.py +++ b/src/pretix/control/views/auth.py @@ -15,8 +15,8 @@ from django.db import transaction from django.shortcuts import redirect, render from django.urls import reverse from django.utils.functional import cached_property -from django.utils.http import is_safe_url -from django.utils.translation import ugettext_lazy as _ +from django.utils.http import url_has_allowed_host_and_scheme +from django.utils.translation import gettext_lazy as _ from django.views.generic import TemplateView from django_otp import match_token @@ -44,13 +44,13 @@ def process_login(request, user, keep_logged_in): request.session['pretix_auth_2fa_user'] = user.pk request.session['pretix_auth_2fa_time'] = str(int(time.time())) twofa_url = reverse('control:auth.login.2fa') - if next_url and is_safe_url(next_url, allowed_hosts=None): + if next_url and url_has_allowed_host_and_scheme(next_url, allowed_hosts=None): twofa_url += '?next=' + quote(next_url) return redirect(twofa_url) else: auth_login(request, user) request.session['pretix_auth_login_time'] = int(time.time()) - if next_url and is_safe_url(next_url, allowed_hosts=None): + if next_url and url_has_allowed_host_and_scheme(next_url, allowed_hosts=None): return redirect(next_url) return redirect(reverse('control:index')) @@ -96,9 +96,9 @@ def logout(request): auth_logout(request) request.session['pretix_auth_login_time'] = 0 next = reverse('control:auth.login') - if 'next' in request.GET and is_safe_url(request.GET.get('next'), allowed_hosts=None): + if 'next' in request.GET and url_has_allowed_host_and_scheme(request.GET.get('next'), allowed_hosts=None): next += '?next=' + quote(request.GET.get('next')) - if 'back' in request.GET and is_safe_url(request.GET.get('back'), allowed_hosts=None): + if 'back' in request.GET and url_has_allowed_host_and_scheme(request.GET.get('back'), allowed_hosts=None): return redirect(request.GET.get('back')) return redirect(next) @@ -405,7 +405,7 @@ class Login2FAView(TemplateView): request.session['pretix_auth_login_time'] = int(time.time()) del request.session['pretix_auth_2fa_user'] del request.session['pretix_auth_2fa_time'] - if "next" in request.GET and is_safe_url(request.GET.get("next"), allowed_hosts=None): + if "next" in request.GET and url_has_allowed_host_and_scheme(request.GET.get("next"), allowed_hosts=None): return redirect(request.GET.get("next")) return redirect(reverse('control:index')) else: diff --git a/src/pretix/control/views/checkin.py b/src/pretix/control/views/checkin.py index 57e1a628bd..4ea6803a9c 100644 --- a/src/pretix/control/views/checkin.py +++ b/src/pretix/control/views/checkin.py @@ -7,7 +7,7 @@ from django.shortcuts import get_object_or_404, redirect from django.urls import reverse from django.utils.functional import cached_property from django.utils.timezone import is_aware, make_aware, now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.generic import DeleteView, ListView from pytz import UTC diff --git a/src/pretix/control/views/dashboards.py b/src/pretix/control/views/dashboards.py index 961a014072..59d5a3642b 100644 --- a/src/pretix/control/views/dashboards.py +++ b/src/pretix/control/views/dashboards.py @@ -18,7 +18,7 @@ from django.utils import formats from django.utils.formats import date_format from django.utils.html import escape from django.utils.timezone import now -from django.utils.translation import pgettext, ugettext_lazy as _, ungettext +from django.utils.translation import gettext_lazy as _, pgettext, ungettext from pretix.base.decimal import round_decimal from pretix.base.models import ( diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index ff1f6f83db..cec1bfde6b 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -21,7 +21,7 @@ from django.urls import reverse from django.utils import translation from django.utils.functional import cached_property from django.utils.timezone import now -from django.utils.translation import ugettext, ugettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _ from django.views.generic import DeleteView, FormView, ListView from django.views.generic.base import TemplateView, View from django.views.generic.detail import SingleObjectMixin @@ -667,14 +667,14 @@ class MailSettingsRendererPreview(MailSettingsPreview): with rolledback_transaction(): order = request.event.orders.create(status=Order.STATUS_PENDING, datetime=now(), expires=now(), code="PREVIEW", total=119) - item = request.event.items.create(name=ugettext("Sample product"), default_price=42.23, - description=ugettext("Sample product description")) - p = order.positions.create(item=item, attendee_name_parts={'_legacy': ugettext("John Doe")}, + item = request.event.items.create(name=gettext("Sample product"), default_price=42.23, + description=gettext("Sample product description")) + p = order.positions.create(item=item, attendee_name_parts={'_legacy': gettext("John Doe")}, price=item.default_price) v = renderers[request.GET.get('renderer')].render( v, str(request.event.settings.mail_text_signature), - ugettext('Your order: %(code)s') % {'code': order.code}, + gettext('Your order: %(code)s') % {'code': order.code}, order, position=p ) @@ -1058,7 +1058,7 @@ class TaxCreate(EventSettingsViewMixin, EventPermissionRequiredMixin, CreateView def get_initial(self): return { - 'name': LazyI18nString.from_gettext(ugettext('VAT')) + 'name': LazyI18nString.from_gettext(gettext('VAT')) } def post(self, request, *args, **kwargs): @@ -1317,9 +1317,9 @@ class QuickSetupView(FormView): tax_rule = self.request.event.tax_rules.first() if any(f not in self.formset.deleted_forms for f in self.formset): category = self.request.event.categories.create( - name=LazyI18nString.from_gettext(ugettext('Tickets')) + name=LazyI18nString.from_gettext(gettext('Tickets')) ) - category.log_action('pretix.event.category.added', data={'name': ugettext('Tickets')}, + category.log_action('pretix.event.category.added', data={'name': gettext('Tickets')}, user=self.request.user) subevent = self.request.event.subevents.first() @@ -1350,12 +1350,12 @@ class QuickSetupView(FormView): if form.cleaned_data['total_quota']: quota = self.request.event.quotas.create( - name=ugettext('Tickets'), + name=gettext('Tickets'), size=form.cleaned_data['total_quota'], subevent=subevent, ) quota.log_action('pretix.event.quota.added', user=self.request.user, data={ - 'name': ugettext('Tickets'), + 'name': gettext('Tickets'), 'size': quota.size }) quota.items.add(*items) @@ -1381,12 +1381,12 @@ class QuickSetupView(FormView): event=self.request.event, initial=[ { - 'name': LazyI18nString.from_gettext(ugettext('Regular ticket')), + 'name': LazyI18nString.from_gettext(gettext('Regular ticket')), 'default_price': Decimal('35.00'), 'quota': 100, }, { - 'name': LazyI18nString.from_gettext(ugettext('Reduced ticket')), + 'name': LazyI18nString.from_gettext(gettext('Reduced ticket')), 'default_price': Decimal('29.00'), 'quota': 50, }, diff --git a/src/pretix/control/views/global_settings.py b/src/pretix/control/views/global_settings.py index 60896e554c..1f23066c01 100644 --- a/src/pretix/control/views/global_settings.py +++ b/src/pretix/control/views/global_settings.py @@ -1,7 +1,7 @@ from django.contrib import messages from django.http import JsonResponse from django.shortcuts import get_object_or_404, redirect, reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views import View from django.views.generic import FormView, TemplateView diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 572a2c8c47..009e00254b 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -15,7 +15,7 @@ from django.shortcuts import redirect from django.urls import resolve, reverse from django.utils.functional import cached_property from django.utils.timezone import now -from django.utils.translation import ugettext, ugettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _ from django.views.generic import ListView from django.views.generic.detail import DetailView, SingleObjectMixin from django.views.generic.edit import DeleteView @@ -499,7 +499,7 @@ class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingV if self.object.type == Question.TYPE_FILE: qs = [ { - 'answer': ugettext('File uploaded'), + 'answer': gettext('File uploaded'), 'count': qs.filter(file__isnull=False).count(), } ] @@ -523,7 +523,7 @@ class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingV if self.object.type == Question.TYPE_BOOLEAN: for a in qs: a['alink'] = a['answer'] - a['answer'] = ugettext('Yes') if a['answer'] == 'True' else ugettext('No') + a['answer'] = gettext('Yes') if a['answer'] == 'True' else gettext('No') a['answer_bool'] = a['answer'] == 'True' elif self.object.type == Question.TYPE_COUNTRYCODE: for a in qs: @@ -724,45 +724,45 @@ class QuotaView(ChartContainingView, DetailView): data = [ { - 'label': ugettext('Paid orders'), + 'label': gettext('Paid orders'), 'value': self.object.count_paid_orders(), 'sum': True, }, { - 'label': ugettext('Pending orders'), + 'label': gettext('Pending orders'), 'value': self.object.count_pending_orders(), 'sum': True, }, { - 'label': ugettext('Vouchers and waiting list reservations'), + 'label': gettext('Vouchers and waiting list reservations'), 'value': self.object.count_blocking_vouchers(), 'sum': True, }, { - 'label': ugettext('Current user\'s carts'), + 'label': gettext('Current user\'s carts'), 'value': self.object.count_in_cart(), 'sum': True, }, ] sum_values = sum([d['value'] for d in data if d['sum']]) - s = self.object.size - sum_values if self.object.size is not None else ugettext('Infinite') + s = self.object.size - sum_values if self.object.size is not None else gettext('Infinite') data.append({ - 'label': ugettext('Available quota'), + 'label': gettext('Available quota'), 'value': s, 'sum': False, 'strong': True }) data.append({ - 'label': ugettext('Waiting list (pending)'), + 'label': gettext('Waiting list (pending)'), 'value': self.object.count_waiting_list_pending(), 'sum': False, }) if self.object.size is not None: data.append({ - 'label': ugettext('Currently for sale'), + 'label': gettext('Currently for sale'), 'value': avail[1], 'sum': False, 'strong': True diff --git a/src/pretix/control/views/main.py b/src/pretix/control/views/main.py index eebb207e13..9e1fea5d2d 100644 --- a/src/pretix/control/views/main.py +++ b/src/pretix/control/views/main.py @@ -10,7 +10,7 @@ from django.shortcuts import redirect from django.urls import reverse from django.utils.crypto import get_random_string from django.utils.functional import cached_property -from django.utils.translation import ugettext, ugettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _ from django.views import View from django.views.generic import ListView from i18nfield.strings import LazyI18nString @@ -284,7 +284,7 @@ class EventWizard(SafeSessionWizardView): if basics_data['tax_rate']: if not event.settings.tax_rate_default or event.settings.tax_rate_default.rate != basics_data['tax_rate']: event.settings.tax_rate_default = event.tax_rules.create( - name=LazyI18nString.from_gettext(ugettext('VAT')), + name=LazyI18nString.from_gettext(gettext('VAT')), rate=basics_data['tax_rate'] ) diff --git a/src/pretix/control/views/oauth.py b/src/pretix/control/views/oauth.py index 73a53759a8..458ecf6b16 100644 --- a/src/pretix/control/views/oauth.py +++ b/src/pretix/control/views/oauth.py @@ -5,7 +5,7 @@ from django.contrib import messages from django.http import HttpResponseRedirect from django.shortcuts import redirect from django.urls import reverse_lazy -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.generic import DetailView, ListView from oauth2_provider.generators import generate_client_secret from oauth2_provider.models import get_application_model diff --git a/src/pretix/control/views/orderimport.py b/src/pretix/control/views/orderimport.py index d3ce0ff783..0bac66b869 100644 --- a/src/pretix/control/views/orderimport.py +++ b/src/pretix/control/views/orderimport.py @@ -7,7 +7,7 @@ from django.shortcuts import get_object_or_404, redirect from django.urls import reverse from django.utils.functional import cached_property from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.generic import FormView, TemplateView from pretix.base.models import CachedFile diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index bcc2a84e0b..0a24cd22fe 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -26,7 +26,7 @@ from django.utils import formats from django.utils.functional import cached_property from django.utils.http import is_safe_url from django.utils.timezone import make_aware, now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.generic import ( DetailView, FormView, ListView, TemplateView, View, ) diff --git a/src/pretix/control/views/organizer.py b/src/pretix/control/views/organizer.py index 340eb63ecf..57c258468b 100644 --- a/src/pretix/control/views/organizer.py +++ b/src/pretix/control/views/organizer.py @@ -16,7 +16,7 @@ from django.http import JsonResponse from django.shortcuts import get_object_or_404, redirect from django.urls import reverse from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views import View from django.views.generic import ( CreateView, DeleteView, DetailView, FormView, ListView, UpdateView, @@ -935,7 +935,7 @@ class GiftCardListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi def get_queryset(self): qs = self.request.organizer.issued_gift_cards.annotate( cached_value=Coalesce(Sum('transactions__value'), Decimal('0.00')) - ) + ).order_by('-issuance') if self.filter_form.is_valid(): qs = self.filter_form.filter_qs(qs) return qs diff --git a/src/pretix/control/views/pdf.py b/src/pretix/control/views/pdf.py index 2a44d57fa5..4204963088 100644 --- a/src/pretix/control/views/pdf.py +++ b/src/pretix/control/views/pdf.py @@ -15,7 +15,7 @@ from django.shortcuts import get_object_or_404 from django.urls import reverse from django.utils.crypto import get_random_string from django.utils.timezone import now -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views.generic import TemplateView from PyPDF2 import PdfFileWriter from reportlab.lib.units import mm diff --git a/src/pretix/control/views/shredder.py b/src/pretix/control/views/shredder.py index 15fcac2855..6b511288b3 100644 --- a/src/pretix/control/views/shredder.py +++ b/src/pretix/control/views/shredder.py @@ -4,7 +4,7 @@ from collections import OrderedDict from django.shortcuts import get_object_or_404 from django.urls import reverse from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views import View from django.views.generic import TemplateView diff --git a/src/pretix/control/views/subevents.py b/src/pretix/control/views/subevents.py index 21e05df9c7..a6609b32c4 100644 --- a/src/pretix/control/views/subevents.py +++ b/src/pretix/control/views/subevents.py @@ -13,7 +13,7 @@ from django.shortcuts import redirect, render from django.urls import reverse from django.utils.functional import cached_property from django.utils.timezone import make_aware -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django.views import View from django.views.generic import CreateView, DeleteView, ListView, UpdateView diff --git a/src/pretix/control/views/typeahead.py b/src/pretix/control/views/typeahead.py index 74277729ab..2e5504bd67 100644 --- a/src/pretix/control/views/typeahead.py +++ b/src/pretix/control/views/typeahead.py @@ -10,7 +10,7 @@ from django.shortcuts import get_object_or_404 from django.urls import reverse from django.utils.formats import get_format from django.utils.timezone import make_aware -from django.utils.translation import pgettext, ugettext as _ +from django.utils.translation import gettext as _, pgettext from pretix.base.models import ( EventMetaProperty, EventMetaValue, ItemMetaProperty, ItemMetaValue, Order, diff --git a/src/pretix/control/views/user.py b/src/pretix/control/views/user.py index 9fff7b31dc..fb624215b2 100644 --- a/src/pretix/control/views/user.py +++ b/src/pretix/control/views/user.py @@ -15,9 +15,9 @@ from django.shortcuts import get_object_or_404, redirect from django.urls import reverse from django.utils.crypto import get_random_string from django.utils.functional import cached_property -from django.utils.http import is_safe_url +from django.utils.http import url_has_allowed_host_and_scheme from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views import View from django.views.generic import FormView, ListView, TemplateView, UpdateView from django_otp.plugins.otp_static.models import StaticDevice @@ -102,7 +102,7 @@ class ReauthView(TemplateView): request.session['pretix_auth_login_time'] = t request.session['pretix_auth_last_used'] = t next_url = get_auth_backends()[request.user.auth_backend].get_next_url(request) - if next_url and is_safe_url(next_url, allowed_hosts=None): + if next_url and url_has_allowed_host_and_scheme(next_url, allowed_hosts=None): return redirect(next_url) return redirect(reverse('control:index')) else: @@ -114,7 +114,7 @@ class ReauthView(TemplateView): u = backend.request_authenticate(request) if u and u == request.user: next_url = backend.get_next_url(request) - if next_url and is_safe_url(next_url, allowed_hosts=None): + if next_url and url_has_allowed_host_and_scheme(next_url, allowed_hosts=None): return redirect(next_url) return redirect(reverse('control:index')) return super().get(request, *args, **kwargs) @@ -700,7 +700,7 @@ class StartStaffSession(StaffMemberRequiredMixin, RecentAuthenticationRequiredMi session_key=request.session.session_key ) - if "next" in request.GET and is_safe_url(request.GET.get("next"), allowed_hosts=None): + if "next" in request.GET and url_has_allowed_host_and_scheme(request.GET.get("next"), allowed_hosts=None): return redirect(request.GET.get("next")) else: return redirect(reverse("control:index")) diff --git a/src/pretix/control/views/users.py b/src/pretix/control/views/users.py index 618de77776..105e43b64e 100644 --- a/src/pretix/control/views/users.py +++ b/src/pretix/control/views/users.py @@ -6,7 +6,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin from django.shortcuts import get_object_or_404, redirect from django.urls import reverse from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views import View from django.views.generic import ListView, TemplateView from hijack.helpers import login_user, release_hijack diff --git a/src/pretix/control/views/vouchers.py b/src/pretix/control/views/vouchers.py index ccd3417d95..dd8e8a1474 100644 --- a/src/pretix/control/views/vouchers.py +++ b/src/pretix/control/views/vouchers.py @@ -14,7 +14,7 @@ from django.urls import resolve, reverse from django.utils.functional import cached_property from django.utils.html import format_html from django.utils.safestring import mark_safe -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.generic import ( CreateView, DeleteView, ListView, TemplateView, UpdateView, View, ) diff --git a/src/pretix/control/views/waitinglist.py b/src/pretix/control/views/waitinglist.py index 945af0a75b..c2b86b358d 100644 --- a/src/pretix/control/views/waitinglist.py +++ b/src/pretix/control/views/waitinglist.py @@ -10,7 +10,7 @@ from django.shortcuts import redirect from django.urls import reverse from django.utils.http import is_safe_url from django.utils.timezone import now -from django.utils.translation import pgettext, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext from django.views import View from django.views.generic import ListView from django.views.generic.edit import DeleteView diff --git a/src/pretix/helpers/daterange.py b/src/pretix/helpers/daterange.py index c7fe0ac0f0..5fe48c8dd3 100644 --- a/src/pretix/helpers/daterange.py +++ b/src/pretix/helpers/daterange.py @@ -1,5 +1,5 @@ from django.template.defaultfilters import date as _date -from django.utils.translation import get_language, ugettext_lazy as _ +from django.utils.translation import get_language, gettext_lazy as _ def daterange(df, dt): diff --git a/src/pretix/helpers/dicts.py b/src/pretix/helpers/dicts.py index 6142833409..13b57c2fd3 100644 --- a/src/pretix/helpers/dicts.py +++ b/src/pretix/helpers/dicts.py @@ -7,3 +7,8 @@ def merge_dicts(*dict_args): for dictionary in dict_args: result.update(dictionary) return result + + +def move_to_end(d, k): + v = d.pop(k) + d[k] = v diff --git a/src/pretix/helpers/escapejson.py b/src/pretix/helpers/escapejson.py index abbe6d3d91..1658fa9a24 100644 --- a/src/pretix/helpers/escapejson.py +++ b/src/pretix/helpers/escapejson.py @@ -1,5 +1,4 @@ -from django.utils import six -from django.utils.encoding import force_text +from django.utils.encoding import force_str from django.utils.functional import keep_lazy from django.utils.safestring import SafeText, mark_safe @@ -19,13 +18,13 @@ _json_escapes_attr = { } -@keep_lazy(six.text_type, SafeText) +@keep_lazy(str, SafeText) def escapejson(value): """Hex encodes characters for use in a application/json type script.""" - return mark_safe(force_text(value).translate(_json_escapes)) + return mark_safe(force_str(value).translate(_json_escapes)) -@keep_lazy(six.text_type, SafeText) +@keep_lazy(str, SafeText) def escapejson_attr(value): """Hex encodes characters for use in a html attributw script.""" - return mark_safe(force_text(value).translate(_json_escapes_attr)) + return mark_safe(force_str(value).translate(_json_escapes_attr)) diff --git a/src/pretix/multidomain/models.py b/src/pretix/multidomain/models.py index b958b4a1c4..f1bef384cd 100644 --- a/src/pretix/multidomain/models.py +++ b/src/pretix/multidomain/models.py @@ -1,6 +1,6 @@ from django.core.cache import cache from django.db import models -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django_scopes import scopes_disabled from pretix.base.models import Event, Organizer diff --git a/src/pretix/multidomain/templatetags/eventurl.py b/src/pretix/multidomain/templatetags/eventurl.py index 8ac978652f..a87c4c44d1 100644 --- a/src/pretix/multidomain/templatetags/eventurl.py +++ b/src/pretix/multidomain/templatetags/eventurl.py @@ -3,7 +3,7 @@ from django.template import TemplateSyntaxError from django.template.base import kwarg_re from django.template.defaulttags import URLNode from django.urls import NoReverseMatch -from django.utils.encoding import smart_text +from django.utils.encoding import smart_str from django.utils.html import conditional_escape from pretix.multidomain.urlreverse import build_absolute_uri @@ -20,7 +20,7 @@ class EventURLNode(URLNode): def render(self, context): from pretix.multidomain.urlreverse import eventreverse kwargs = { - smart_text(k, 'ascii'): v.resolve(context) + smart_str(k, 'ascii'): v.resolve(context) for k, v in self.kwargs.items() } view_name = self.view_name.resolve(context) diff --git a/src/pretix/plugins/badges/__init__.py b/src/pretix/plugins/badges/__init__.py index 7084c8a734..bafe2da449 100644 --- a/src/pretix/plugins/badges/__init__.py +++ b/src/pretix/plugins/badges/__init__.py @@ -1,5 +1,5 @@ from django.apps import AppConfig -from django.utils.translation import ugettext, ugettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _ from pretix import __version__ as version @@ -21,7 +21,7 @@ class BadgesApp(AppConfig): def installed(self, event): if not event.badge_layouts.exists(): event.badge_layouts.create( - name=ugettext('Default'), + name=gettext('Default'), default=True, ) diff --git a/src/pretix/plugins/badges/exporters.py b/src/pretix/plugins/badges/exporters.py index 687dcd6c3d..5e24e95204 100644 --- a/src/pretix/plugins/badges/exporters.py +++ b/src/pretix/plugins/badges/exporters.py @@ -11,7 +11,7 @@ from django.core.files import File from django.core.files.storage import default_storage from django.db.models import Exists, OuterRef from django.db.models.functions import Coalesce -from django.utils.translation import ugettext as _, ugettext_lazy +from django.utils.translation import gettext as _, gettext_lazy from jsonfallback.functions import JSONExtract from reportlab.lib import pagesizes from reportlab.lib.units import mm @@ -38,7 +38,7 @@ def _renderer(event, layout): OPTIONS = OrderedDict([ ('one', { - 'name': ugettext_lazy('One badge per page'), + 'name': gettext_lazy('One badge per page'), 'cols': 1, 'rows': 1, 'margins': [0, 0, 0, 0], @@ -46,7 +46,7 @@ OPTIONS = OrderedDict([ 'pagesize': None, }), ('a4_a6l', { - 'name': ugettext_lazy('4 landscape A6 pages on one A4 page'), + 'name': gettext_lazy('4 landscape A6 pages on one A4 page'), 'cols': 2, 'rows': 2, 'margins': [0 * mm, 0 * mm, 0 * mm, 0 * mm], @@ -54,7 +54,7 @@ OPTIONS = OrderedDict([ 'pagesize': pagesizes.landscape(pagesizes.A4), }), ('a4_a6p', { - 'name': ugettext_lazy('4 portrait A6 pages on one A4 page'), + 'name': gettext_lazy('4 portrait A6 pages on one A4 page'), 'cols': 2, 'rows': 2, 'margins': [0 * mm, 0 * mm, 0 * mm, 0 * mm], @@ -62,7 +62,7 @@ OPTIONS = OrderedDict([ 'pagesize': pagesizes.portrait(pagesizes.A4), }), ('a4_a7l', { - 'name': ugettext_lazy('8 landscape A7 pages on one A4 page'), + 'name': gettext_lazy('8 landscape A7 pages on one A4 page'), 'cols': 2, 'rows': 4, 'margins': [0 * mm, 0 * mm, 0 * mm, 0 * mm], @@ -70,7 +70,7 @@ OPTIONS = OrderedDict([ 'pagesize': pagesizes.portrait(pagesizes.A4), }), ('a4_a7p', { - 'name': ugettext_lazy('8 portrait A7 pages on one A4 page'), + 'name': gettext_lazy('8 portrait A7 pages on one A4 page'), 'cols': 4, 'rows': 2, 'margins': [0 * mm, 0 * mm, 0 * mm, 0 * mm], diff --git a/src/pretix/plugins/badges/forms.py b/src/pretix/plugins/badges/forms.py index 52d664dfd1..99598b99b9 100644 --- a/src/pretix/plugins/badges/forms.py +++ b/src/pretix/plugins/badges/forms.py @@ -1,7 +1,7 @@ from django import forms from django.forms import Field from django.forms.models import ModelChoiceIterator -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.plugins.badges.models import BadgeItem, BadgeLayout diff --git a/src/pretix/plugins/badges/models.py b/src/pretix/plugins/badges/models.py index 57f32daee5..4826a1ad5b 100644 --- a/src/pretix/plugins/badges/models.py +++ b/src/pretix/plugins/badges/models.py @@ -2,7 +2,7 @@ import string from django.db import models from django.utils.crypto import get_random_string -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.models import LoggedModel diff --git a/src/pretix/plugins/badges/signals.py b/src/pretix/plugins/badges/signals.py index 3b29ec386a..71738595f7 100644 --- a/src/pretix/plugins/badges/signals.py +++ b/src/pretix/plugins/badges/signals.py @@ -6,7 +6,7 @@ from django.dispatch import receiver from django.template.loader import get_template from django.urls import resolve, reverse from django.utils.html import escape -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.models import Event, Order from pretix.base.signals import ( diff --git a/src/pretix/plugins/badges/views.py b/src/pretix/plugins/badges/views.py index 9cb5afad52..d6ceca9062 100644 --- a/src/pretix/plugins/badges/views.py +++ b/src/pretix/plugins/badges/views.py @@ -13,7 +13,7 @@ from django.templatetags.static import static from django.urls import reverse from django.utils.functional import cached_property from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views import View from django.views.generic import CreateView, DeleteView, DetailView, ListView from reportlab.lib import pagesizes diff --git a/src/pretix/plugins/banktransfer/__init__.py b/src/pretix/plugins/banktransfer/__init__.py index 3525335fc9..c93867e136 100644 --- a/src/pretix/plugins/banktransfer/__init__.py +++ b/src/pretix/plugins/banktransfer/__init__.py @@ -1,6 +1,6 @@ from django.apps import AppConfig from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix import __version__ as version diff --git a/src/pretix/plugins/banktransfer/payment.py b/src/pretix/plugins/banktransfer/payment.py index 326e037fec..5276684f10 100644 --- a/src/pretix/plugins/banktransfer/payment.py +++ b/src/pretix/plugins/banktransfer/payment.py @@ -6,7 +6,7 @@ from django import forms from django.core.exceptions import ValidationError from django.http import HttpRequest from django.template.loader import get_template -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from i18nfield.fields import I18nFormField, I18nTextarea from i18nfield.forms import I18nTextInput from i18nfield.strings import LazyI18nString diff --git a/src/pretix/plugins/banktransfer/signals.py b/src/pretix/plugins/banktransfer/signals.py index 1eaab52cf5..35e422aed7 100644 --- a/src/pretix/plugins/banktransfer/signals.py +++ b/src/pretix/plugins/banktransfer/signals.py @@ -1,7 +1,7 @@ from django.dispatch import receiver from django.template.loader import get_template from django.urls import resolve, reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.signals import register_payment_providers from pretix.control.signals import html_head, nav_event, nav_organizer diff --git a/src/pretix/plugins/banktransfer/tasks.py b/src/pretix/plugins/banktransfer/tasks.py index d11e5f9de8..b084ff5e3a 100644 --- a/src/pretix/plugins/banktransfer/tasks.py +++ b/src/pretix/plugins/banktransfer/tasks.py @@ -6,7 +6,7 @@ from celery.exceptions import MaxRetriesExceededError from django.conf import settings from django.db import transaction from django.db.models import Q -from django.utils.translation import ugettext, ugettext_noop +from django.utils.translation import gettext, gettext_noop from django_scopes import scope, scopes_disabled from pretix.base.email import get_email_context @@ -28,7 +28,7 @@ def notify_incomplete_payment(o: Order): with language(o.locale): email_template = o.event.settings.mail_text_order_expire_warning email_context = get_email_context(event=o.event, order=o) - email_subject = ugettext('Your order received an incomplete payment: %(code)s') % {'code': o.code} + email_subject = gettext('Your order received an incomplete payment: %(code)s') % {'code': o.code} try: o.send_mail( @@ -96,7 +96,7 @@ def _handle_transaction(trans: BankTransaction, code: str, event: Event=None, or trans.state = BankTransaction.STATE_DUPLICATE elif trans.order.status == Order.STATUS_CANCELED: trans.state = BankTransaction.STATE_ERROR - trans.message = ugettext_noop('The order has already been canceled.') + trans.message = gettext_noop('The order has already been canceled.') else: try: p, created = trans.order.payments.get_or_create( diff --git a/src/pretix/plugins/banktransfer/views.py b/src/pretix/plugins/banktransfer/views.py index 1e85d064ed..40bafbc685 100644 --- a/src/pretix/plugins/banktransfer/views.py +++ b/src/pretix/plugins/banktransfer/views.py @@ -12,7 +12,7 @@ from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.functional import cached_property from django.utils.timezone import now -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views.generic import DetailView, ListView, View from pretix.base.models import Order, OrderPayment, OrderRefund, Quota diff --git a/src/pretix/plugins/checkinlists/__init__.py b/src/pretix/plugins/checkinlists/__init__.py index d5daabe732..f879e5d2e3 100644 --- a/src/pretix/plugins/checkinlists/__init__.py +++ b/src/pretix/plugins/checkinlists/__init__.py @@ -1,6 +1,6 @@ from django.apps import AppConfig from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix import __version__ as version diff --git a/src/pretix/plugins/checkinlists/exporters.py b/src/pretix/plugins/checkinlists/exporters.py index db5c1ca0de..a41e5973e9 100644 --- a/src/pretix/plugins/checkinlists/exporters.py +++ b/src/pretix/plugins/checkinlists/exporters.py @@ -10,7 +10,7 @@ from django.db.models.functions import Coalesce, NullIf from django.urls import reverse from django.utils.formats import date_format from django.utils.timezone import is_aware, make_aware -from django.utils.translation import pgettext, ugettext as _, ugettext_lazy +from django.utils.translation import gettext as _, gettext_lazy, pgettext from jsonfallback.functions import JSONExtract from pytz import UTC from reportlab.lib.units import mm @@ -180,7 +180,7 @@ class TableTextRotate(Flowable): class PDFCheckinList(ReportlabExportMixin, CheckInListMixin, BaseExporter): name = "overview" identifier = 'checkinlistpdf' - verbose_name = ugettext_lazy('Check-in list (PDF)') + verbose_name = gettext_lazy('Check-in list (PDF)') @property def export_form_fields(self): @@ -312,7 +312,7 @@ class PDFCheckinList(ReportlabExportMixin, CheckInListMixin, BaseExporter): class CSVCheckinList(CheckInListMixin, ListExporter): name = "overview" identifier = 'checkinlist' - verbose_name = ugettext_lazy('Check-in list') + verbose_name = gettext_lazy('Check-in list') @property def additional_form_fields(self): diff --git a/src/pretix/plugins/manualpayment/__init__.py b/src/pretix/plugins/manualpayment/__init__.py index 8cbb29667a..20339a0250 100644 --- a/src/pretix/plugins/manualpayment/__init__.py +++ b/src/pretix/plugins/manualpayment/__init__.py @@ -1,5 +1,5 @@ from django.apps import AppConfig -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix import __version__ as version diff --git a/src/pretix/plugins/paypal/__init__.py b/src/pretix/plugins/paypal/__init__.py index 1b7ba11711..66a611d7a5 100644 --- a/src/pretix/plugins/paypal/__init__.py +++ b/src/pretix/plugins/paypal/__init__.py @@ -1,6 +1,6 @@ from django.apps import AppConfig from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix import __version__ as version diff --git a/src/pretix/plugins/paypal/payment.py b/src/pretix/plugins/paypal/payment.py index b7d956697e..ade28b0b9d 100644 --- a/src/pretix/plugins/paypal/payment.py +++ b/src/pretix/plugins/paypal/payment.py @@ -10,7 +10,7 @@ from django.core import signing from django.http import HttpRequest from django.template.loader import get_template from django.urls import reverse -from django.utils.translation import ugettext as __, ugettext_lazy as _ +from django.utils.translation import gettext as __, gettext_lazy as _ from i18nfield.strings import LazyI18nString from paypalrestsdk.exceptions import BadRequest from paypalrestsdk.openid_connect import Tokeninfo diff --git a/src/pretix/plugins/paypal/signals.py b/src/pretix/plugins/paypal/signals.py index 3cce4b4d4a..3533732213 100644 --- a/src/pretix/plugins/paypal/signals.py +++ b/src/pretix/plugins/paypal/signals.py @@ -4,7 +4,7 @@ from collections import OrderedDict from django import forms from django.dispatch import receiver from django.template.loader import get_template -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.signals import ( logentry_display, register_global_settings, register_payment_providers, diff --git a/src/pretix/plugins/paypal/views.py b/src/pretix/plugins/paypal/views.py index 26fb5133a2..de8fd4467c 100644 --- a/src/pretix/plugins/paypal/views.py +++ b/src/pretix/plugins/paypal/views.py @@ -9,7 +9,7 @@ from django.db.models import Sum from django.http import HttpResponse, HttpResponseBadRequest from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.decorators.clickjacking import xframe_options_exempt from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_POST diff --git a/src/pretix/plugins/pretixdroid/__init__.py b/src/pretix/plugins/pretixdroid/__init__.py index 3018f6c605..fb44532767 100644 --- a/src/pretix/plugins/pretixdroid/__init__.py +++ b/src/pretix/plugins/pretixdroid/__init__.py @@ -1,5 +1,5 @@ from django.apps import AppConfig -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix import __version__ as version diff --git a/src/pretix/plugins/pretixdroid/forms.py b/src/pretix/plugins/pretixdroid/forms.py index c0eb3e9e08..6e3a0016f8 100644 --- a/src/pretix/plugins/pretixdroid/forms.py +++ b/src/pretix/plugins/pretixdroid/forms.py @@ -1,6 +1,6 @@ from django import forms from django.urls import reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django_scopes.forms import ( SafeModelChoiceField, SafeModelMultipleChoiceField, ) diff --git a/src/pretix/plugins/pretixdroid/models.py b/src/pretix/plugins/pretixdroid/models.py index 15239ae02f..266076d22f 100644 --- a/src/pretix/plugins/pretixdroid/models.py +++ b/src/pretix/plugins/pretixdroid/models.py @@ -2,7 +2,7 @@ import string from django.db import models from django.utils.crypto import get_random_string -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ class AppConfiguration(models.Model): diff --git a/src/pretix/plugins/pretixdroid/signals.py b/src/pretix/plugins/pretixdroid/signals.py index 02a79deca5..a2a9e8c5e7 100644 --- a/src/pretix/plugins/pretixdroid/signals.py +++ b/src/pretix/plugins/pretixdroid/signals.py @@ -1,7 +1,7 @@ from django.dispatch import receiver from django.urls import resolve, reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.signals import logentry_display from pretix.control.logdisplay import _display_checkin diff --git a/src/pretix/plugins/pretixdroid/views.py b/src/pretix/plugins/pretixdroid/views.py index 5523cbb154..6cc7ec8286 100644 --- a/src/pretix/plugins/pretixdroid/views.py +++ b/src/pretix/plugins/pretixdroid/views.py @@ -14,7 +14,7 @@ from django.urls import reverse from django.utils.decorators import method_decorator from django.utils.functional import cached_property from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.decorators.csrf import csrf_exempt from django.views.generic import TemplateView, View from django_scopes import scope, scopes_disabled diff --git a/src/pretix/plugins/reports/__init__.py b/src/pretix/plugins/reports/__init__.py index 55a32dc93a..f90fea9ccb 100644 --- a/src/pretix/plugins/reports/__init__.py +++ b/src/pretix/plugins/reports/__init__.py @@ -1,6 +1,6 @@ from django.apps import AppConfig from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix import __version__ as version diff --git a/src/pretix/plugins/reports/exporters.py b/src/pretix/plugins/reports/exporters.py index a72c084d85..dd15befe7e 100644 --- a/src/pretix/plugins/reports/exporters.py +++ b/src/pretix/plugins/reports/exporters.py @@ -12,7 +12,7 @@ from django.db.models import Max, OuterRef, Subquery, Sum from django.template.defaultfilters import floatformat from django.utils.formats import date_format, localize from django.utils.timezone import get_current_timezone, now -from django.utils.translation import pgettext, ugettext as _, ugettext_lazy +from django.utils.translation import gettext as _, gettext_lazy, pgettext from reportlab.lib import colors from pretix.base.decimal import round_decimal @@ -150,7 +150,7 @@ class Report(ReportlabExportMixin, BaseExporter): class OverviewReport(Report): name = "overview" identifier = 'pdfreport' - verbose_name = ugettext_lazy('Order overview (PDF)') + verbose_name = gettext_lazy('Order overview (PDF)') @property def pagesize(self): @@ -296,7 +296,7 @@ class OverviewReport(Report): class OrderTaxListReportPDF(Report): name = "ordertaxlist" identifier = 'ordertaxes' - verbose_name = ugettext_lazy('List of orders with taxes (PDF)') + verbose_name = gettext_lazy('List of orders with taxes (PDF)') @property def export_form_fields(self): @@ -304,7 +304,7 @@ class OrderTaxListReportPDF(Report): [ ('status', forms.MultipleChoiceField( - label=ugettext_lazy('Filter by status'), + label=gettext_lazy('Filter by status'), initial=[Order.STATUS_PAID], choices=Order.STATUS_CHOICE, widget=forms.CheckboxSelectMultiple, @@ -312,11 +312,11 @@ class OrderTaxListReportPDF(Report): )), ('sort', forms.ChoiceField( - label=ugettext_lazy('Sort by'), + label=gettext_lazy('Sort by'), initial='datetime', choices=( - ('datetime', ugettext_lazy('Order date')), - ('payment_date', ugettext_lazy('Payment date')), + ('datetime', gettext_lazy('Order date')), + ('payment_date', gettext_lazy('Payment date')), ), widget=forms.RadioSelect, required=False @@ -467,7 +467,7 @@ class OrderTaxListReportPDF(Report): class OrderTaxListReport(ListExporter): identifier = 'ordertaxeslist' - verbose_name = ugettext_lazy('List of orders with taxes') + verbose_name = gettext_lazy('List of orders with taxes') @property def export_form_fields(self): @@ -487,8 +487,8 @@ class OrderTaxListReport(ListExporter): label=_('Sort by'), initial='datetime', choices=( - ('datetime', ugettext_lazy('Order date')), - ('payment_date', ugettext_lazy('Payment date')), + ('datetime', gettext_lazy('Order date')), + ('payment_date', gettext_lazy('Payment date')), ), widget=forms.RadioSelect, required=False diff --git a/src/pretix/plugins/returnurl/__init__.py b/src/pretix/plugins/returnurl/__init__.py index a17d17b0a2..1113116fdc 100644 --- a/src/pretix/plugins/returnurl/__init__.py +++ b/src/pretix/plugins/returnurl/__init__.py @@ -1,5 +1,5 @@ from django.apps import AppConfig -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix import __version__ as version diff --git a/src/pretix/plugins/returnurl/signals.py b/src/pretix/plugins/returnurl/signals.py index 9108ebabf4..3c2aee0e15 100644 --- a/src/pretix/plugins/returnurl/signals.py +++ b/src/pretix/plugins/returnurl/signals.py @@ -2,7 +2,7 @@ from django.core.exceptions import PermissionDenied from django.dispatch import receiver from django.shortcuts import redirect from django.urls import resolve, reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.control.signals import nav_event_settings from pretix.presale.signals import process_request diff --git a/src/pretix/plugins/returnurl/views.py b/src/pretix/plugins/returnurl/views.py index 1079d086b7..2dbe47af3c 100644 --- a/src/pretix/plugins/returnurl/views.py +++ b/src/pretix/plugins/returnurl/views.py @@ -1,6 +1,6 @@ from django import forms from django.urls import reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.forms import SettingsForm from pretix.base.models import Event diff --git a/src/pretix/plugins/sendmail/__init__.py b/src/pretix/plugins/sendmail/__init__.py index 36b2c85cac..c5e7cb10a0 100644 --- a/src/pretix/plugins/sendmail/__init__.py +++ b/src/pretix/plugins/sendmail/__init__.py @@ -1,5 +1,5 @@ from django.apps import AppConfig -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix import __version__ as version diff --git a/src/pretix/plugins/sendmail/forms.py b/src/pretix/plugins/sendmail/forms.py index 1ff285e65a..adef3662b4 100644 --- a/src/pretix/plugins/sendmail/forms.py +++ b/src/pretix/plugins/sendmail/forms.py @@ -1,6 +1,6 @@ from django import forms from django.urls import reverse -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django_scopes.forms import SafeModelMultipleChoiceField from i18nfield.forms import I18nFormField, I18nTextarea, I18nTextInput diff --git a/src/pretix/plugins/sendmail/signals.py b/src/pretix/plugins/sendmail/signals.py index 25edf4bd17..d9e74ae6b7 100644 --- a/src/pretix/plugins/sendmail/signals.py +++ b/src/pretix/plugins/sendmail/signals.py @@ -1,6 +1,6 @@ from django.dispatch import receiver from django.urls import resolve, reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.signals import logentry_display from pretix.control.signals import nav_event diff --git a/src/pretix/plugins/sendmail/views.py b/src/pretix/plugins/sendmail/views.py index 2df26cc0ce..db71dae427 100644 --- a/src/pretix/plugins/sendmail/views.py +++ b/src/pretix/plugins/sendmail/views.py @@ -6,7 +6,7 @@ from django.db.models import Exists, OuterRef, Q from django.http import Http404 from django.shortcuts import redirect from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.generic import FormView, ListView from pretix.base.email import get_available_placeholders diff --git a/src/pretix/plugins/statistics/__init__.py b/src/pretix/plugins/statistics/__init__.py index eb7d476351..5a06196f54 100644 --- a/src/pretix/plugins/statistics/__init__.py +++ b/src/pretix/plugins/statistics/__init__.py @@ -1,5 +1,5 @@ from django.apps import AppConfig -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix import __version__ as version diff --git a/src/pretix/plugins/statistics/signals.py b/src/pretix/plugins/statistics/signals.py index 2e39cddf77..14f271cf10 100644 --- a/src/pretix/plugins/statistics/signals.py +++ b/src/pretix/plugins/statistics/signals.py @@ -1,6 +1,6 @@ from django.dispatch import receiver from django.urls import resolve, reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.signals import order_paid, order_placed from pretix.control.signals import nav_event diff --git a/src/pretix/plugins/stripe/__init__.py b/src/pretix/plugins/stripe/__init__.py index dd5075b8b1..ac7218a144 100644 --- a/src/pretix/plugins/stripe/__init__.py +++ b/src/pretix/plugins/stripe/__init__.py @@ -1,6 +1,6 @@ from django.apps import AppConfig from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix import __version__ as version diff --git a/src/pretix/plugins/stripe/forms.py b/src/pretix/plugins/stripe/forms.py index 82bb386cfc..e94db52336 100644 --- a/src/pretix/plugins/stripe/forms.py +++ b/src/pretix/plugins/stripe/forms.py @@ -1,5 +1,5 @@ from django import forms -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.forms import SettingsForm diff --git a/src/pretix/plugins/stripe/payment.py b/src/pretix/plugins/stripe/payment.py index 73440f56ed..2dbd26e64f 100644 --- a/src/pretix/plugins/stripe/payment.py +++ b/src/pretix/plugins/stripe/payment.py @@ -17,7 +17,7 @@ from django.urls import reverse from django.utils.crypto import get_random_string from django.utils.safestring import mark_safe from django.utils.timezone import now -from django.utils.translation import pgettext, ugettext, ugettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _, pgettext from django_countries import countries from pretix import __version__ @@ -882,7 +882,7 @@ class StripeGiropay(StripeMethod): 'code': payment.order.code }, owner={ - 'name': request.session.get('payment_stripe_giropay_account') or ugettext('unknown name') + 'name': request.session.get('payment_stripe_giropay_account') or gettext('unknown name') }, statement_descriptor=self.statement_descriptor(payment, 35), redirect={ @@ -1033,7 +1033,7 @@ class StripeBancontact(StripeMethod): 'code': payment.order.code }, owner={ - 'name': request.session.get('payment_stripe_bancontact_account') or ugettext('unknown name') + 'name': request.session.get('payment_stripe_bancontact_account') or gettext('unknown name') }, statement_descriptor=self.statement_descriptor(payment, 35), redirect={ @@ -1166,7 +1166,7 @@ class StripeEPS(StripeMethod): 'code': payment.order.code }, owner={ - 'name': request.session.get('payment_stripe_eps_account') or ugettext('unknown name') + 'name': request.session.get('payment_stripe_eps_account') or gettext('unknown name') }, statement_descriptor=self.statement_descriptor(payment), redirect={ diff --git a/src/pretix/plugins/stripe/signals.py b/src/pretix/plugins/stripe/signals.py index 5622d9b2d8..ff22f6b9af 100644 --- a/src/pretix/plugins/stripe/signals.py +++ b/src/pretix/plugins/stripe/signals.py @@ -5,7 +5,7 @@ from django import forms from django.dispatch import receiver from django.template.loader import get_template from django.urls import resolve, reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.settings import settings_hierarkey from pretix.base.signals import ( diff --git a/src/pretix/plugins/stripe/views.py b/src/pretix/plugins/stripe/views.py index 04ab77e6f6..b874b7af9e 100644 --- a/src/pretix/plugins/stripe/views.py +++ b/src/pretix/plugins/stripe/views.py @@ -12,7 +12,7 @@ from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.decorators import method_decorator from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views import View from django.views.decorators.clickjacking import xframe_options_exempt from django.views.decorators.csrf import csrf_exempt diff --git a/src/pretix/plugins/ticketoutputpdf/__init__.py b/src/pretix/plugins/ticketoutputpdf/__init__.py index e3ed212278..6cd267bad9 100644 --- a/src/pretix/plugins/ticketoutputpdf/__init__.py +++ b/src/pretix/plugins/ticketoutputpdf/__init__.py @@ -1,6 +1,6 @@ from django.apps import AppConfig from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix import __version__ as version diff --git a/src/pretix/plugins/ticketoutputpdf/exporters.py b/src/pretix/plugins/ticketoutputpdf/exporters.py index 0a094bb372..f0a6124bce 100644 --- a/src/pretix/plugins/ticketoutputpdf/exporters.py +++ b/src/pretix/plugins/ticketoutputpdf/exporters.py @@ -5,7 +5,7 @@ from django import forms from django.conf import settings from django.core.files.base import ContentFile from django.db.models.functions import Coalesce -from django.utils.translation import ugettext as _, ugettext_lazy +from django.utils.translation import gettext as _, gettext_lazy from jsonfallback.functions import JSONExtract from PyPDF2.merger import PdfFileMerger @@ -19,7 +19,7 @@ from .ticketoutput import PdfTicketOutput class AllTicketsPDF(BaseExporter): name = "alltickets" - verbose_name = ugettext_lazy("All PDF tickets in one file") + verbose_name = gettext_lazy("All PDF tickets in one file") identifier = "pdfoutput_all_tickets" @property diff --git a/src/pretix/plugins/ticketoutputpdf/forms.py b/src/pretix/plugins/ticketoutputpdf/forms.py index a17afb9e1e..369391e205 100644 --- a/src/pretix/plugins/ticketoutputpdf/forms.py +++ b/src/pretix/plugins/ticketoutputpdf/forms.py @@ -1,5 +1,5 @@ from django import forms -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.services import tickets diff --git a/src/pretix/plugins/ticketoutputpdf/models.py b/src/pretix/plugins/ticketoutputpdf/models.py index 15b0e485bf..f643f5dacf 100644 --- a/src/pretix/plugins/ticketoutputpdf/models.py +++ b/src/pretix/plugins/ticketoutputpdf/models.py @@ -2,7 +2,7 @@ import string from django.db import models from django.utils.crypto import get_random_string -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.models import LoggedModel diff --git a/src/pretix/plugins/ticketoutputpdf/signals.py b/src/pretix/plugins/ticketoutputpdf/signals.py index 21f499f3ca..0dd51494de 100644 --- a/src/pretix/plugins/ticketoutputpdf/signals.py +++ b/src/pretix/plugins/ticketoutputpdf/signals.py @@ -4,7 +4,7 @@ import json from django.dispatch import receiver from django.urls import reverse from django.utils.html import escape -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.channels import get_all_sales_channels from pretix.base.signals import ( # NOQA: legacy import diff --git a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py index 2acec88d31..a3e4a26715 100644 --- a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py +++ b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py @@ -9,7 +9,7 @@ from django.core.files.storage import default_storage from django.http import HttpRequest from django.template.loader import get_template from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from PyPDF2 import PdfFileMerger from pretix.base.i18n import language diff --git a/src/pretix/plugins/ticketoutputpdf/views.py b/src/pretix/plugins/ticketoutputpdf/views.py index 6d6ee7261d..4f6d30e840 100644 --- a/src/pretix/plugins/ticketoutputpdf/views.py +++ b/src/pretix/plugins/ticketoutputpdf/views.py @@ -12,7 +12,7 @@ from django.shortcuts import redirect from django.templatetags.static import static from django.urls import reverse from django.utils.functional import cached_property -from django.utils.translation import gettext, ugettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _ from django.views import View from django.views.generic import CreateView, DeleteView, DetailView, ListView from reportlab.lib import pagesizes diff --git a/src/pretix/presale/checkoutflow.py b/src/pretix/presale/checkoutflow.py index cd519bd75a..d52b3be827 100644 --- a/src/pretix/presale/checkoutflow.py +++ b/src/pretix/presale/checkoutflow.py @@ -10,7 +10,7 @@ from django.shortcuts import redirect from django.utils import translation from django.utils.functional import cached_property from django.utils.translation import ( - get_language, pgettext_lazy, ugettext_lazy as _, + get_language, gettext_lazy as _, pgettext_lazy, ) from django.views.generic.base import TemplateResponseMixin from django_scopes import scopes_disabled diff --git a/src/pretix/presale/forms/checkout.py b/src/pretix/presale/forms/checkout.py index 16542b74b2..9dc533de07 100644 --- a/src/pretix/presale/forms/checkout.py +++ b/src/pretix/presale/forms/checkout.py @@ -3,11 +3,11 @@ from itertools import chain from django import forms from django.core.exceptions import ValidationError from django.db.models import Count, Prefetch -from django.utils.encoding import force_text +from django.utils.encoding import force_str from django.utils.formats import number_format from django.utils.html import escape from django.utils.safestring import mark_safe -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.forms.questions import ( BaseInvoiceAddressForm, BaseQuestionsForm, @@ -105,7 +105,7 @@ class AddOnRadioSelect(forms.RadioSelect): groups.append((group_name, subgroup, index)) selected = ( - force_text(option_value) in value and + force_str(option_value) in value and (has_selected is False or self.allow_multiple_selected) ) if selected is True and has_selected is False: @@ -121,9 +121,9 @@ class AddOnRadioSelect(forms.RadioSelect): class AddOnVariationField(forms.ChoiceField): def valid_value(self, value): - text_value = force_text(value) + text_value = force_str(value) for k, v, d in self.choices: - if value == k or text_value == force_text(k): + if value == k or text_value == force_str(k): return True return False diff --git a/src/pretix/presale/forms/user.py b/src/pretix/presale/forms/user.py index 7790b48014..133c783b58 100644 --- a/src/pretix/presale/forms/user.py +++ b/src/pretix/presale/forms/user.py @@ -1,5 +1,5 @@ from django import forms -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ class ResendLinkForm(forms.Form): diff --git a/src/pretix/presale/ical.py b/src/pretix/presale/ical.py index 2676dcadde..4cb7888407 100644 --- a/src/pretix/presale/ical.py +++ b/src/pretix/presale/ical.py @@ -5,7 +5,7 @@ import pytz import vobject from django.conf import settings from django.utils.formats import date_format -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from pretix.base.models import Event from pretix.multidomain.urlreverse import build_absolute_uri diff --git a/src/pretix/presale/utils.py b/src/pretix/presale/utils.py index bd9b419d37..80c47eb25a 100644 --- a/src/pretix/presale/utils.py +++ b/src/pretix/presale/utils.py @@ -8,7 +8,7 @@ from django.http import Http404 from django.shortcuts import redirect from django.template.response import TemplateResponse from django.urls import resolve -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django_scopes import scope from pretix.base.channels import WebshopSalesChannel diff --git a/src/pretix/presale/views/__init__.py b/src/pretix/presale/views/__init__.py index a57b79ca10..3ba77ee44a 100644 --- a/src/pretix/presale/views/__init__.py +++ b/src/pretix/presale/views/__init__.py @@ -6,7 +6,6 @@ from itertools import groupby from django.conf import settings from django.db.models import Prefetch, Sum -from django.utils.decorators import available_attrs from django.utils.functional import cached_property from django.utils.timezone import now from django_scopes import scopes_disabled @@ -282,7 +281,7 @@ def allow_frame_if_namespaced(view_func): if request.resolver_match and request.resolver_match.kwargs.get('cart_namespace'): resp.xframe_options_exempt = True return resp - return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view) + return wraps(view_func)(wrapped_view) def allow_cors_if_namespaced(view_func): @@ -295,7 +294,7 @@ def allow_cors_if_namespaced(view_func): if request.resolver_match and request.resolver_match.kwargs.get('cart_namespace'): resp['Access-Control-Allow-Origin'] = '*' return resp - return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view) + return wraps(view_func)(wrapped_view) def iframe_entry_view_wrapper(view_func): @@ -321,4 +320,4 @@ def iframe_entry_view_wrapper(view_func): resp = view_func(request, *args, **kwargs) return resp - return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view) + return wraps(view_func)(wrapped_view) diff --git a/src/pretix/presale/views/cart.py b/src/pretix/presale/views/cart.py index 2d6932d560..dbcf5a8725 100644 --- a/src/pretix/presale/views/cart.py +++ b/src/pretix/presale/views/cart.py @@ -14,7 +14,7 @@ from django.utils.decorators import method_decorator from django.utils.functional import cached_property from django.utils.http import is_safe_url from django.utils.timezone import now -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views.decorators.clickjacking import xframe_options_exempt from django.views.generic import TemplateView, View from django_scopes import scopes_disabled diff --git a/src/pretix/presale/views/checkout.py b/src/pretix/presale/views/checkout.py index bf00778275..354961db01 100644 --- a/src/pretix/presale/views/checkout.py +++ b/src/pretix/presale/views/checkout.py @@ -4,7 +4,7 @@ from django.contrib import messages from django.http import Http404 from django.shortcuts import redirect from django.utils.decorators import method_decorator -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.generic import View from pretix.base.services.cart import CartError diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index 6d8bcdb41f..104f93153c 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -12,7 +12,7 @@ from django.http import Http404, HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.utils.decorators import method_decorator from django.utils.timezone import now -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django.views import View from django.views.decorators.csrf import csrf_exempt from django.views.generic import TemplateView diff --git a/src/pretix/presale/views/locale.py b/src/pretix/presale/views/locale.py index c1fa5d2d3c..583f1d6897 100644 --- a/src/pretix/presale/views/locale.py +++ b/src/pretix/presale/views/locale.py @@ -2,7 +2,7 @@ from datetime import datetime, timedelta from django.conf import settings from django.http import HttpResponseRedirect -from django.utils.http import is_safe_url +from django.utils.http import url_has_allowed_host_and_scheme from django.views.generic import View from pretix.helpers.cookies import set_cookie_without_samesite @@ -14,7 +14,7 @@ class LocaleSet(NoSearchIndexViewMixin, View): def get(self, request, *args, **kwargs): url = request.GET.get('next', request.headers.get('Referer', '/')) - url = url if is_safe_url(url, allowed_hosts=[request.get_host()]) else '/' + url = url if url_has_allowed_host_and_scheme(url, allowed_hosts=[request.get_host()]) else '/' resp = HttpResponseRedirect(url) locale = request.GET.get('locale') diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index 9b78a1182a..dbde96c69f 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -15,7 +15,7 @@ from django.shortcuts import get_object_or_404, redirect from django.utils.decorators import method_decorator from django.utils.functional import cached_property from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.decorators.clickjacking import xframe_options_exempt from django.views.generic import TemplateView, View diff --git a/src/pretix/presale/views/user.py b/src/pretix/presale/views/user.py index 12103e55cd..a032b098e5 100644 --- a/src/pretix/presale/views/user.py +++ b/src/pretix/presale/views/user.py @@ -4,7 +4,7 @@ from django.conf import settings from django.contrib import messages from django.shortcuts import redirect from django.utils.functional import cached_property -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views import View from django.views.generic import TemplateView diff --git a/src/pretix/presale/views/waiting.py b/src/pretix/presale/views/waiting.py index 40b5286d1d..8e6f99dc34 100644 --- a/src/pretix/presale/views/waiting.py +++ b/src/pretix/presale/views/waiting.py @@ -4,7 +4,7 @@ from django.shortcuts import get_object_or_404, redirect, render from django.utils import translation from django.utils.decorators import method_decorator from django.utils.functional import cached_property -from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django.views.generic import FormView from pretix.base.models.event import SubEvent diff --git a/src/pretix/presale/views/widget.py b/src/pretix/presale/views/widget.py index ae9479c8f8..115d56185a 100644 --- a/src/pretix/presale/views/widget.py +++ b/src/pretix/presale/views/widget.py @@ -18,7 +18,7 @@ from django.template import Context, Engine from django.template.loader import get_template from django.utils.formats import date_format from django.utils.timezone import now -from django.utils.translation import get_language, pgettext, ugettext +from django.utils.translation import get_language, gettext, pgettext from django.utils.translation.trans_real import DjangoTranslation from django.views import View from django.views.decorators.cache import cache_page @@ -27,7 +27,7 @@ from django.views.decorators.http import condition from django.views.i18n import ( JavaScriptCatalog, get_formats, js_catalog_template, ) -from lxml import etree +from lxml import html from pretix.base.i18n import language from pretix.base.models import CartPosition, Event, Quota, SubEvent, Voucher @@ -74,7 +74,7 @@ def widget_css(request, **kwargs): return resp else: tpl = get_template('pretixpresale/widget_dummy.html') - et = etree.fromstring(tpl.render({})).attrib['href'].replace(settings.STATIC_URL, '') + et = html.fromstring(tpl.render({})).xpath('/html/head/link')[0].attrib['href'].replace(settings.STATIC_URL, '') f = finders.find(et) resp = FileResponse(open(f, 'rb'), content_type='text/css') return resp @@ -274,7 +274,7 @@ class WidgetAPIProductList(EventListMixin, View): if not request.event.live: return self.response({ - 'error': ugettext('This ticket shop is currently disabled.') + 'error': gettext('This ticket shop is currently disabled.') }) self.subevent = None @@ -283,14 +283,14 @@ class WidgetAPIProductList(EventListMixin, View): self.subevent = request.event.subevents.filter(pk=kwargs['subevent'], active=True).first() if not self.subevent: return self.response({ - 'error': ugettext('The selected date does not exist in this event series.') + 'error': gettext('The selected date does not exist in this event series.') }) else: return self._get_event_list(request, **kwargs) else: if 'subevent' in kwargs: return self.response({ - 'error': ugettext('This is not an event series.') + 'error': gettext('This is not an event series.') }) return self._get_event_view(request, **kwargs) @@ -306,28 +306,28 @@ class WidgetAPIProductList(EventListMixin, View): if ev.presale_is_running and event.settings.event_list_availability and ev.best_availability_state is not None: if ev.best_availability_state == Quota.AVAILABILITY_OK: availability['color'] = 'green' - availability['text'] = ugettext('Book now') + availability['text'] = gettext('Book now') elif event.settings.waiting_list_enabled and ev.best_availability_state >= 0: availability['color'] = 'orange' - availability['text'] = ugettext('Waiting list') + availability['text'] = gettext('Waiting list') elif ev.best_availability_state == Quota.AVAILABILITY_RESERVED: availability['color'] = 'orange' - availability['text'] = ugettext('Reserved') + availability['text'] = gettext('Reserved') elif ev.best_availability_state < Quota.AVAILABILITY_RESERVED: availability['color'] = 'red' - availability['text'] = ugettext('Sold out') + availability['text'] = gettext('Sold out') elif ev.presale_is_running: availability['color'] = 'green' - availability['text'] = ugettext('Book now') + availability['text'] = gettext('Book now') elif ev.presale_has_ended: availability['color'] = 'red' - availability['text'] = ugettext('Sale over') + availability['text'] = gettext('Sale over') elif event.settings.presale_start_show_date and ev.presale_start: availability['color'] = 'orange' - availability['text'] = ugettext('from %(start_date)s') % {'start_date': date_format(ev.presale_start, "SHORT_DATE_FORMAT")} + availability['text'] = gettext('from %(start_date)s') % {'start_date': date_format(ev.presale_start, "SHORT_DATE_FORMAT")} else: availability['color'] = 'orange' - availability['text'] = ugettext('Sale soon') + availability['text'] = gettext('Sale soon') return availability def _serialize_events(self, ebd): @@ -442,7 +442,7 @@ class WidgetAPIProductList(EventListMixin, View): event.min_from.astimezone(tz), (event.max_fromto or event.max_to or event.max_from).astimezone(tz) ) - avail = {'color': 'none', 'text': ugettext('Event series')} + avail = {'color': 'none', 'text': gettext('Event series')} else: dr = event.get_date_range_display(tz) + ( " " + event.get_time_from_display(tz) if event.settings.show_times else "" @@ -498,14 +498,14 @@ class WidgetAPIProductList(EventListMixin, View): if request.event.settings.presale_has_ended_text: data['error'] = str(request.event.settings.presale_has_ended_text) else: - data['error'] = ugettext('The presale period for this event is over.') + data['error'] = gettext('The presale period for this event is over.') elif request.event.settings.presale_start_show_date: - data['error'] = ugettext('The presale for this event will start on %(date)s at %(time)s.') % { + data['error'] = gettext('The presale for this event will start on %(date)s at %(time)s.') % { 'date': date_format(ev.presale_start.astimezone(request.event.timezone), "SHORT_DATE_FORMAT"), 'time': date_format(ev.presale_start.astimezone(request.event.timezone), "TIME_FORMAT"), } else: - data['error'] = ugettext('The presale for this event has not yet started.') + data['error'] = gettext('The presale for this event has not yet started.') self.voucher = None if 'voucher' in request.GET: diff --git a/src/pretix/settings.py b/src/pretix/settings.py index a15b7e6771..6ef0031ac9 100644 --- a/src/pretix/settings.py +++ b/src/pretix/settings.py @@ -11,7 +11,7 @@ from pycountry import currencies import django.conf.locale from django.contrib.messages import constants as messages # NOQA from django.utils.crypto import get_random_string -from django.utils.translation import ugettext_lazy as _ # NOQA +from django.utils.translation import gettext_lazy as _ # NOQA from pkg_resources import iter_entry_points from . import __version__ diff --git a/src/requirements/dev.txt b/src/requirements/dev.txt index 2bc07a1732..3dd6a66c39 100644 --- a/src/requirements/dev.txt +++ b/src/requirements/dev.txt @@ -1,5 +1,4 @@ -django-debug-toolbar==1.11 -sqlparse==0.3.* # pinned due to difficulties with django-debug-toolbar +django-debug-toolbar==2.1 # Testing requirements pycodestyle==2.5.* pyflakes==2.1.* @@ -7,16 +6,16 @@ pep8-naming flake8==3.7.* codecov coverage -pytest==4.4.* +pytest==5.3.* pytest-django isort -pytest-rerunfailures==7.* -pytest-mock==1.10.* +pytest-rerunfailures==8.* +pytest-mock==2.0.* responses potypo freezegun # Not really required, just nice to have -pytest-xdist==1.28.* +pytest-xdist==1.31.* pytest-cache pytest-sugar diff --git a/src/requirements/production.txt b/src/requirements/production.txt index a616a21d7b..03d2c23dcd 100644 --- a/src/requirements/production.txt +++ b/src/requirements/production.txt @@ -1,29 +1,29 @@ # Functional requirements -Django==2.2.* -djangorestframework==3.9.* +Django==3.0.* +djangorestframework==3.11.* python-dateutil==2.8.* -requests==2.21.0 +requests==2.22.0 pytz -django-bootstrap3==11.0.* +django-bootstrap3==12.0.* django-formset-js-improved==0.5.0.2 -django-compressor==2.2.* +django-compressor==2.4.* django-hierarkey==1.0.*,>=1.0.3 -django-filter==2.1.* -django-scopes==1.1.* +django-filter==2.2.* +django-scopes==1.2.* reportlab>=3.5.18* PyPDF2==1.26.* -Pillow==6.* +Pillow==7.* django-libsass libsass==0.19.2 # Bump when https://github.com/sass/libsass/issues/3053 is fixed -django-otp==0.5.* +django-otp==0.7.*,>=0.7.5 python-u2flib-server==4.* webauthn==0.4.* -django-formtools==2.1 -celery==4.3.* -kombu==4.5.* -django-statici18n==1.8.* +django-formtools==2.2 +celery==4.4.* +kombu==4.6.* +django-statici18n==1.9.* inlinestyler==0.2.* -BeautifulSoup4==4.7.* +BeautifulSoup4==4.8.* slimit lxml static3==0.7.* @@ -32,18 +32,18 @@ csscompressor django-markup markdown<=2.2 bleach==3.1.* -sentry-sdk==0.7.* +sentry-sdk==0.14.* babel django-i18nfield>=1.7.0 django-hijack>=2.1.10,<2.2.0 jsonschema -openpyxl==2.6.* # Bump to 3.0 after python 3.5 is dropped +openpyxl==3.0.* django-oauth-toolkit==1.2.* oauthlib==3.1.* django-jsonfallback>=2.1.2 psycopg2-binary # Stripe -stripe==2.32.* +stripe==2.42.* # PayPal paypalrestsdk==1.13.* pycparser==2.13 # https://github.com/eliben/pycparser/issues/147 @@ -52,16 +52,15 @@ chardet<3.1.0,>=3.0.2 mt-940==3.2 vobject==0.9.* pycountry -django-countries +django-countries>=6.0 pyuca # for better sorting of country names in django-countries defusedcsv>=1.1.0 vat_moss_forked==2020.3.20.0.11.0 django-localflavor>=2.2 -urllib3==1.24.* -django-redis==4.10.* -redis==3.2.* -django-phonenumber-field==3.0.* -phonenumberslite==8.10.* +django-redis==4.11.* +redis==3.3.* +django-phonenumber-field==4.0.* +phonenumberslite==8.11.* python-bidi==0.4.* # Support for arabic in reportlab arabic-reshaper==2.0.15 # Support for Aabic in reportlab packaging diff --git a/src/setup.py b/src/setup.py index 24d73e2b10..f242901864 100644 --- a/src/setup.py +++ b/src/setup.py @@ -9,7 +9,7 @@ from setuptools import find_packages, setup from pretix import __version__ CURRENT_PYTHON = sys.version_info[:2] -REQUIRED_PYTHON = (3, 5) +REQUIRED_PYTHON = (3, 6) if CURRENT_PYTHON < REQUIRED_PYTHON: sys.stderr.write(""" ========================== @@ -80,39 +80,39 @@ setup( 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', 'Environment :: Web Environment', 'License :: OSI Approved :: Apache Software License', - 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', - 'Framework :: Django :: 2.2' + 'Programming Language :: Python :: 3.8', + 'Framework :: Django :: 3.0' ], keywords='tickets web shop ecommerce', install_requires=[ - 'Django==2.2.*', - 'djangorestframework==3.9.*', + 'Django==3.0.*', + 'djangorestframework==3.11.*', 'python-dateutil==2.8.*', - 'requests==2.21.*', + 'requests==2.22.*', 'pytz', - 'django-bootstrap3==11.0.*', + 'django-bootstrap3==12.0.*', 'django-formset-js-improved==0.5.0.2', - 'django-compressor==2.2.*', + 'django-compressor==2.4.*', 'django-hierarkey==1.0.*,>=1.0.2', - 'django-filter==2.1.*', - 'django-scopes==1.1.*', + 'django-filter==2.2.*', + 'django-scopes==1.2.*', 'reportlab>=3.5.18', - 'Pillow==6.*', + 'Pillow==7.*', 'PyPDF2==1.26.*', 'django-libsass', 'libsass==0.19.2', # Bump when https://github.com/sass/libsass/issues/3053 is fixed - 'django-otp==0.5.*', + 'django-otp==0.7.*,>=0.7.5', 'webauthn==0.4.*', 'python-u2flib-server==4.*', - 'django-formtools==2.1', - 'celery==4.3.*', - 'kombu==4.5.*', - 'django-statici18n==1.8.*', + 'django-formtools==2.2', + 'celery==4.4.*', + 'kombu==4.6.*', + 'django-statici18n==1.9.*', 'inlinestyler==0.2.*', - 'BeautifulSoup4==4.7.*', + 'BeautifulSoup4==4.8.*', 'slimit', 'lxml', 'static3==0.7.*', @@ -121,13 +121,13 @@ setup( 'django-markup', 'markdown<=2.2', 'bleach==3.1.*', - 'sentry-sdk==0.7.*', + 'sentry-sdk==0.14.*', 'babel', 'paypalrestsdk==1.13.*', 'pycparser==2.13', - 'django-redis==4.10.*', - 'redis==3.2.*', - 'stripe==2.32.*', + 'django-redis==4.11.*', + 'redis==3.3.*', + 'stripe==2.42.*', 'chardet<3.1.0,>=3.0.2', 'mt-940==3.2', 'django-i18nfield>=1.7.0', @@ -135,7 +135,7 @@ setup( 'psycopg2-binary', 'vobject==0.9.*', 'pycountry', - 'django-countries', + 'django-countries>=6.0', 'pyuca', 'defusedcsv>=1.1.0', 'vat_moss_forked==2020.3.20.0.11.0', @@ -143,32 +143,30 @@ setup( 'django-localflavor', 'jsonschema', 'django-hijack>=2.1.10,<2.2.0', - 'openpyxl==2.6.*', + 'openpyxl==3.0.*', 'django-oauth-toolkit==1.2.*', 'oauthlib==3.1.*', - 'urllib3==1.24.*', # required by current requests - 'django-phonenumber-field==3.0.*', - 'phonenumberslite==8.10.*', + 'django-phonenumber-field==4.0.*', + 'phonenumberslite==8.11.*', 'python-bidi==0.4.*', # Support for Arabic in reportlab 'arabic-reshaper==2.0.15', # Support for Arabic in reportlab 'packaging', ], extras_require={ 'dev': [ - 'django-debug-toolbar==1.11', - 'sqlparse==0.3.*', + 'django-debug-toolbar==2.1', 'pycodestyle==2.5.*', 'pyflakes==2.1.*', 'flake8==3.7.*', 'pep8-naming', 'coveralls', 'coverage', - 'pytest==4.4.*', + 'pytest==5.3.*', 'pytest-django', - 'pytest-xdist==1.28.*', + 'pytest-xdist==1.31.*', 'isort', - 'pytest-mock==1.10.*', - 'pytest-rerunfailures==7.*', + 'pytest-mock==2.0.*', + 'pytest-rerunfailures==8.*', 'responses', 'potypo', 'freezegun', diff --git a/src/tests/base/test_mail.py b/src/tests/base/test_mail.py index ab7ea62313..f94b8ac873 100644 --- a/src/tests/base/test_mail.py +++ b/src/tests/base/test_mail.py @@ -4,7 +4,7 @@ import pytest from django.conf import settings from django.core import mail as djmail from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django_scopes import scope from pretix.base.models import Event, Organizer, User