diff --git a/src/pretix/multidomain/organizer_alternative_domain_urlconf.py b/src/pretix/multidomain/organizer_alternative_domain_urlconf.py index 2afbeed585..f1263a3f9f 100644 --- a/src/pretix/multidomain/organizer_alternative_domain_urlconf.py +++ b/src/pretix/multidomain/organizer_alternative_domain_urlconf.py @@ -41,15 +41,20 @@ for app in apps.get_app_configs(): if hasattr(app, 'PretixPluginMeta'): if importlib.util.find_spec(app.name + '.urls'): urlmod = importlib.import_module(app.name + '.urls') + single_plugin_patterns = [] + if hasattr(urlmod, 'event_patterns'): patterns = plugin_event_urls(urlmod.event_patterns, plugin=app.name) - raw_plugin_patterns.append( - re_path(r'^(?P[^/]+)/', include((patterns, app.label))) + single_plugin_patterns.append( + re_path(r'^(?P[^/]+)/', include(patterns)) ) + if hasattr(urlmod, 'organizer_patterns'): - patterns = plugin_event_urls(urlmod.organizer_patterns, plugin=app.name) + single_plugin_patterns += plugin_event_urls(urlmod.organizer_patterns, plugin=app.name) + + if single_plugin_patterns: raw_plugin_patterns.append( - re_path(r'', include((patterns, app.label))) + re_path(r'', include((single_plugin_patterns, app.label))) ) plugin_patterns = [ diff --git a/src/pretix/multidomain/organizer_domain_urlconf.py b/src/pretix/multidomain/organizer_domain_urlconf.py index d0b8d92a59..4d0717d34a 100644 --- a/src/pretix/multidomain/organizer_domain_urlconf.py +++ b/src/pretix/multidomain/organizer_domain_urlconf.py @@ -42,15 +42,20 @@ for app in apps.get_app_configs(): if hasattr(app, 'PretixPluginMeta'): 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( - re_path(r'^(?P[^/]+)/', include((patterns, app.label))) - ) + single_plugin_patterns = [] + if hasattr(urlmod, 'organizer_patterns'): - patterns = plugin_event_urls(urlmod.organizer_patterns, plugin=app.name) + single_plugin_patterns += plugin_event_urls(urlmod.organizer_patterns, plugin=app.name) + + if hasattr(urlmod, 'event_patterns'): + plugin_event_patterns = plugin_event_urls(urlmod.event_patterns, plugin=app.name) + single_plugin_patterns.append( + re_path(r'^(?P[^/]+)/', include(plugin_event_patterns)) + ) + + if single_plugin_patterns: raw_plugin_patterns.append( - re_path(r'', include((patterns, app.label))) + re_path(r'', include((single_plugin_patterns, app.label))) ) plugin_patterns = [ diff --git a/src/tests/multidomain/test_urlreverse.py b/src/tests/multidomain/test_urlreverse.py index 61211c4ef5..74739d181c 100644 --- a/src/tests/multidomain/test_urlreverse.py +++ b/src/tests/multidomain/test_urlreverse.py @@ -45,6 +45,8 @@ def env(): def test_event_main_domain_front_page(env): assert eventreverse(env[1], 'presale:event.index') == '/mrmcd/2015/' assert eventreverse(env[0], 'presale:organizer.index') == '/mrmcd/' + assert eventreverse(env[1], 'plugins:testdummy:view') == '/mrmcd/2015/testdummy' + assert eventreverse(env[0], 'plugins:testdummy:view') == '/mrmcd/testdummy' @pytest.mark.django_db @@ -52,12 +54,16 @@ def test_event_custom_domain_kwargs(env): KnownDomain.objects.create(domainname='foobar', organizer=env[0]) KnownDomain.objects.create(domainname='barfoo', organizer=env[0], event=env[1]) assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == 'http://barfoo/checkout/payment/' + assert eventreverse(env[0], 'plugins:testdummy:view') == 'http://foobar/testdummy' + assert eventreverse(env[1], 'plugins:testdummy:view') == 'http://barfoo/testdummy' @pytest.mark.django_db def test_event_org_domain_kwargs(env): KnownDomain.objects.create(domainname='foobar', organizer=env[0]) assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == 'http://foobar/2015/checkout/payment/' + assert eventreverse(env[0], 'plugins:testdummy:view') == 'http://foobar/testdummy' + assert eventreverse(env[1], 'plugins:testdummy:view') == 'http://foobar/2015/testdummy' @pytest.mark.django_db @@ -65,9 +71,13 @@ def test_event_org_alt_domain_kwargs(env): KnownDomain.objects.create(domainname='foobar', organizer=env[0]) d = KnownDomain.objects.create(domainname='altfoo', organizer=env[0], mode=KnownDomain.MODE_ORG_ALT_DOMAIN) assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == 'http://foobar/2015/checkout/payment/' + assert eventreverse(env[1], 'plugins:testdummy:view') == 'http://foobar/2015/testdummy' d.event_assignments.create(event=env[1]) with scopes_disabled(): - assert eventreverse(Event.objects.get(pk=env[1].pk), 'presale:event.checkout', {'step': 'payment'}) == 'http://altfoo/2015/checkout/payment/' + event = Event.objects.get(pk=env[1].pk) + assert eventreverse(event, 'presale:event.checkout', {'step': 'payment'}) == 'http://altfoo/2015/checkout/payment/' + assert eventreverse(env[0], 'plugins:testdummy:view') == 'http://foobar/testdummy' + assert eventreverse(event, 'plugins:testdummy:view') == 'http://altfoo/2015/testdummy' @pytest.mark.django_db diff --git a/src/tests/testdummy/urls.py b/src/tests/testdummy/urls.py new file mode 100644 index 0000000000..c4abab3492 --- /dev/null +++ b/src/tests/testdummy/urls.py @@ -0,0 +1,52 @@ +# +# This file is part of pretix (Community Edition). +# +# Copyright (C) 2014-2020 Raphael Michel and contributors +# Copyright (C) 2020-today pretix GmbH and contributors +# +# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General +# Public License as published by the Free Software Foundation in version 3 of the License. +# +# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are +# applicable granting you additional permissions and placing additional restrictions on your usage of this software. +# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive +# this file, see . +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +# details. +# +# You should have received a copy of the GNU Affero General Public License along with this program. If not, see +# . +# +from django.http import HttpResponse +from django.urls import path + + +def view(request): + return HttpResponse("") + + +urlpatterns = [ + path( + "testdummy", + view, + name="view", + ), +] + +organizer_patterns = [ + path( + "testdummy", + view, + name="view", + ), +] + +event_patterns = [ + path( + "testdummy", + view, + name="view", + ), +]