{% trans "This will invalidate all tickets in this order." %}
+ class="btn btn-delete btn-danger">
{% trans "Cancel order" %}
diff --git a/src/pretix/presale/templates/pretixpresale/event/order_cancel.html b/src/pretix/presale/templates/pretixpresale/event/order_cancel.html
index 018d072c7..36f6f64a5 100644
--- a/src/pretix/presale/templates/pretixpresale/event/order_cancel.html
+++ b/src/pretix/presale/templates/pretixpresale/event/order_cancel.html
@@ -189,7 +189,7 @@
-
+
{% if request.event.settings.cancel_allow_user_paid_require_approval %}
{% trans "Yes, request cancellation" %}
{% else %}
diff --git a/src/pretix/presale/views/theme.py b/src/pretix/presale/views/theme.py
index 6d72d1c42..95fd5a3ff 100644
--- a/src/pretix/presale/views/theme.py
+++ b/src/pretix/presale/views/theme.py
@@ -12,7 +12,7 @@ def browserconfig_xml(request):
- #3b1c4a
+ #2185d0
""".format(
@@ -40,8 +40,8 @@ def webmanifest(request):
"type": "image/png"
}
],
- "theme_color": "#3b1c4a",
- "background_color": "#3b1c4a",
+ "theme_color": "#2185d0",
+ "background_color": "#2185d0",
"display": "standalone"
}""" % (
static('pretixbase/img/icons/android-chrome-192x192.png'),
diff --git a/src/pretix/static/pretixbase/img/pretix-icon-colored.svg b/src/pretix/static/pretixbase/img/pretix-icon-colored.svg
index e75b8df2d..6bfa187d7 100644
--- a/src/pretix/static/pretixbase/img/pretix-icon-colored.svg
+++ b/src/pretix/static/pretixbase/img/pretix-icon-colored.svg
@@ -13,7 +13,7 @@
id="layer1"
transform="translate(-277.78125,-568.74975)">
diff --git a/src/pretix/static/pretixbase/img/pretix-logo.svg b/src/pretix/static/pretixbase/img/pretix-logo.svg
index 9bfdcc47c..f97e059b1 100644
--- a/src/pretix/static/pretixbase/img/pretix-logo.svg
+++ b/src/pretix/static/pretixbase/img/pretix-logo.svg
@@ -14,7 +14,7 @@
id="layer1"
transform="translate(-277.78125,-568.75)">
diff --git a/src/pretix/static/pretixbase/img/pretixscan.svg b/src/pretix/static/pretixbase/img/pretixscan.svg
index 9b4e7fb64..0ecf9ea63 100644
--- a/src/pretix/static/pretixbase/img/pretixscan.svg
+++ b/src/pretix/static/pretixbase/img/pretixscan.svg
@@ -64,7 +64,7 @@
id="g1590"
transform="matrix(7.9500992,0,0,7.9500992,-81.038095,43.604759)">
+ style="fill:#2185d0;fill-opacity:1">
Date: Mon, 18 Mar 2024 21:04:37 +0300
Subject: [PATCH 07/10] cleanup: remove remaining mysql code, patch up
dependencies, fix typos (#53)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Martin Bähr
---
src/pretix/helpers/templatetags/jsonfield.py | 21 +-------------------
src/setup.py | 6 +++---
src/tests/api/test_items.py | 5 +----
3 files changed, 5 insertions(+), 27 deletions(-)
diff --git a/src/pretix/helpers/templatetags/jsonfield.py b/src/pretix/helpers/templatetags/jsonfield.py
index bb04757ab..23ba60fe4 100644
--- a/src/pretix/helpers/templatetags/jsonfield.py
+++ b/src/pretix/helpers/templatetags/jsonfield.py
@@ -5,17 +5,6 @@
from django.db import NotSupportedError
from django.db.models import Expression, JSONField
-def mysql_compile_json_path(key_transforms):
- path = ['$']
- for key_transform in key_transforms:
- try:
- num = int(key_transform)
- path.append('[{}]'.format(num))
- except ValueError: # non-integer
- path.append('.')
- path.append(key_transform)
- return ''.join(path)
-
def postgres_compile_json_path(key_transforms):
return "{" + ','.join(key_transforms) + "}"
@@ -41,17 +30,9 @@ def as_sql(self, compiler, connection, function=None, template=None, arg_joiner=
params.append(json_path)
template = '{} #> %s'.format(arg_sql)
return template, params
- elif '.mysql' in connection.settings_dict['ENGINE']:
- params = []
- arg_sql, arg_params = compiler.compile(self.source_expression)
- params.extend(arg_params)
- json_path = mysql_compile_json_path(self.path)
- params.append(json_path)
- template = 'JSON_EXTRACT({}, %s)'.format(arg_sql)
- return template, params
else:
raise NotSupportedError(
- 'Functions on JSONFields are only supported on PostgreSQL and MySQL at the moment.'
+ 'Functions on JSONFields are only supported on PostgreSQL.'
)
def copy(self):
diff --git a/src/setup.py b/src/setup.py
index 074102ed2..579ff0ae4 100644
--- a/src/setup.py
+++ b/src/setup.py
@@ -108,7 +108,7 @@ def run(self):
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
- 'Framework :: Django :: 3.0'
+ 'Framework :: Django :: 3.2'
],
keywords='tickets web shop ecommerce',
@@ -125,8 +125,9 @@ def run(self):
'django-hierarkey==1.0.*,>=1.0.4',
'django-filter==2.4.*',
'django-scopes==1.2.*',
+ 'django-localflavor==3.0.*',
'reportlab>=3.5.65',
- 'Pillow=8.*',
+ 'Pillow==8.*',
'PyPDF2==1.26.*',
'django-libsass==0.8',
'libsass==0.20.*',
@@ -158,7 +159,6 @@ def run(self):
'mt-940==3.2',
'django-i18nfield==1.9.*,>=1.9.1',
'psycopg2-binary',
- 'django-mysql',
'tqdm==4.*',
'vobject==0.9.*',
'pycountry',
diff --git a/src/tests/api/test_items.py b/src/tests/api/test_items.py
index 6851444f0..f8fac49fe 100644
--- a/src/tests/api/test_items.py
+++ b/src/tests/api/test_items.py
@@ -718,10 +718,7 @@ def test_item_create_with_addon(token_client, organizer, event, item, category,
format='json'
)
assert resp.status_code == 400
- assert resp.content.decode() in [
- '{"addons":["The minimum count needs to be equal to or greater than zero."]}',
- '{"addons":[{"min_count":["Ensure this value is greater than or equal to 0."]}]}', # mysql
- ]
+ assert resp.content.decode() == '{"addons":["The minimum count needs to be equal to or greater than zero."]}'
with scopes_disabled():
assert 2 == Item.objects.all().count()
From 87fcfcb2bdf0d4bc799defad95b3a08601d9940d Mon Sep 17 00:00:00 2001
From: KANZA MUHAMMAD AKRAM <85638781+KanzaAkram@users.noreply.github.com>
Date: Sat, 23 Mar 2024 18:23:55 +0000
Subject: [PATCH 08/10] commit
---
deployment/docker/production_settings.py | 7 +-
src/pretix/api/__init__.py | 1 -
src/pretix/api/auth/devicesecurity.py | 2 +-
src/pretix/api/signals.py | 4 +-
src/pretix/api/urls.py | 46 +-
src/pretix/base/__init__.py | 1 -
src/pretix/base/models/items.py | 4 +-
src/pretix/base/secrets.py | 2 +-
src/pretix/control/__init__.py | 1 -
src/pretix/control/signals.py | 28 +-
src/pretix/control/urls.py | 452 +++++++++---------
src/pretix/control/views/dashboards.py | 4 +-
src/pretix/control/views/orders.py | 8 +-
src/pretix/control/views/waitinglist.py | 6 +-
src/pretix/helpers/__init__.py | 1 -
src/pretix/helpers/http.py | 2 +-
src/pretix/multidomain/__init__.py | 1 -
.../multidomain/event_domain_urlconf.py | 10 +-
src/pretix/multidomain/maindomain_urlconf.py | 18 +-
.../multidomain/organizer_domain_urlconf.py | 14 +-
src/pretix/plugins/badges/__init__.py | 1 -
src/pretix/plugins/badges/urls.py | 14 +-
src/pretix/plugins/banktransfer/__init__.py | 1 -
src/pretix/plugins/banktransfer/urls.py | 26 +-
src/pretix/plugins/checkinlists/__init__.py | 1 -
src/pretix/plugins/manualpayment/__init__.py | 1 -
src/pretix/plugins/paypal/__init__.py | 1 -
src/pretix/plugins/paypal/urls.py | 20 +-
src/pretix/plugins/pretixdroid/__init__.py | 1 -
src/pretix/plugins/reports/__init__.py | 1 -
src/pretix/plugins/returnurl/__init__.py | 1 -
src/pretix/plugins/returnurl/urls.py | 4 +-
src/pretix/plugins/sendmail/__init__.py | 1 -
src/pretix/plugins/sendmail/urls.py | 6 +-
src/pretix/plugins/statistics/__init__.py | 1 -
src/pretix/plugins/statistics/urls.py | 4 +-
src/pretix/plugins/stripe/__init__.py | 1 -
src/pretix/plugins/stripe/urls.py | 26 +-
.../plugins/ticketoutputpdf/__init__.py | 1 -
src/pretix/plugins/ticketoutputpdf/urls.py | 14 +-
src/pretix/plugins/webcheckin/__init__.py | 1 -
src/pretix/plugins/webcheckin/urls.py | 4 +-
src/pretix/presale/__init__.py | 1 -
src/pretix/presale/signals.py | 16 +-
src/pretix/presale/urls.py | 106 ++--
src/pretix/presale/views/cart.py | 6 +-
src/pretix/settings.py | 10 +-
src/pretix/testutils/settings.py | 7 +-
src/pretix/urls.py | 24 +-
src/tests/base/test_middleware.py | 6 +-
src/tests/control/test_auth.py | 4 +-
src/tests/testdummy/__init__.py | 1 -
52 files changed, 448 insertions(+), 476 deletions(-)
diff --git a/deployment/docker/production_settings.py b/deployment/docker/production_settings.py
index 0f87487ae..c15ed89fe 100644
--- a/deployment/docker/production_settings.py
+++ b/deployment/docker/production_settings.py
@@ -1,4 +1,9 @@
from pretix.settings import *
LOGGING['handlers']['mail_admins']['include_html'] = True
-STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
+STORAGES = {
+ **STORAGES,
+ "staticfiles": {
+ "BACKEND": 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage',
+ },
+}
diff --git a/src/pretix/api/__init__.py b/src/pretix/api/__init__.py
index 08b1c5ab8..e1501ca7a 100644
--- a/src/pretix/api/__init__.py
+++ b/src/pretix/api/__init__.py
@@ -9,4 +9,3 @@ def ready(self):
from . import signals, webhooks # noqa
-default_app_config = 'pretix.api.PretixApiConfig'
diff --git a/src/pretix/api/auth/devicesecurity.py b/src/pretix/api/auth/devicesecurity.py
index 2debce670..b09ddf091 100644
--- a/src/pretix/api/auth/devicesecurity.py
+++ b/src/pretix/api/auth/devicesecurity.py
@@ -1,4 +1,4 @@
-from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import gettext_lazy as _
class FullAccessSecurityProfile:
diff --git a/src/pretix/api/signals.py b/src/pretix/api/signals.py
index b7c33909c..14a688ce5 100644
--- a/src/pretix/api/signals.py
+++ b/src/pretix/api/signals.py
@@ -8,9 +8,7 @@
from pretix.base.signals import periodic_task
from pretix.helpers.periodic import minimum_interval
-register_webhook_events = Signal(
- providing_args=[]
-)
+register_webhook_events = Signal()
"""
This signal is sent out to get all known webhook events. Receivers should return an
instance of a subclass of pretix.api.webhooks.WebhookEvent or a list of such
diff --git a/src/pretix/api/urls.py b/src/pretix/api/urls.py
index ea6ba3903..d491dc253 100644
--- a/src/pretix/api/urls.py
+++ b/src/pretix/api/urls.py
@@ -1,7 +1,7 @@
import importlib
from django.apps import apps
-from django.conf.urls import include, url
+from django.urls import include, path
from rest_framework import routers
from pretix.api.views import cart
@@ -72,30 +72,30 @@
importlib.import_module(app.name + '.urls')
urlpatterns = [
- url(r'^', include(router.urls)),
- url(r'^organizers/(?P[^/]+)/', include(orga_router.urls)),
- url(r'^organizers/(?P[^/]+)/settings/$', organizer.OrganizerSettingsView.as_view(),
+ path('', include(router.urls)),
+ path('organizers//', include(orga_router.urls)),
+ path('organizers//settings/', organizer.OrganizerSettingsView.as_view(),
name="organizer.settings"),
- url(r'^organizers/(?P[^/]+)/giftcards/(?P[^/]+)/', include(giftcard_router.urls)),
- url(r'^organizers/(?P[^/]+)/events/(?P[^/]+)/settings/$', event.EventSettingsView.as_view(),
+ path('organizers//giftcards//', include(giftcard_router.urls)),
+ path('organizers//events//settings/', event.EventSettingsView.as_view(),
name="event.settings"),
- url(r'^organizers/(?P[^/]+)/events/(?P[^/]+)/', include(event_router.urls)),
- url(r'^organizers/(?P[^/]+)/teams/(?P[^/]+)/', include(team_router.urls)),
- url(r'^organizers/(?P[^/]+)/events/(?P[^/]+)/items/(?P[^/]+)/', include(item_router.urls)),
- url(r'^organizers/(?P[^/]+)/events/(?P[^/]+)/questions/(?P[^/]+)/',
+ path('organizers//events//', include(event_router.urls)),
+ path('organizers//teams//', include(team_router.urls)),
+ path('organizers//events//items//', include(item_router.urls)),
+ path('organizers//events//questions//',
include(question_router.urls)),
- url(r'^organizers/(?P[^/]+)/events/(?P[^/]+)/checkinlists/(?P[^/]+)/',
+ path('organizers//events//checkinlists//',
include(checkinlist_router.urls)),
- url(r'^organizers/(?P[^/]+)/events/(?P[^/]+)/orders/(?P[^/]+)/', include(order_router.urls)),
- url(r"^oauth/authorize$", oauth.AuthorizationView.as_view(), name="authorize"),
- url(r"^oauth/token$", oauth.TokenView.as_view(), name="token"),
- url(r"^oauth/revoke_token$", oauth.RevokeTokenView.as_view(), name="revoke-token"),
- url(r"^device/initialize$", device.InitializeView.as_view(), name="device.initialize"),
- url(r"^device/update$", device.UpdateView.as_view(), name="device.update"),
- url(r"^device/roll$", device.RollKeyView.as_view(), name="device.roll"),
- url(r"^device/revoke$", device.RevokeKeyView.as_view(), name="device.revoke"),
- url(r"^device/eventselection$", device.EventSelectionView.as_view(), name="device.eventselection"),
- url(r"^upload$", upload.UploadView.as_view(), name="upload"),
- url(r"^me$", user.MeView.as_view(), name="user.me"),
- url(r"^version$", version.VersionView.as_view(), name="version"),
+ path('organizers//events//orders//', include(order_router.urls)),
+ path("oauth/authorize", oauth.AuthorizationView.as_view(), name="authorize"),
+ path("oauth/token", oauth.TokenView.as_view(), name="token"),
+ path("oauth/revoke_token", oauth.RevokeTokenView.as_view(), name="revoke-token"),
+ path("device/initialize", device.InitializeView.as_view(), name="device.initialize"),
+ path("device/update", device.UpdateView.as_view(), name="device.update"),
+ path("device/roll", device.RollKeyView.as_view(), name="device.roll"),
+ path("device/revoke", device.RevokeKeyView.as_view(), name="device.revoke"),
+ path("device/eventselection", device.EventSelectionView.as_view(), name="device.eventselection"),
+ path("upload", upload.UploadView.as_view(), name="upload"),
+ path("me", user.MeView.as_view(), name="user.me"),
+ path("version", version.VersionView.as_view(), name="version"),
]
diff --git a/src/pretix/base/__init__.py b/src/pretix/base/__init__.py
index 51fdbbe5b..6beba7437 100644
--- a/src/pretix/base/__init__.py
+++ b/src/pretix/base/__init__.py
@@ -25,7 +25,6 @@ def ready(self):
initialize()
-default_app_config = 'pretix.base.PretixBaseConfig'
try:
import pretix.celery_app as celery # NOQA
except ImportError:
diff --git a/src/pretix/base/models/items.py b/src/pretix/base/models/items.py
index 548893359..da5e350f6 100644
--- a/src/pretix/base/models/items.py
+++ b/src/pretix/base/models/items.py
@@ -310,7 +310,7 @@ class Item(LoggedModel):
),
default=False
)
- generate_tickets = models.NullBooleanField(
+ generate_tickets = models.BooleanField(
verbose_name=_("Generate tickets"),
blank=True, null=True,
)
@@ -319,7 +319,7 @@ class Item(LoggedModel):
help_text=_("This will only work if waiting lists are enabled for this event."),
default=True
)
- show_quota_left = models.NullBooleanField(
+ show_quota_left = models.BooleanField(
verbose_name=_("Show number of tickets left"),
help_text=_("Publicly show how many tickets are still available."),
blank=True, null=True,
diff --git a/src/pretix/base/secrets.py b/src/pretix/base/secrets.py
index 22f13148b..fb2c4b611 100644
--- a/src/pretix/base/secrets.py
+++ b/src/pretix/base/secrets.py
@@ -11,7 +11,7 @@
from django.conf import settings
from django.dispatch import receiver
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 Item, ItemVariation, SubEvent
from pretix.base.secretgenerators import pretix_sig1_pb2
diff --git a/src/pretix/control/__init__.py b/src/pretix/control/__init__.py
index b7c6dd298..d5f211ce8 100644
--- a/src/pretix/control/__init__.py
+++ b/src/pretix/control/__init__.py
@@ -10,4 +10,3 @@ def ready(self):
from . import logdisplay # noqa
-default_app_config = 'pretix.control.PretixControlConfig'
diff --git a/src/pretix/control/signals.py b/src/pretix/control/signals.py
index 090b0d189..2099759a8 100644
--- a/src/pretix/control/signals.py
+++ b/src/pretix/control/signals.py
@@ -2,9 +2,7 @@
from pretix.base.signals import DeprecatedSignal, EventPluginSignal
-html_page_start = Signal(
- providing_args=[]
-)
+html_page_start = Signal()
"""
This signal allows you to put code in the beginning of the main page for every
page in the backend. You are expected to return HTML.
@@ -48,9 +46,7 @@
As with all plugin signals, the ``sender`` keyword argument will contain the event.
"""
-nav_topbar = Signal(
- providing_args=["request"]
-)
+nav_topbar = Signal()
"""
This signal allows you to add additional views to the top navigation bar.
You will get the request as a keyword argument ``request``.
@@ -67,9 +63,7 @@
and you may get the signal regardless of whether your plugin is active.
"""
-nav_global = Signal(
- providing_args=["request"]
-)
+nav_global = Signal()
"""
This signal allows you to add additional views to the navigation bar when no event is
selected. You will get the request as a keyword argument ``request``.
@@ -120,9 +114,7 @@
An additional keyword argument ``subevent`` *can* contain a sub-event.
"""
-user_dashboard_widgets = Signal(
- providing_args=['user']
-)
+user_dashboard_widgets = Signal()
"""
This signal is sent out to include widgets in the personal user dashboard. Receivers
should return a list of dictionaries, where each dictionary can have the keys:
@@ -191,9 +183,7 @@
break the installation.
"""
-nav_organizer = Signal(
- providing_args=['organizer', 'request']
-)
+nav_organizer = Signal()
"""
This signal is sent out to include tab links on the detail page of an organizer.
Receivers are expected to return a list of dictionaries. The dictionaries
@@ -312,16 +302,12 @@
As with all plugin signals, the ``sender`` keyword argument will contain the event.
"""
-oauth_application_registered = Signal(
- providing_args=["user", "application"]
-)
+oauth_application_registered = Signal()
"""
This signal will be called whenever a user registers a new OAuth application.
"""
-order_search_filter_q = Signal(
- providing_args=["query"]
-)
+order_search_filter_q = Signal()
"""
This signal will be called whenever a free-text order search is performed. You are expected to return one
Q object that will be OR-ed with existing search queries. As order search exists on a global level as well,
diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py
index 54202fad5..c1bb2206c 100644
--- a/src/pretix/control/urls.py
+++ b/src/pretix/control/urls.py
@@ -1,4 +1,4 @@
-from django.conf.urls import include, url
+from django.urls import include, path, re_path
from django.views.generic.base import RedirectView
from pretix.control.views import (
@@ -8,310 +8,310 @@
)
urlpatterns = [
- url(r'^logout$', auth.logout, name='auth.logout'),
- url(r'^login$', auth.login, name='auth.login'),
- url(r'^login/2fa$', auth.Login2FAView.as_view(), name='auth.login.2fa'),
- url(r'^register$', auth.register, name='auth.register'),
- url(r'^invite/(?P[a-zA-Z0-9]+)$', auth.invite, name='auth.invite'),
- url(r'^forgot$', auth.Forgot.as_view(), name='auth.forgot'),
- url(r'^forgot/recover$', auth.Recover.as_view(), name='auth.forgot.recover'),
- url(r'^$', dashboards.user_index, name='index'),
- url(r'^widgets.json$', dashboards.user_index_widgets_lazy, name='index.widgets'),
- url(r'^global/settings/$', global_settings.GlobalSettingsView.as_view(), name='global.settings'),
- url(r'^global/update/$', global_settings.UpdateCheckView.as_view(), name='global.update'),
- url(r'^global/message/$', global_settings.MessageView.as_view(), name='global.message'),
- url(r'^logdetail/$', global_settings.LogDetailView.as_view(), name='global.logdetail'),
- url(r'^logdetail/payment/$', global_settings.PaymentDetailView.as_view(), name='global.paymentdetail'),
- url(r'^logdetail/refund/$', global_settings.RefundDetailView.as_view(), name='global.refunddetail'),
- url(r'^geocode/$', geo.GeoCodeView.as_view(), name='global.geocode'),
- url(r'^reauth/$', user.ReauthView.as_view(), name='user.reauth'),
- url(r'^sudo/$', user.StartStaffSession.as_view(), name='user.sudo'),
- url(r'^sudo/stop/$', user.StopStaffSession.as_view(), name='user.sudo.stop'),
- url(r'^sudo/(?P\d+)/$', user.EditStaffSession.as_view(), name='user.sudo.edit'),
- url(r'^sudo/sessions/$', user.StaffSessionList.as_view(), name='user.sudo.list'),
- url(r'^users/$', users.UserListView.as_view(), name='users'),
- url(r'^users/select2$', typeahead.users_select2, name='users.select2'),
- url(r'^users/add$', users.UserCreateView.as_view(), name='users.add'),
- url(r'^users/impersonate/stop', users.UserImpersonateStopView.as_view(), name='users.impersonate.stop'),
- url(r'^users/(?P\d+)/$', users.UserEditView.as_view(), name='users.edit'),
- url(r'^users/(?P\d+)/reset$', users.UserResetView.as_view(), name='users.reset'),
- url(r'^users/(?P\d+)/impersonate', users.UserImpersonateView.as_view(), name='users.impersonate'),
- url(r'^users/(?P\d+)/anonymize', users.UserAnonymizeView.as_view(), name='users.anonymize'),
- url(r'^pdf/editor/webfonts.css', pdf.FontsCSSView.as_view(), name='pdf.css'),
- url(r'^settings/?$', user.UserSettings.as_view(), name='user.settings'),
- url(r'^settings/history/$', user.UserHistoryView.as_view(), name='user.settings.history'),
- url(r'^settings/notifications/$', user.UserNotificationsEditView.as_view(), name='user.settings.notifications'),
- url(r'^settings/notifications/off/(?P\d+)/(?P[^/]+)/$', user.UserNotificationsDisableView.as_view(),
+ path('logout', auth.logout, name='auth.logout'),
+ path('login', auth.login, name='auth.login'),
+ path('login/2fa', auth.Login2FAView.as_view(), name='auth.login.2fa'),
+ path('register', auth.register, name='auth.register'),
+ re_path(r'^invite/(?P[a-zA-Z0-9]+)$', auth.invite, name='auth.invite'),
+ path('forgot', auth.Forgot.as_view(), name='auth.forgot'),
+ path('forgot/recover', auth.Recover.as_view(), name='auth.forgot.recover'),
+ path('', dashboards.user_index, name='index'),
+ re_path(r'^widgets.json$', dashboards.user_index_widgets_lazy, name='index.widgets'),
+ path('global/settings/', global_settings.GlobalSettingsView.as_view(), name='global.settings'),
+ path('global/update/', global_settings.UpdateCheckView.as_view(), name='global.update'),
+ path('global/message/', global_settings.MessageView.as_view(), name='global.message'),
+ path('logdetail/', global_settings.LogDetailView.as_view(), name='global.logdetail'),
+ path('logdetail/payment/', global_settings.PaymentDetailView.as_view(), name='global.paymentdetail'),
+ path('logdetail/refund/', global_settings.RefundDetailView.as_view(), name='global.refunddetail'),
+ path('geocode/', geo.GeoCodeView.as_view(), name='global.geocode'),
+ path('reauth/', user.ReauthView.as_view(), name='user.reauth'),
+ path('sudo/', user.StartStaffSession.as_view(), name='user.sudo'),
+ path('sudo/stop/', user.StopStaffSession.as_view(), name='user.sudo.stop'),
+ path('sudo//', user.EditStaffSession.as_view(), name='user.sudo.edit'),
+ path('sudo/sessions/', user.StaffSessionList.as_view(), name='user.sudo.list'),
+ path('users/', users.UserListView.as_view(), name='users'),
+ path('users/select2', typeahead.users_select2, name='users.select2'),
+ path('users/add', users.UserCreateView.as_view(), name='users.add'),
+ re_path(r'^users/impersonate/stop', users.UserImpersonateStopView.as_view(), name='users.impersonate.stop'),
+ path('users//', users.UserEditView.as_view(), name='users.edit'),
+ path('users//reset', users.UserResetView.as_view(), name='users.reset'),
+ re_path(r'^users/(?P\d+)/impersonate', users.UserImpersonateView.as_view(), name='users.impersonate'),
+ re_path(r'^users/(?P\d+)/anonymize', users.UserAnonymizeView.as_view(), name='users.anonymize'),
+ re_path(r'^pdf/editor/webfonts.css', pdf.FontsCSSView.as_view(), name='pdf.css'),
+ re_path(r'^settings/?$', user.UserSettings.as_view(), name='user.settings'),
+ path('settings/history/', user.UserHistoryView.as_view(), name='user.settings.history'),
+ path('settings/notifications/', user.UserNotificationsEditView.as_view(), name='user.settings.notifications'),
+ path('settings/notifications/off///', user.UserNotificationsDisableView.as_view(),
name='user.settings.notifications.off'),
- url(r'^settings/oauth/authorized/$', oauth.AuthorizationListView.as_view(),
+ path('settings/oauth/authorized/', oauth.AuthorizationListView.as_view(),
name='user.settings.oauth.list'),
- url(r'^settings/oauth/authorized/(?P\d+)/revoke$', oauth.AuthorizationRevokeView.as_view(),
+ path('settings/oauth/authorized//revoke', oauth.AuthorizationRevokeView.as_view(),
name='user.settings.oauth.revoke'),
- url(r'^settings/oauth/apps/$', oauth.OAuthApplicationListView.as_view(),
+ path('settings/oauth/apps/', oauth.OAuthApplicationListView.as_view(),
name='user.settings.oauth.apps'),
- url(r'^settings/oauth/apps/add$', oauth.OAuthApplicationRegistrationView.as_view(),
+ path('settings/oauth/apps/add', oauth.OAuthApplicationRegistrationView.as_view(),
name='user.settings.oauth.apps.register'),
- url(r'^settings/oauth/apps/(?P\d+)/$', oauth.OAuthApplicationUpdateView.as_view(),
+ path('settings/oauth/apps//', oauth.OAuthApplicationUpdateView.as_view(),
name='user.settings.oauth.app'),
- url(r'^settings/oauth/apps/(?P\d+)/disable$', oauth.OAuthApplicationDeleteView.as_view(),
+ path('settings/oauth/apps//disable', oauth.OAuthApplicationDeleteView.as_view(),
name='user.settings.oauth.app.disable'),
- url(r'^settings/oauth/apps/(?P\d+)/roll$', oauth.OAuthApplicationRollView.as_view(),
+ path('settings/oauth/apps//roll', oauth.OAuthApplicationRollView.as_view(),
name='user.settings.oauth.app.roll'),
- url(r'^settings/2fa/$', user.User2FAMainView.as_view(), name='user.settings.2fa'),
- url(r'^settings/2fa/add$', user.User2FADeviceAddView.as_view(), name='user.settings.2fa.add'),
- url(r'^settings/2fa/enable', user.User2FAEnableView.as_view(), name='user.settings.2fa.enable'),
- url(r'^settings/2fa/disable', user.User2FADisableView.as_view(), name='user.settings.2fa.disable'),
- url(r'^settings/2fa/regenemergency', user.User2FARegenerateEmergencyView.as_view(),
+ path('settings/2fa/', user.User2FAMainView.as_view(), name='user.settings.2fa'),
+ path('settings/2fa/add', user.User2FADeviceAddView.as_view(), name='user.settings.2fa.add'),
+ re_path(r'^settings/2fa/enable', user.User2FAEnableView.as_view(), name='user.settings.2fa.enable'),
+ re_path(r'^settings/2fa/disable', user.User2FADisableView.as_view(), name='user.settings.2fa.disable'),
+ re_path(r'^settings/2fa/regenemergency', user.User2FARegenerateEmergencyView.as_view(),
name='user.settings.2fa.regenemergency'),
- url(r'^settings/2fa/totp/(?P[0-9]+)/confirm', user.User2FADeviceConfirmTOTPView.as_view(),
+ re_path(r'^settings/2fa/totp/(?P[0-9]+)/confirm', user.User2FADeviceConfirmTOTPView.as_view(),
name='user.settings.2fa.confirm.totp'),
- url(r'^settings/2fa/webauthn/(?P[0-9]+)/confirm', user.User2FADeviceConfirmWebAuthnView.as_view(),
+ re_path(r'^settings/2fa/webauthn/(?P[0-9]+)/confirm', user.User2FADeviceConfirmWebAuthnView.as_view(),
name='user.settings.2fa.confirm.webauthn'),
- url(r'^settings/2fa/(?P[^/]+)/(?P[0-9]+)/delete', user.User2FADeviceDeleteView.as_view(),
+ re_path(r'^settings/2fa/(?P[^/]+)/(?P[0-9]+)/delete', user.User2FADeviceDeleteView.as_view(),
name='user.settings.2fa.delete'),
- url(r'^organizers/$', organizer.OrganizerList.as_view(), name='organizers'),
- url(r'^organizers/add$', organizer.OrganizerCreate.as_view(), name='organizers.add'),
- url(r'^organizers/select2$', typeahead.organizer_select2, name='organizers.select2'),
- url(r'^organizer/(?P[^/]+)/$', organizer.OrganizerDetail.as_view(), name='organizer'),
- url(r'^organizer/(?P[^/]+)/edit$', organizer.OrganizerUpdate.as_view(), name='organizer.edit'),
- url(r'^organizer/(?P[^/]+)/delete$', organizer.OrganizerDelete.as_view(), name='organizer.delete'),
- url(r'^organizer/(?P[^/]+)/settings/display$', organizer.OrganizerDisplaySettings.as_view(),
+ path('organizers/', organizer.OrganizerList.as_view(), name='organizers'),
+ path('organizers/add', organizer.OrganizerCreate.as_view(), name='organizers.add'),
+ path('organizers/select2', typeahead.organizer_select2, name='organizers.select2'),
+ path('organizer//', organizer.OrganizerDetail.as_view(), name='organizer'),
+ path('organizer//edit', organizer.OrganizerUpdate.as_view(), name='organizer.edit'),
+ path('organizer//delete', organizer.OrganizerDelete.as_view(), name='organizer.delete'),
+ path('organizer//settings/display', organizer.OrganizerDisplaySettings.as_view(),
name='organizer.display'),
- url(r'^organizer/(?P[^/]+)/properties$', organizer.EventMetaPropertyListView.as_view(), name='organizer.properties'),
- url(r'^organizer/(?P[^/]+)/property/add$', organizer.EventMetaPropertyCreateView.as_view(),
+ path('organizer//properties', organizer.EventMetaPropertyListView.as_view(), name='organizer.properties'),
+ path('organizer//property/add', organizer.EventMetaPropertyCreateView.as_view(),
name='organizer.property.add'),
- url(r'^organizer/(?P[^/]+)/property/(?P[^/]+)/edit$', organizer.EventMetaPropertyUpdateView.as_view(),
+ path('organizer//property//edit', organizer.EventMetaPropertyUpdateView.as_view(),
name='organizer.property.edit'),
- url(r'^organizer/(?P[^/]+)/property/(?P[^/]+)/delete$', organizer.EventMetaPropertyDeleteView.as_view(),
+ path('organizer//property//delete', organizer.EventMetaPropertyDeleteView.as_view(),
name='organizer.property.delete'),
- url(r'^organizer/(?P[^/]+)/giftcards$', organizer.GiftCardListView.as_view(), name='organizer.giftcards'),
- url(r'^organizer/(?P[^/]+)/giftcard/add$', organizer.GiftCardCreateView.as_view(), name='organizer.giftcard.add'),
- url(r'^organizer/(?P[^/]+)/giftcard/(?P[^/]+)/$', organizer.GiftCardDetailView.as_view(), name='organizer.giftcard'),
- url(r'^organizer/(?P[^/]+)/giftcard/(?P[^/]+)/edit$', organizer.GiftCardUpdateView.as_view(),
+ path('organizer//giftcards', organizer.GiftCardListView.as_view(), name='organizer.giftcards'),
+ path('organizer//giftcard/add', organizer.GiftCardCreateView.as_view(), name='organizer.giftcard.add'),
+ path('organizer//giftcard//', organizer.GiftCardDetailView.as_view(), name='organizer.giftcard'),
+ path('organizer//giftcard//edit', organizer.GiftCardUpdateView.as_view(),
name='organizer.giftcard.edit'),
- url(r'^organizer/(?P[^/]+)/webhooks$', organizer.WebHookListView.as_view(), name='organizer.webhooks'),
- url(r'^organizer/(?P[^/]+)/webhook/add$', organizer.WebHookCreateView.as_view(),
+ path('organizer//webhooks', organizer.WebHookListView.as_view(), name='organizer.webhooks'),
+ path('organizer//webhook/add', organizer.WebHookCreateView.as_view(),
name='organizer.webhook.add'),
- url(r'^organizer/(?P[^/]+)/webhook/(?P[^/]+)/edit$', organizer.WebHookUpdateView.as_view(),
+ path('organizer//webhook//edit', organizer.WebHookUpdateView.as_view(),
name='organizer.webhook.edit'),
- url(r'^organizer/(?P[^/]+)/webhook/(?P[^/]+)/logs$', organizer.WebHookLogsView.as_view(),
+ path('organizer//webhook//logs', organizer.WebHookLogsView.as_view(),
name='organizer.webhook.logs'),
- url(r'^organizer/(?P[^/]+)/devices$', organizer.DeviceListView.as_view(), name='organizer.devices'),
- url(r'^organizer/(?P[^/]+)/device/add$', organizer.DeviceCreateView.as_view(),
+ path('organizer//devices', organizer.DeviceListView.as_view(), name='organizer.devices'),
+ path('organizer//device/add', organizer.DeviceCreateView.as_view(),
name='organizer.device.add'),
- url(r'^organizer/(?P[^/]+)/device/(?P[^/]+)/edit$', organizer.DeviceUpdateView.as_view(),
+ path('organizer//device//edit', organizer.DeviceUpdateView.as_view(),
name='organizer.device.edit'),
- url(r'^organizer/(?P[^/]+)/device/(?P[^/]+)/connect$', organizer.DeviceConnectView.as_view(),
+ path('organizer//device//connect', organizer.DeviceConnectView.as_view(),
name='organizer.device.connect'),
- url(r'^organizer/(?P[^/]+)/device/(?P[^/]+)/revoke$', organizer.DeviceRevokeView.as_view(),
+ path('organizer//device//revoke', organizer.DeviceRevokeView.as_view(),
name='organizer.device.revoke'),
- url(r'^organizer/(?P[^/]+)/device/(?P[^/]+)/logs$', organizer.DeviceLogView.as_view(),
+ path('organizer//device//logs', organizer.DeviceLogView.as_view(),
name='organizer.device.logs'),
- url(r'^organizer/(?P[^/]+)/gates$', organizer.GateListView.as_view(), name='organizer.gates'),
- url(r'^organizer/(?P[^/]+)/gate/add$', organizer.GateCreateView.as_view(), name='organizer.gate.add'),
- url(r'^organizer/(?P[^/]+)/gate/(?P[^/]+)/edit$', organizer.GateUpdateView.as_view(),
+ path('organizer//gates', organizer.GateListView.as_view(), name='organizer.gates'),
+ path('organizer//gate/add', organizer.GateCreateView.as_view(), name='organizer.gate.add'),
+ path('organizer//gate//edit', organizer.GateUpdateView.as_view(),
name='organizer.gate.edit'),
- url(r'^organizer/(?P[^/]+)/gate/(?P[^/]+)/delete$', organizer.GateDeleteView.as_view(),
+ path('organizer//gate//delete', organizer.GateDeleteView.as_view(),
name='organizer.gate.delete'),
- url(r'^organizer/(?P[^/]+)/teams$', organizer.TeamListView.as_view(), name='organizer.teams'),
- url(r'^organizer/(?P[^/]+)/team/add$', organizer.TeamCreateView.as_view(), name='organizer.team.add'),
- url(r'^organizer/(?P[^/]+)/team/(?P[^/]+)/$', organizer.TeamMemberView.as_view(),
+ path('organizer//teams', organizer.TeamListView.as_view(), name='organizer.teams'),
+ path('organizer//team/add', organizer.TeamCreateView.as_view(), name='organizer.team.add'),
+ path('organizer//team//', organizer.TeamMemberView.as_view(),
name='organizer.team'),
- url(r'^organizer/(?P[^/]+)/team/(?P[^/]+)/edit$', organizer.TeamUpdateView.as_view(),
+ path('organizer//team//edit', organizer.TeamUpdateView.as_view(),
name='organizer.team.edit'),
- url(r'^organizer/(?P[^/]+)/team/(?P[^/]+)/delete$', organizer.TeamDeleteView.as_view(),
+ path('organizer//team//delete', organizer.TeamDeleteView.as_view(),
name='organizer.team.delete'),
- url(r'^organizer/(?P[^/]+)/slugrng', main.SlugRNG.as_view(), name='events.add.slugrng'),
- url(r'^organizer/(?P[^/]+)/logs', organizer.LogView.as_view(), name='organizer.log'),
- url(r'^organizer/(?P[^/]+)/export/$', organizer.ExportView.as_view(), name='organizer.export'),
- url(r'^organizer/(?P[^/]+)/export/do$', organizer.ExportDoView.as_view(), name='organizer.export.do'),
- url(r'^nav/typeahead/$', typeahead.nav_context_list, name='nav.typeahead'),
- url(r'^events/$', main.EventList.as_view(), name='events'),
- url(r'^events/add$', main.EventWizard.as_view(), name='events.add'),
- url(r'^events/typeahead/$', typeahead.event_list, name='events.typeahead'),
- url(r'^events/typeahead/meta/$', typeahead.meta_values, name='events.meta.typeahead'),
- url(r'^search/orders/$', search.OrderSearch.as_view(), name='search.orders'),
- url(r'^event/(?P[^/]+)/(?P[^/]+)/', include([
- url(r'^$', dashboards.event_index, name='event.index'),
- url(r'^widgets.json$', dashboards.event_index_widgets_lazy, name='event.index.widgets'),
- url(r'^live/$', event.EventLive.as_view(), name='event.live'),
- url(r'^logs/$', event.EventLog.as_view(), name='event.log'),
- url(r'^delete/$', event.EventDelete.as_view(), name='event.delete'),
- url(r'^requiredactions/$', event.EventActions.as_view(), name='event.requiredactions'),
- url(r'^requiredactions/(?P\d+)/discard$', event.EventActionDiscard.as_view(),
+ re_path(r'^organizer/(?P[^/]+)/slugrng', main.SlugRNG.as_view(), name='events.add.slugrng'),
+ re_path(r'^organizer/(?P[^/]+)/logs', organizer.LogView.as_view(), name='organizer.log'),
+ path('organizer//export/', organizer.ExportView.as_view(), name='organizer.export'),
+ path('organizer//export/do', organizer.ExportDoView.as_view(), name='organizer.export.do'),
+ path('nav/typeahead/', typeahead.nav_context_list, name='nav.typeahead'),
+ path('events/', main.EventList.as_view(), name='events'),
+ path('events/add', main.EventWizard.as_view(), name='events.add'),
+ path('events/typeahead/', typeahead.event_list, name='events.typeahead'),
+ path('events/typeahead/meta/', typeahead.meta_values, name='events.meta.typeahead'),
+ path('search/orders/', search.OrderSearch.as_view(), name='search.orders'),
+ path('event///', include([
+ path('', dashboards.event_index, name='event.index'),
+ re_path(r'^widgets.json$', dashboards.event_index_widgets_lazy, name='event.index.widgets'),
+ path('live/', event.EventLive.as_view(), name='event.live'),
+ path('logs/', event.EventLog.as_view(), name='event.log'),
+ path('delete/', event.EventDelete.as_view(), name='event.delete'),
+ path('requiredactions/', event.EventActions.as_view(), name='event.requiredactions'),
+ path('requiredactions//discard', event.EventActionDiscard.as_view(),
name='event.requiredaction.discard'),
- url(r'^comment/$', event.EventComment.as_view(),
+ path('comment/', event.EventComment.as_view(),
name='event.comment'),
- url(r'^quickstart/$', event.QuickSetupView.as_view(), name='event.quick'),
- url(r'^settings/$', event.EventUpdate.as_view(), name='event.settings'),
- url(r'^settings/plugins$', event.EventPlugins.as_view(), name='event.settings.plugins'),
- url(r'^settings/payment/(?P[^/]+)$', event.PaymentProviderSettings.as_view(),
+ path('quickstart/', event.QuickSetupView.as_view(), name='event.quick'),
+ path('settings/', event.EventUpdate.as_view(), name='event.settings'),
+ path('settings/plugins', event.EventPlugins.as_view(), name='event.settings.plugins'),
+ path('settings/payment/', event.PaymentProviderSettings.as_view(),
name='event.settings.payment.provider'),
- url(r'^settings/payment$', event.PaymentSettings.as_view(), name='event.settings.payment'),
- url(r'^settings/tickets$', event.TicketSettings.as_view(), name='event.settings.tickets'),
- url(r'^settings/tickets/preview/(?P