Coverage for qr_code_service\views.py: 47%
49 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 15:18 +0200
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 15:18 +0200
1import base64
3import qrcode
4from io import BytesIO
5from drf_spectacular.utils import extend_schema
6from rest_framework import status
7from rest_framework.permissions import IsAuthenticated
8from rest_framework.response import Response
9from rest_framework.views import APIView
10from rest_framework import serializers
12from api.serializers import TicketSerializer
13from authentication.permissions import IsAdminOrEmploye
14from qr_code_service.models import QrCode
15from .serializers import QRCodeSerializer, TicketIdSerializer
16from api.models import Ticket
19class QRCodeCreateByTicket(APIView):
20 permission_classes = [IsAuthenticated]
21 serializer_class = QRCodeSerializer
24 @extend_schema(
25 request=TicketIdSerializer,
26 responses=QRCodeSerializer
27 )
28 def post(self, request):
29 ticket_id = request.data.get('ticket_id')
30 if not ticket_id:
31 return Response({'message': 'ticket_id requis'}, status=400)
32 try:
33 ticket = Ticket.objects.get(id=ticket_id)
34 except Ticket.DoesNotExist:
35 return Response({'message': 'ticket_id invalide'}, status=status.HTTP_400_BAD_REQUEST)
37 if ticket.client != request.user.client_profile:
38 return Response(
39 {'message': "Vous n'êtes pas autorisé à accéder à ce ticket."},
40 status=status.HTTP_403_FORBIDDEN
41 )
43 qr_code = QrCode.objects.filter(ticket_id=ticket_id).first()
44 if qr_code:
45 serializer = QRCodeSerializer(qr_code)
46 return Response(serializer.data, status=200)
48 qr_image = qrcode.make(ticket.key)
49 buffer = BytesIO()
50 qr_image.save(buffer, format="PNG")
51 qr_data = base64.b64encode(buffer.getvalue()).decode('utf-8')
54 qrcode_obj, created = QrCode.objects.get_or_create(
55 ticket=ticket,
56 data=qr_data
57 )
59 serializer = QRCodeSerializer(qrcode_obj)
60 return Response(serializer.data, status=status.HTTP_201_CREATED)
64class TicketByKeyView(APIView):
65 """
66 Vue qui reçoit une clé de ticket (key) et renvoie le ticket correspondant.
67 Accessible uniquement aux employés authentifiés.
68 """
69 permission_classes = [IsAdminOrEmploye]
71 @extend_schema(
72 request=None,
73 responses=TicketSerializer,
74 description="Récupère un ticket à partir de sa clé QR"
75 )
76 def get(self, request, key):
77 try:
78 ticket = Ticket.objects.get(key=key)
79 except Ticket.DoesNotExist:
80 return Response(
81 {"message": "Ticket introuvable"},
82 status=status.HTTP_404_NOT_FOUND
83 )
85 serializer = TicketSerializer(ticket)
86 return Response(serializer.data, status=status.HTTP_200_OK)