From e6a4e97380ebfaaccdd1b70086dfd6b903828026 Mon Sep 17 00:00:00 2001
From: Andreas Hubel <andi@saerdnaer.de>
Date: Mon, 18 Dec 2023 19:01:53 +0100
Subject: [PATCH] add redirects via external_id for event and speaker

---
 src/plainui/urls.py         |  2 ++
 src/plainui/views/events.py | 12 ++++++++++++
 src/plainui/views/users.py  |  8 ++++++++
 3 files changed, 22 insertions(+)

diff --git a/src/plainui/urls.py b/src/plainui/urls.py
index 3eb67cd26..1ae766a44 100644
--- a/src/plainui/urls.py
+++ b/src/plainui/urls.py
@@ -53,6 +53,8 @@ urlpatterns = [
     path('board/<int:pk>/delete', views.BoardEntryDeleteView.as_view(), name='board_entry_delete'),
     path('channels', views.ChannelEventsView.as_view(), name='channel_events'),
     path('fahrplan', views.FahrplanView.as_view(), name='fahrplan'),
+    path('fahrplan/events/<external_id>.html', views.EventByExternalIdView.as_view(), name='event_by_external_id'),
+    path('fahrplan/speakers/<external_id>.html', views.UserByExternalIdView.as_view(), name='user_by_external_id'),
     path('modify_favorites', views.ModifyFavoritesView.as_view(), name='modify_favorites'),
     path('modify_theme', views.ModifyThemeView.as_view(), name='modify_theme'),
     path('index', views.IndexView.as_view(), name='index'),
diff --git a/src/plainui/views/events.py b/src/plainui/views/events.py
index f6e7fc3c7..032f64cbb 100644
--- a/src/plainui/views/events.py
+++ b/src/plainui/views/events.py
@@ -1,5 +1,7 @@
 __all__ = (
     'AssembliesEventsView',
+    'EventByExternalIdView',
+    'UpcomingView',
     'ChannelEventsView',
     'EventView',
     'SosJoin',
@@ -26,6 +28,7 @@ from core.models import (
     TagItem,
 )
 from core.views.list_views import FilteredListView
+from core.models.schedules import ScheduleSourceMapping
 
 from plainui.views.utils import ConferenceRequiredMixin, event_filter, organize_events_for_calendar, session_get_favorite_events
 
@@ -86,6 +89,15 @@ class EventView(ConferenceRequiredMixin, TemplateView):
         return context
 
 
+class EventByExternalIdView(ConferenceRequiredMixin, View):
+    def get(self, *args, external_id, **kwargs):
+        # TODO: What happens if there are multiple matching mappings?
+        # should we prefer import sources of official assemblies
+        # should we filter on the current conference?
+        m = get_object_or_404(ScheduleSourceMapping.objects.filter(mapping_type='event', source_id=external_id))
+        return redirect(reverse('plainui:event', kwargs={'guid': m.local_id}))
+
+
 class UpcomingView(ConferenceRequiredMixin, TemplateView):
     template_name = 'plainui/upcoming.html.j2'
 
diff --git a/src/plainui/views/users.py b/src/plainui/views/users.py
index 785e05241..0af9967b6 100644
--- a/src/plainui/views/users.py
+++ b/src/plainui/views/users.py
@@ -1,6 +1,7 @@
 __all__ = (
     'UserByUuidView',
     'UserView',
+    'UserByExternalIdView',
 )
 
 from django.db.models import Q
@@ -16,6 +17,7 @@ from core.models import (
     UserBadge,
     UserContact,
 )
+from core.models.schedules import ScheduleSourceMapping
 
 from plainui.views.utils import (
     ConferenceRequiredMixin,
@@ -86,3 +88,9 @@ class UserByUuidView(ConferenceRequiredMixin, View):
     def get(self, *args, uuid, **kwargs):
         user = get_object_or_404(PlatformUser.objects.filter(uuid=uuid))
         return redirect(reverse('plainui:user', kwargs={'user_slug': user.slug}))
+
+
+class UserByExternalIdView(ConferenceRequiredMixin, View):
+    def get(self, *args, external_id, **kwargs):
+        m = get_object_or_404(ScheduleSourceMapping.objects.filter(mapping_type='speaker', source_id=external_id))
+        return redirect(reverse('plainui:user', kwargs={'user_id': m.local_id}))
-- 
GitLab