diff --git a/app/eventyay/multidomain/maindomain_urlconf.py b/app/eventyay/multidomain/maindomain_urlconf.py index 4c0425fbde..429464235c 100644 --- a/app/eventyay/multidomain/maindomain_urlconf.py +++ b/app/eventyay/multidomain/maindomain_urlconf.py @@ -20,7 +20,6 @@ # Ticket-video integration: plugin URLs are auto-included via plugin handler below. from eventyay.config.urls import common_patterns -from eventyay.multidomain import redirects from eventyay.multidomain.plugin_handler import plugin_event_urls from eventyay.presale.urls import ( event_patterns, @@ -32,40 +31,6 @@ WEBAPP_DIST_DIR = os.path.normpath(os.path.join(BASE_DIR, 'static', 'webapp')) logger = logging.getLogger(__name__) -EXCLUDED_LEGACY_PREFIXES = ( - "common", - "control", - "orga", - "admin", - "api", - "video", - "static", - "media", -) - -MATCHED_LEGACY_SUBPATHS = ( - "schedule", - "talk", - "speaker", - "featured", - "sneak", - "cfp", - "submit", - "me", - "login", - "logout", - "auth", - "reset", - "invitation", - "online-video", - "widgets", - "static", - "locale", - "sw\\.js", -) - -EXCLUDED_LEGACY_PREFIXES_REGEX = "|".join(EXCLUDED_LEGACY_PREFIXES) -MATCHED_LEGACY_SUBPATHS_REGEX = "|".join(MATCHED_LEGACY_SUBPATHS) class VideoSPAView(View): def get(self, request, *args, **kwargs): @@ -270,44 +235,12 @@ def get(self, request, path='', *args, **kwargs): ), ] -# Legacy redirect patterns for backward compatibility -legacy_redirect_patterns = [ - # Legacy standalone video SPA at /video - re_path(r'^video/assets/(?P.*)$', VideoAssetView.as_view(), name='video.legacy.assets'), - re_path( - r'^video/(?P[^?]*\.[a-zA-Z0-9._-]+)$', - VideoAssetView.as_view(), - name='video.legacy.assets.file', - ), - re_path(r'^video/?$', VideoSPAView.as_view(), name='video.legacy.index'), - # Legacy video URLs: /video/ -> /{organizer}/{event}/video - re_path( - r'^video/(?P(?!assets)[^/]+)(?:/.*)?$', - redirects.legacy_video_redirect, - name='video.legacy.redirect', - ), - # Legacy talk URLs: //(path) -> /{organizer}/{event}/(path) - # This excludes known top-level namespaces before treating the first segment as an event slug. - re_path( - rf'^(?!(?:{EXCLUDED_LEGACY_PREFIXES_REGEX})/)(?P[^/]+)/({MATCHED_LEGACY_SUBPATHS_REGEX})(?:/|$)', - redirects.legacy_talk_redirect, - name='talk.legacy.redirect', - ), - # Legacy event base URL: // -> /{organizer}/{event}/ - re_path( - rf'^(?!(?:{EXCLUDED_LEGACY_PREFIXES_REGEX})/)(?P[^/]+)/$', - redirects.legacy_talk_redirect, - name='talk.legacy.base.redirect', - ), -] - urlpatterns = ( common_patterns + storage_patterns - # The plugins patterns must be before legacy_redirect_patterns and presale_patterns_main + # The plugins patterns must be before presale_patterns_main # to avoid misdetection of plugin prefixes and organizer/event slugs. + plugin_patterns - + legacy_redirect_patterns + presale_patterns_main + unified_event_patterns ) diff --git a/app/eventyay/multidomain/redirects.py b/app/eventyay/multidomain/redirects.py deleted file mode 100644 index 6e065d5b8e..0000000000 --- a/app/eventyay/multidomain/redirects.py +++ /dev/null @@ -1,83 +0,0 @@ -"""Redirect views for backward compatibility with legacy URLs.""" - -import logging -from django.http import HttpResponsePermanentRedirect, Http404 -from django.shortcuts import get_object_or_404 -from eventyay.base.models import Event - -logger = logging.getLogger(__name__) - - -def legacy_video_redirect(request, event_identifier): - """ - Redirect legacy video URLs from /video/ to /{organizer}/{event}/video. - - Args: - request: The HTTP request - event_identifier: Can be either event.pk or event.slug - - Returns: - HttpResponsePermanentRedirect to new URL structure - """ - # Try to find event by PK first, then by slug - event = None - try: - if event_identifier.isdigit(): - event = Event.objects.select_related('organizer').get(pk=int(event_identifier)) - else: - event = Event.objects.select_related('organizer').get(slug=event_identifier) - except Event.DoesNotExist as exc: - raise Http404("Event not found") from exc - - # Preserve the path after the event identifier - path_parts = request.path.split('/', 3) - remaining_path = path_parts[3] if len(path_parts) > 3 else '' - - # Build new URL: /{organizer}/{event}/video/{remaining_path} - new_url = f"/{event.organizer.slug}/{event.slug}/video/" - if remaining_path: - new_url += remaining_path - - # Preserve query string - if request.GET: - new_url += f'?{request.GET.urlencode()}' - - logger.info("legacy_video_redirect -> %s", new_url) - return HttpResponsePermanentRedirect(new_url) - - -def legacy_talk_redirect(request, event_slug): - """ - Redirect legacy talk URLs from //* to /{organizer}/{event}/*. - - This handles URLs like: - - //schedule -> /{organizer}/{event}/schedule - - //talk/ -> /{organizer}/{event}/talk/ - - //cfp -> /{organizer}/{event}/cfp - - Args: - request: The HTTP request - event_slug: The event slug from the URL - - Returns: - HttpResponsePermanentRedirect to new URL structure - """ - # Find event by slug (need to get organizer) - event = get_object_or_404(Event.objects.select_related('organizer'), slug=event_slug) - - # Get the full path after the event slug - path_parts = request.path.split('/', 2) - remaining_path = path_parts[2] if len(path_parts) > 2 else '' - - # Build new URL: /{organizer}/{event}/{remaining_path} - new_url = f"/{event.organizer.slug}/{event.slug}/" - if remaining_path: - new_url += remaining_path - - # Preserve query string - if request.GET: - new_url += f'?{request.GET.urlencode()}' - - logger.info("legacy_talk_redirect -> %s", new_url) - return HttpResponsePermanentRedirect(new_url) -