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

1import base64 

2 

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 

11 

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 

17 

18 

19class QRCodeCreateByTicket(APIView): 

20 permission_classes = [IsAuthenticated] 

21 serializer_class = QRCodeSerializer 

22 

23 

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) 

36 

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 ) 

42 

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) 

47 

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') 

52 

53 

54 qrcode_obj, created = QrCode.objects.get_or_create( 

55 ticket=ticket, 

56 data=qr_data 

57 ) 

58 

59 serializer = QRCodeSerializer(qrcode_obj) 

60 return Response(serializer.data, status=status.HTTP_201_CREATED) 

61 

62 

63 

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] 

70 

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 ) 

84 

85 serializer = TicketSerializer(ticket) 

86 return Response(serializer.data, status=status.HTTP_200_OK)