diff --git a/pyproject.toml b/pyproject.toml index 5f7e9b7c49..30f0c702d2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "css-inline==0.8.*", "defusedcsv>=1.1.0", "dj-static", - "Django==4.1.*", + "Django==4.2.*", "django-bootstrap3==23.1.*", "django-compressor==4.3.*", "django-countries==7.5.*", diff --git a/src/pretix/_base_settings.py b/src/pretix/_base_settings.py index 7e3645df98..098f175f97 100644 --- a/src/pretix/_base_settings.py +++ b/src/pretix/_base_settings.py @@ -196,7 +196,14 @@ STATICFILES_DIRS = [ STATICI18N_ROOT = os.path.join(BASE_DIR, "pretix/static") -STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage' +STORAGES = { + "default": { + "BACKEND": "django.core.files.storage.FileSystemStorage", + }, + "staticfiles": { + "BACKEND": "django.contrib.staticfiles.storage.ManifestStaticFilesStorage", + }, +} # if os.path.exists(os.path.join(DATA_DIR, 'static')): # STATICFILES_DIRS.insert(0, os.path.join(DATA_DIR, 'static')) diff --git a/src/pretix/base/models/_transactions.py b/src/pretix/base/models/_transactions.py index 341e9724c2..5fecab2b2d 100644 --- a/src/pretix/base/models/_transactions.py +++ b/src/pretix/base/models/_transactions.py @@ -97,7 +97,7 @@ def _transactions_mark_order_dirty(order_id, using=None): if getattr(dirty_transactions, 'order_ids', None) is None: dirty_transactions.order_ids = set() - if _check_for_dirty_orders not in [func for savepoint_id, func in conn.run_on_commit]: + if _check_for_dirty_orders not in [func for (savepoint_id, func, *__) in conn.run_on_commit]: transaction.on_commit(_check_for_dirty_orders, using) dirty_transactions.order_ids.clear() # This is necessary to clean up after old threads with rollbacked transactions diff --git a/src/pretix/base/models/log.py b/src/pretix/base/models/log.py index ec8ac74d9e..1a9d3ae31c 100644 --- a/src/pretix/base/models/log.py +++ b/src/pretix/base/models/log.py @@ -88,9 +88,7 @@ class LogEntry(models.Model): class Meta: ordering = ('-datetime', '-id') - index_together = [ - ['datetime', 'id'] - ] + indexes = [models.Index(fields=["datetime", "id"])] def display(self): from ..signals import logentry_display diff --git a/src/pretix/base/models/media.py b/src/pretix/base/models/media.py index b5d2a3df23..34da42d23d 100644 --- a/src/pretix/base/models/media.py +++ b/src/pretix/base/models/media.py @@ -121,7 +121,10 @@ class ReusableMedium(LoggedModel): class Meta: unique_together = (("identifier", "type", "organizer"),) - index_together = (("identifier", "type", "organizer"), ("updated", "id")) + indexes = [ + models.Index(fields=("identifier", "type", "organizer")), + models.Index(fields=("updated", "id")), + ] ordering = "identifier", "type", "organizer" diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index d01853d13d..0efc9f8d13 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -270,9 +270,9 @@ class Order(LockModel, LoggedModel): verbose_name = _("Order") verbose_name_plural = _("Orders") ordering = ("-datetime", "-pk") - index_together = [ - ["datetime", "id"], - ["last_modified", "id"], + indexes = [ + models.Index(fields=["datetime", "id"]), + models.Index(fields=["last_modified", "id"]), ] def __str__(self): @@ -2756,8 +2756,8 @@ class Transaction(models.Model): class Meta: ordering = 'datetime', 'pk' - index_together = [ - ['datetime', 'id'] + indexes = [ + models.Index(fields=['datetime', 'id']) ] def save(self, *args, **kwargs): diff --git a/src/pretix/static/jsi18n/en/djangojs.js b/src/pretix/static/jsi18n/en/djangojs.js index b23197b94d..5dee27a8f0 100644 --- a/src/pretix/static/jsi18n/en/djangojs.js +++ b/src/pretix/static/jsi18n/en/djangojs.js @@ -80,7 +80,15 @@ "DATE_INPUT_FORMATS": [ "%Y-%m-%d", "%m/%d/%Y", - "%m/%d/%y" + "%m/%d/%y", + "%b %d %Y", + "%b %d, %Y", + "%d %b %Y", + "%d %b, %Y", + "%B %d %Y", + "%B %d, %Y", + "%d %B %Y", + "%d %B, %Y" ], "DECIMAL_SEPARATOR": ".", "FIRST_DAY_OF_WEEK": 0, diff --git a/src/pretix/testutils/settings.py b/src/pretix/testutils/settings.py index ea2da4af00..09924d52de 100644 --- a/src/pretix/testutils/settings.py +++ b/src/pretix/testutils/settings.py @@ -42,7 +42,7 @@ EMAIL_BACKEND = EMAIL_CUSTOM_SMTP_BACKEND = 'django.core.mail.backends.locmem.Em COMPRESS_ENABLED = COMPRESS_OFFLINE = False COMPRESS_CACHE_BACKEND = 'testcache' -STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage' +STORAGES["staticfiles"]["BACKEND"] = 'django.contrib.staticfiles.storage.StaticFilesStorage' PRETIX_INSTANCE_NAME = 'pretix.eu' COMPRESS_PRECOMPILERS_ORIGINAL = COMPRESS_PRECOMPILERS diff --git a/src/setup.cfg b/src/setup.cfg index 8c2e5dcf67..7b947c0a98 100644 --- a/src/setup.cfg +++ b/src/setup.cfg @@ -21,6 +21,8 @@ addopts = --reruns 3 -rw filterwarnings = error ignore:The 'warn' method is deprecated:DeprecationWarning + ignore::django.utils.deprecation.RemovedInDjango51Warning:django.core.files.storage + ignore:.*index_together.*:django.utils.deprecation.RemovedInDjango51Warning: ignore::DeprecationWarning:mt940 ignore::DeprecationWarning:cbor2 ignore::DeprecationWarning:markdown diff --git a/src/tests/base/test_checkin.py b/src/tests/base/test_checkin.py index 0435c00fd4..f5ba891ac3 100644 --- a/src/tests/base/test_checkin.py +++ b/src/tests/base/test_checkin.py @@ -940,8 +940,8 @@ def test_rules_reasoning_prefer_number_over_date(event, position, clist): @pytest.mark.django_db(transaction=True) -def test_position_queries(django_assert_num_queries, position, clist): - with django_assert_num_queries(12 if 'sqlite' in settings.DATABASES['default']['ENGINE'] else 11) as captured: +def test_position_queries(django_assert_max_num_queries, position, clist): + with django_assert_max_num_queries(13) as captured: perform_checkin(position, clist, {}) if 'sqlite' not in settings.DATABASES['default']['ENGINE']: assert any('FOR UPDATE' in s['sql'] for s in captured) diff --git a/src/tests/base/test_i18n.py b/src/tests/base/test_i18n.py index 7a291004b8..5a84a117b3 100644 --- a/src/tests/base/test_i18n.py +++ b/src/tests/base/test_i18n.py @@ -38,10 +38,10 @@ class I18nStringTest(TestCase): 'en': 'Hello' } s = LazyI18nString(data) - translation.activate('en') - self.assertEqual(str(s), 'Hello') - translation.activate('de') - self.assertEqual(str(s), 'Hallo') + with translation.override('en'): + self.assertEqual(str(s), 'Hello') + with translation.override('de'): + self.assertEqual(str(s), 'Hallo') def test_similar_translations(self): data = { @@ -50,57 +50,57 @@ class I18nStringTest(TestCase): 'de-informal': 'Du' } s = LazyI18nString(data) - translation.activate('de') - self.assertEqual(str(s), 'Sie') - translation.activate('de-informal') - self.assertEqual(str(s), 'Du') + with translation.override('de'): + self.assertEqual(str(s), 'Sie') + with translation.override('de-informal'): + self.assertEqual(str(s), 'Du') data = { 'en': 'You', 'de-informal': 'Du' } s = LazyI18nString(data) - translation.activate('de') - self.assertEqual(str(s), 'Du') - translation.activate('de-informal') - self.assertEqual(str(s), 'Du') + with translation.override('de'): + self.assertEqual(str(s), 'Du') + with translation.override('de-informal'): + self.assertEqual(str(s), 'Du') data = { 'en': 'You', 'de': 'Sie' } s = LazyI18nString(data) - translation.activate('de') - self.assertEqual(str(s), 'Sie') - translation.activate('de-informal') - self.assertEqual(str(s), 'Sie') + with translation.override('de'): + self.assertEqual(str(s), 'Sie') + with translation.override('de-informal'): + self.assertEqual(str(s), 'Sie') def test_missing_default_translation(self): data = { 'de': 'Hallo', } s = LazyI18nString(data) - translation.activate('en') - self.assertEqual(str(s), 'Hallo') - translation.activate('de') - self.assertEqual(str(s), 'Hallo') + with translation.override('en'): + self.assertEqual(str(s), 'Hallo') + with translation.override('de'): + self.assertEqual(str(s), 'Hallo') def test_missing_translation(self): data = { 'en': 'Hello', } s = LazyI18nString(data) - translation.activate('en') - self.assertEqual(str(s), 'Hello') - translation.activate('de') - self.assertEqual(str(s), 'Hello') + with translation.override('en'): + self.assertEqual(str(s), 'Hello') + with translation.override('de'): + self.assertEqual(str(s), 'Hello') def test_legacy_string(self): s = LazyI18nString("Hello") - translation.activate('en') - self.assertEqual(str(s), 'Hello') - translation.activate('de') - self.assertEqual(str(s), 'Hello') + with translation.override('en'): + self.assertEqual(str(s), 'Hello') + with translation.override('de'): + self.assertEqual(str(s), 'Hello') def test_none(self): s = LazyI18nString(None) @@ -124,10 +124,10 @@ class I18nFieldTest(TestCase): obj = ItemCategory.objects.create(event=self.event, name="Hello") obj = ItemCategory.objects.get(id=obj.id) self.assertIsInstance(obj.name, LazyI18nString) - translation.activate('en') - self.assertEqual(str(obj.name), "Hello") - translation.activate('de') - self.assertEqual(str(obj.name), "Hello") + with translation.override('en'): + self.assertEqual(str(obj.name), "Hello") + with translation.override('de'): + self.assertEqual(str(obj.name), "Hello") def test_save_load_cycle_i18n_string(self): obj = ItemCategory.objects.create(event=self.event, @@ -139,7 +139,7 @@ class I18nFieldTest(TestCase): )) obj = ItemCategory.objects.get(id=obj.id) self.assertIsInstance(obj.name, LazyI18nString) - translation.activate('en') - self.assertEqual(str(obj.name), "Hello") - translation.activate('de') - self.assertEqual(str(obj.name), "Hallo") + with translation.override('en'): + self.assertEqual(str(obj.name), "Hello") + with translation.override('de'): + self.assertEqual(str(obj.name), "Hallo") diff --git a/src/tests/conftest.py b/src/tests/conftest.py index 38d5d7c690..eda4a455ad 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -22,6 +22,7 @@ import inspect import pytest +from django.utils import translation from django_scopes import scopes_disabled from xdist.dsession import DSession @@ -68,3 +69,8 @@ def pytest_fixture_setup(fixturedef, request): else: with scopes_disabled(): yield + + +@pytest.fixture(autouse=True) +def reset_locale(): + translation.activate("en")