From ef7ea3b6c12279847a6d9cbe5eb1616df8ef2cec Mon Sep 17 00:00:00 2001
From: Lucas Brandstaetter <lucas@brandstaetter.tech>
Date: Fri, 27 Dec 2024 17:05:14 +0000
Subject: [PATCH] Add a new url to redeem a badge by token

Now possible without request parameter and can be resolved with the url
and hub_absolute functions.
---
 src/plainui/urls.py         | 1 +
 src/plainui/views/badges.py | 8 ++++++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/plainui/urls.py b/src/plainui/urls.py
index c6ac7b5d6..69bcc2b6e 100644
--- a/src/plainui/urls.py
+++ b/src/plainui/urls.py
@@ -29,6 +29,7 @@ urlpatterns = [
     path('logout', views.LogoutView.as_view(), name='logout'),
     path('me', views.ProfileView.as_view(), name='userprofile'),
     path('me/manage_badges', views.ManageBadgesView.as_view(), name='manage_badges'),
+    path('me/manage_badges/redeem/<str:redeem_token>', views.ManageBadgesView.as_view(), name='manage_badges'),
     path('me/manage_badges/settings', views.BadgeSettingsView.as_view(), name='manage_badges__settings'),
     path('me/manage_badges/<uuid:pk>/accept', views.ManageBadgeView.as_view(mode='accept'), name='manage_badges__accept'),
     path('me/manage_badges/<uuid:pk>/update', views.ManageBadgeView.as_view(mode='update'), name='manage_badges__update'),
diff --git a/src/plainui/views/badges.py b/src/plainui/views/badges.py
index 83e9bb3ad..4f5ebe983 100644
--- a/src/plainui/views/badges.py
+++ b/src/plainui/views/badges.py
@@ -167,7 +167,7 @@ class RedeemBadgeView(ConferenceRequiredMixin, FormView):
         return context
 
     def get(self, request: HttpRequest, *args: str, **kwargs: Any) -> HttpResponse:
-        token = request.GET.get('redeem_token')
+        token = request.GET.get('redeem_token', kwargs.get('redeem_token'))
         try:
             self.form = RedeemBadgeForm({'token': token, 'purpose': 'redeem_token'}, conference=self.conf)
             if self.form.is_valid():
@@ -238,7 +238,11 @@ class ManageBadgesView(ConferenceRequiredMixin, TemplateView):
         return context
 
     def dispatch(self, request, *args, **kwargs):
-        if (hasattr(request, 'GET') and request.GET.get('redeem_token')) or (hasattr(request, 'GET') and request.POST.get('purpose', None) == 'redeem_token'):
+        if (
+            (hasattr(request, 'GET') and request.GET.get('redeem_token'))
+            or (hasattr(request, 'GET') and request.POST.get('purpose', None) == 'redeem_token')
+            or kwargs.get('redeem_token')
+        ):
             return RedeemBadgeView.as_view(external_context=self.get_context_data())(request, *args, **kwargs)
         return super().dispatch(request, *args, **kwargs)
 
-- 
GitLab