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 TicketListSerializer, MessageSerializer, TicketSerializer from utils.pagination import StructurePagination from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiTypes 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(APIView): serializer_class = TicketListSerializer permission_classes = [permissions.IsAuthenticated] pagination_class = StructurePagination @extend_schema( parameters=[ OpenApiParameter( name="limit", description="لیمیتش", required=False, type=OpenApiTypes.INT, ), OpenApiParameter( name="offset", description="افستش", required=False, type=OpenApiTypes.INT, ) ], responses={ 200: TicketListSerializer(many=True), 404: OpenApiTypes.OBJECT, }, ) def get(self, request): tickets = Ticket.objects.filter(customer=request.user) paginator = self.pagination_class() paginated_tickets = paginator.paginate_queryset(tickets, request) tickets_ser = self.serializer_class(instance=paginated_tickets, many=True, context={'request': request}) return paginator.get_paginated_response(tickets_ser.data) 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"})