Allow to use a custom domain per event (#1617)

* Drop support for maindomain_urls/subdomain_urls in plugins

* Allow to use a custom domain per event

* Fix bug when manually saving domains

* Fix custom domains in debugging

* Fix middleware

* Fix middleware again, update docs
This commit is contained in:
Raphael Michel
2020-03-23 13:03:14 +01:00
committed by GitHub
parent ac2fc2de5c
commit 7e9c9beace
19 changed files with 386 additions and 89 deletions

View File

@@ -18,7 +18,7 @@ class EventMiddleware:
if url.namespace != 'presale':
return self.get_response(request)
if 'organizer' in url.kwargs or 'event' in url.kwargs:
if 'organizer' in url.kwargs or 'event' in url.kwargs or getattr(request, 'event_domain', False):
redirect = _detect_event(request, require_live=url.url_name != 'event.widget.productlist')
if redirect:
return redirect

View File

@@ -20,7 +20,9 @@ from pretix.base.services.tasks import (
TransactionAwareProfiledEventTask, TransactionAwareTask,
)
from pretix.celery_app import app
from pretix.multidomain.urlreverse import get_domain
from pretix.multidomain.urlreverse import (
get_event_domain, get_organizer_domain,
)
from pretix.presale.signals import sass_postamble, sass_preamble
logger = logging.getLogger('pretix.presale.style')
@@ -33,7 +35,10 @@ def compile_scss(object, file="main.scss", fonts=True):
def static(path):
sp = _static(path)
if not settings.MEDIA_URL.startswith("/") and sp.startswith("/"):
domain = get_domain(object.organizer if isinstance(object, Event) else object)
if isinstance(object, Event):
domain = get_event_domain(object, fallback=True)
else:
domain = get_organizer_domain(object)
if domain:
siteurlsplit = urlsplit(settings.SITE_URL)
if siteurlsplit.port and siteurlsplit.port not in (80, 443):

View File

@@ -14,7 +14,9 @@ from django_scopes import scope
from pretix.base.channels import WebshopSalesChannel
from pretix.base.middleware import LocaleMiddleware
from pretix.base.models import Event, Organizer
from pretix.multidomain.urlreverse import get_domain
from pretix.multidomain.urlreverse import (
get_event_domain, get_organizer_domain,
)
from pretix.presale.signals import process_request, process_response
SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
@@ -31,7 +33,10 @@ def _detect_event(request, require_live=True, require_plugin=None):
url = resolve(request.path_info)
try:
if hasattr(request, 'organizer_domain'):
if hasattr(request, 'event_domain'):
# We are on an event's custom domain
pass
elif hasattr(request, 'organizer_domain'):
# We are on an organizer's custom domain
if 'organizer' in url.kwargs and url.kwargs['organizer']:
if url.kwargs['organizer'] != request.organizer.slug:
@@ -44,6 +49,16 @@ def _detect_event(request, require_live=True, require_plugin=None):
organizer=request.organizer,
)
request.organizer = request.organizer
# If this event has a custom domain, send the user there
domain = get_event_domain(request.event)
if domain:
if request.port and request.port not in (80, 443):
domain = '%s:%d' % (domain, request.port)
path = request.get_full_path().split("/", 2)[-1]
r = redirect(urljoin('%s://%s' % (request.scheme, domain), path))
r['Access-Control-Allow-Origin'] = '*'
return r
else:
# We are on our main domain
if 'event' in url.kwargs and 'organizer' in url.kwargs:
@@ -55,6 +70,16 @@ def _detect_event(request, require_live=True, require_plugin=None):
organizer__slug=url.kwargs['organizer']
)
request.organizer = request.event.organizer
# If this event has a custom domain, send the user there
domain = get_event_domain(request.event)
if domain:
if request.port and request.port not in (80, 443):
domain = '%s:%d' % (domain, request.port)
path = request.get_full_path().split("/", 3)[-1]
r = redirect(urljoin('%s://%s' % (request.scheme, domain), path))
r['Access-Control-Allow-Origin'] = '*'
return r
elif 'organizer' in url.kwargs:
request.organizer = Organizer.objects.using(db).get(
slug=url.kwargs['organizer']
@@ -63,7 +88,7 @@ def _detect_event(request, require_live=True, require_plugin=None):
raise Http404()
# If this organizer has a custom domain, send the user there
domain = get_domain(request.organizer)
domain = get_organizer_domain(request.organizer)
if domain:
if request.port and request.port not in (80, 443):
domain = '%s:%d' % (domain, request.port)