diff --git a/src/api/urls.py b/src/api/urls.py index 3380c8feddd87d2ff933b48ea371b43cdd5e1501..666bda2725bef79cca5a911e64f0e94e23dceee4 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 a9d9789ac1f67e03a80319b836dcc9016061c83a..e19fc17f1cdf320195f31537bf6e09d0706f73f7 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})