From e86e100e8cf01504cddf859f8a08d2a04ad7a6df Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Fri, 21 Feb 2025 21:41:01 +0330 Subject: [PATCH] ticket serializer and model update --- .../ticket/migrations/0011_ticket_content.py | 19 +++++++++ backend/ticket/models.py | 1 + backend/ticket/serializers.py | 8 ++++ backend/ticket/urls.py | 3 +- backend/ticket/views.py | 42 +++++++++++++++---- 5 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 backend/ticket/migrations/0011_ticket_content.py diff --git a/backend/ticket/migrations/0011_ticket_content.py b/backend/ticket/migrations/0011_ticket_content.py new file mode 100644 index 0000000..afcea91 --- /dev/null +++ b/backend/ticket/migrations/0011_ticket_content.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.2 on 2025-02-21 17:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0010_alter_message_created_at_alter_ticket_created_at_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='ticket', + name='content', + field=models.TextField(default='', verbose_name='جزيیات تیکت'), + preserve_default=False, + ), + ] diff --git a/backend/ticket/models.py b/backend/ticket/models.py index b59682b..3d74b4e 100644 --- a/backend/ticket/models.py +++ b/backend/ticket/models.py @@ -21,6 +21,7 @@ class Ticket(models.Model): ('other', 'سایر'), ] subject = models.CharField(max_length=255, verbose_name='موضوع') + content = models.TextField(verbose_name='جزيیات تیکت') ticket_category = models.CharField(max_length=30, verbose_name='دسته بندی تیکت', choices=CATEGORY_CHOICES) customer = models.ForeignKey(User, on_delete=models.CASCADE, related_name="tickets", verbose_name='کاربر') admin = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name="assigned_tickets", verbose_name='ادمین') diff --git a/backend/ticket/serializers.py b/backend/ticket/serializers.py index 362d18e..fa3355c 100644 --- a/backend/ticket/serializers.py +++ b/backend/ticket/serializers.py @@ -9,6 +9,14 @@ class MessageSerializer(serializers.ModelSerializer): class TicketSerializer(serializers.ModelSerializer): messages = MessageSerializer(many=True, read_only=True) + admin = ProfileSerializer(read_only=True) + class Meta: + model = Ticket + exclude = ('customer', ) + read_only_fields = ('status', 'admin', ) + + +class TicketListSerializer(serializers.ModelSerializer): admin = ProfileSerializer(read_only=True) class Meta: model = Ticket diff --git a/backend/ticket/urls.py b/backend/ticket/urls.py index 79730e1..7ad437e 100644 --- a/backend/ticket/urls.py +++ b/backend/ticket/urls.py @@ -11,6 +11,5 @@ urlpatterns = [ path('create', TicketCreateView.as_view(), name='ticket-create'), path('', TicketListView.as_view(), name='ticket-list'), path('', TicketDetailView.as_view(), name='ticket-detail'), - path('/messages', MessageCreateView.as_view(), name='message-create'), - path('/update-status', UpdateTicketStatusView.as_view(), name='update-ticket-status'), + path('message/', MessageCreateView.as_view(), name='message-create'), ] \ No newline at end of file diff --git a/backend/ticket/views.py b/backend/ticket/views.py index 4a5c0f3..5315656 100644 --- a/backend/ticket/views.py +++ b/backend/ticket/views.py @@ -2,7 +2,9 @@ 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 +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() @@ -12,16 +14,38 @@ class TicketCreateView(generics.CreateAPIView): def perform_create(self, serializer): serializer.save(customer=self.request.user) + -class TicketListView(generics.ListAPIView): - serializer_class = TicketSerializer +class TicketListView(APIView): + serializer_class = TicketListSerializer 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) + 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):