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