New handling of plugin URLs (#609)

This commit is contained in:
Raphael Michel
2017-08-29 10:01:50 +03:00
committed by GitHub
parent 557a05135e
commit 43b5140754
13 changed files with 83 additions and 37 deletions

View File

@@ -1,4 +1,5 @@
from django.apps import AppConfig
from django.urls import RegexURLPattern
class PretixMultidomainConfig(AppConfig):
@@ -7,3 +8,12 @@ class PretixMultidomainConfig(AppConfig):
default_app_config = 'pretix.multidomain.PretixMultidomainConfig'
def event_url(regex, view, kwargs=None, name=None, require_live=True):
if callable(view):
r = RegexURLPattern(regex, view, kwargs, name)
r._require_live = require_live
return r
else:
raise TypeError('view must be a callable.')

View File

@@ -5,6 +5,7 @@ from django.apps import apps
from django.conf.urls import include, url
from django.views.generic import TemplateView
from pretix.multidomain.plugin_handler import plugin_event_urls
from pretix.presale.urls import (
event_patterns, locale_patterns, organizer_patterns,
)
@@ -27,8 +28,9 @@ for app in apps.get_app_configs():
if hasattr(urlmod, 'urlpatterns'):
single_plugin_patterns += urlmod.urlpatterns
if hasattr(urlmod, 'event_patterns'):
patterns = plugin_event_urls(urlmod.event_patterns, plugin=app.name)
single_plugin_patterns.append(url(r'^(?P<organizer>[^/]+)/(?P<event>[^/]+)/',
include(urlmod.event_patterns)))
include(patterns)))
raw_plugin_patterns.append(
url(r'', include((single_plugin_patterns, app.label)))
)

View File

@@ -50,6 +50,7 @@ class MultiDomainMiddleware(MiddlewareMixin):
cache.set('pretix_multidomain_organizer_{}'.format(domain), orga.pk if orga else False, 3600)
if orga:
request.organizer_domain = True
request.organizer = orga if isinstance(orga, Organizer) else Organizer.objects.get(pk=orga)
request.urlconf = "pretix.multidomain.subdomain_urlconf"
else:

View File

@@ -0,0 +1,11 @@
from pretix.presale.utils import _event_view
def plugin_event_urls(urllist, plugin):
for entry in urllist:
if hasattr(entry, 'url_patterns'):
plugin_event_urls(entry.url_patterns, plugin)
elif hasattr(entry, 'callback'):
entry.callback = _event_view(entry.callback, require_plugin=plugin,
require_live=getattr(entry, '_require_live', True))
return urllist

View File

@@ -4,6 +4,7 @@ import warnings
from django.apps import apps
from django.conf.urls import include, url
from pretix.multidomain.plugin_handler import plugin_event_urls
from pretix.presale.urls import (
event_patterns, locale_patterns, organizer_patterns,
)
@@ -22,9 +23,11 @@ for app in apps.get_app_configs():
if importlib.util.find_spec(app.name + '.urls'):
urlmod = importlib.import_module(app.name + '.urls')
if hasattr(urlmod, 'event_patterns'):
patterns = plugin_event_urls(urlmod.event_patterns, plugin=app.name)
raw_plugin_patterns.append(
url(r'^(?P<event>[^/]+)/', include((urlmod.event_patterns, app.label)))
url(r'^(?P<event>[^/]+)/', include((patterns, app.label)))
)
elif importlib.util.find_spec(app.name + '.subdomain_urls'): # noqa
warnings.warn('Please put your config in an \'urls\' module using the event_patterns '
'attribute. Support for subdomain_urls in plugins will be dropped in the future.',