From 8279db99383bfd0a9a028bc6240a69894117265c Mon Sep 17 00:00:00 2001
From: Lucas Brandstaetter <lucas@brandstaetter.tech>
Date: Fri, 27 Dec 2024 01:48:39 +0000
Subject: [PATCH] Add award badge views

- Award by username
- Award by dect
---
 src/api/urls.py         |  2 ++
 src/api/views/badges.py | 35 +++++++++++++++++++++++++++++++++--
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/src/api/urls.py b/src/api/urls.py
index 3380c8fed..666bda272 100644
--- a/src/api/urls.py
+++ b/src/api/urls.py
@@ -41,6 +41,8 @@ urlpatterns = [
     path('map/assemblies/poi.json', maps.AssembliesPoiExportView.as_view(), name='map-assemblies-poi'),
     path('map/assemblies/areas.json', maps.AssembliesAreasExportView.as_view(), name='map-assemblies-areas'),
     path('badges/redeem_token', badges.redeem_badge_token, name='badge-redeem'),
+    path('badge/<uuid:pk>/award/user', badges.reward_badge_to_username, name='badge-award-username'),
+    path('badge/<uuid:pk>/award/dect', badges.reward_badge_to_dect, name='badge-award-dect'),
     path('rooms', rooms.ConferenceRoomList.as_view(), name='room-list'),
     path('room/<uuid:pk>/', rooms.ConferenceRoomDetail.as_view(), name='room-detail'),
     path('room/<uuid:pk>/schedule', schedule.RoomSchedule.as_view(), name='room-schedule'),
diff --git a/src/api/views/badges.py b/src/api/views/badges.py
index a9d9789ac..e19fc17f1 100644
--- a/src/api/views/badges.py
+++ b/src/api/views/badges.py
@@ -8,9 +8,9 @@ from rest_framework.response import Response
 from django.http import HttpResponse
 from django.shortcuts import get_object_or_404
 
-from core.models.badges import Badge, BadgeToken
+from core.models.badges import Badge, BadgeToken, UserBadge
 from core.models.conference import Conference
-from core.models.users import PlatformUser
+from core.models.users import PlatformUser, UserCommunicationChannel
 
 from api.permissions import HasIssuingToken, IsAssemblyManager, IsSuperUser
 from api.serializers import BadgeSerializer, BadgeTokenSerializer
@@ -79,3 +79,34 @@ def redeem_badge_token(request, conference, **kwargs):
     badge_token.redeem(user, False)
 
     return Response({'badge': f'{badge_token.badge}', 'user': f'{user.username}'})
+
+
+@api_view(['POST'])
+def reward_badge_to_username(request, **kwargs):
+    badge = get_object_or_404(Badge, id=kwargs.get('pk'))
+    if not badge.issuing_assembly.user_can_manage(request.user):
+        return HttpResponse(status=403)
+    username = request.data.get('username', None)
+    user = get_object_or_404(PlatformUser, username__iexact=username, is_active=True)
+    UserBadge.objects.redeem_badge(user=user, badge=badge, issuer=request.user)
+    return Response({'badge': f'{badge.name}', 'rewarded': True})
+
+
+@api_view(['POST'])
+def reward_badge_to_dect(request, **kwargs):
+    badge = get_object_or_404(Badge, pk=kwargs.get('pk'))
+    if not badge.issuing_assembly.user_can_manage(request.user):
+        return HttpResponse(status=403)
+    dect = request.data.get('dect', None)
+    if dect is None:
+        return HttpResponse(status=400)
+    try:
+        dect = int(dect)
+    except ValueError:
+        return HttpResponse(status=400)
+    try:
+        user = get_object_or_404(UserCommunicationChannel, address=dect).user
+    except UserCommunicationChannel.MultipleObjectsReturned:
+        return Response({'error': 'Unique user cannot be found through dect'}, status=400)
+    UserBadge.objects.redeem_badge(user=user, badge=badge, issuer=request.user)
+    return Response({'badge': f'{badge.name}', 'rewarded': True})
-- 
GitLab