from rest_framework import generics, permissions from rest_framework.response import Response from rest_framework.views import APIView from .models import Ticket, Message from .serializers import TicketSerializer, MessageSerializer class TicketCreateView(generics.CreateAPIView): queryset = Ticket.objects.all() serializer_class = TicketSerializer permission_classes = [permissions.IsAuthenticated] def perform_create(self, serializer): serializer.save(customer=self.request.user) class TicketListView(generics.ListAPIView): serializer_class = TicketSerializer permission_classes = [permissions.IsAuthenticated] def get_queryset(self): user = self.request.user if user.is_staff: return Ticket.objects.all() return Ticket.objects.filter(customer=user) class TicketDetailView(generics.RetrieveAPIView): queryset = Ticket.objects.all() serializer_class = TicketSerializer permission_classes = [permissions.IsAuthenticated] def get_queryset(self): user = self.request.user if user.is_staff: return Ticket.objects.all() return Ticket.objects.filter(customer=user) class MessageCreateView(generics.CreateAPIView): queryset = Message.objects.all() serializer_class = MessageSerializer permission_classes = [permissions.IsAuthenticated] def perform_create(self, serializer): ticket = serializer.validated_data.get('ticket') if self.request.user != ticket.customer and not self.request.user.is_staff: raise permissions.PermissionDenied("You are not authorized to send a message to this ticket.") serializer.save(sender=self.request.user) class UpdateTicketStatusView(APIView): permission_classes = [permissions.IsAdminUser] def post(self, request, pk): try: ticket = Ticket.objects.get(pk=pk) except Ticket.DoesNotExist: return Response({"error": "Ticket not found"}, status=404) new_status = request.data.get('status') if new_status not in ['open', 'in_progress', 'resolved', 'closed']: return Response({"error": "Invalid status"}, status=400) ticket.status = new_status ticket.save() return Response({"message": "Ticket status updated successfully"})