From 83960c7bd48709729a010d6e6c1308ce8458e9f7 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Fri, 28 Feb 2025 18:57:53 +0330 Subject: [PATCH 1/9] status display and new status for ticket error --- .../migrations/0016_alter_ticket_status.py | 18 ++++++++++++++++++ backend/ticket/models.py | 2 +- backend/ticket/serializers.py | 9 +++++++-- backend/ticket/views.py | 4 +--- 4 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 backend/ticket/migrations/0016_alter_ticket_status.py diff --git a/backend/ticket/migrations/0016_alter_ticket_status.py b/backend/ticket/migrations/0016_alter_ticket_status.py new file mode 100644 index 0000000..1890399 --- /dev/null +++ b/backend/ticket/migrations/0016_alter_ticket_status.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.2 on 2025-02-28 15:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0015_remove_ticket_attachments_remove_ticket_content'), + ] + + operations = [ + migrations.AlterField( + model_name='ticket', + name='status', + field=models.CharField(choices=[('in_progress', 'در حال پردازش'), ('resolved', 'حل شده'), ('closed', 'بسته')], default='in_progress', max_length=20, verbose_name='وضعیت تیکت'), + ), + ] diff --git a/backend/ticket/models.py b/backend/ticket/models.py index 6a40c05..7d92380 100644 --- a/backend/ticket/models.py +++ b/backend/ticket/models.py @@ -40,7 +40,7 @@ class Ticket(models.Model): 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='ادمین') - status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='open', verbose_name='وضعیت تیکت') + status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='in_progress', verbose_name='وضعیت تیکت') created_at = jmodels.jDateTimeField(auto_now_add=True, verbose_name='ساخته شده در') updated_at = jmodels.jDateTimeField(auto_now=True, verbose_name='اپدیت شده در') order = models.ForeignKey(OrderModel ,blank=True, null=True, on_delete=models.SET_NULL) diff --git a/backend/ticket/serializers.py b/backend/ticket/serializers.py index ba2cc9c..d28077c 100644 --- a/backend/ticket/serializers.py +++ b/backend/ticket/serializers.py @@ -29,6 +29,7 @@ class MessageForTicketSerializer(serializers.ModelSerializer): model = Message exclude = ('sender', 'ticket') class TicketSerializer(serializers.ModelSerializer): + status = serializers.SerializerMethodField() messages = MessageSerializer(many=True, read_only=True) message = MessageForTicketSerializer(write_only=True) class Meta: @@ -39,7 +40,7 @@ class TicketSerializer(serializers.ModelSerializer): def create(self, validated_data): message = validated_data.pop('message', None) ticket = super().create(validated_data) - print(f'fck this shit{ticket.pk}') + print(f'fck this shit id {ticket.pk}') message['ticket'] = ticket.pk message_obj = MessageSerializer(data=message) if message_obj.is_valid(): @@ -47,11 +48,15 @@ class TicketSerializer(serializers.ModelSerializer): return ticket else: raise Exception('bullshit data for message') + def get_status(self, obj): + return obj.get_status_display() class TicketListSerializer(serializers.ModelSerializer): + status = serializers.SerializerMethodField() class Meta: model = Ticket exclude = ('customer', 'admin', ) read_only_fields = ('status',) - + def get_status(self, obj): + return obj.get_status_display() diff --git a/backend/ticket/views.py b/backend/ticket/views.py index 556d6b8..50f80b4 100644 --- a/backend/ticket/views.py +++ b/backend/ticket/views.py @@ -57,13 +57,11 @@ class TicketCreateView(APIView): def post(self, request): new_ticket_ser = self.serializer_class(data=request.data) message = request.data.get('message', None) - print(message) if new_ticket_ser.is_valid(): new_ticket_ser.save(customer=request.user) return Response(new_ticket_ser.data, status=status.HTTP_201_CREATED) else: - print(new_ticket_ser.error_messages) - return Response(new_ticket_ser.errors) + return Response(new_ticket_ser.errors, status=status.HTTP_400_BAD_REQUEST) class TicketListView(APIView): serializer_class = TicketListSerializer permission_classes = [permissions.IsAuthenticated] From bdb0d9a3b2106dc6ef5c650ef94f96fd79719df4 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Fri, 28 Feb 2025 19:03:39 +0330 Subject: [PATCH 2/9] ticket category display --- backend/ticket/serializers.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backend/ticket/serializers.py b/backend/ticket/serializers.py index d28077c..7a82e83 100644 --- a/backend/ticket/serializers.py +++ b/backend/ticket/serializers.py @@ -30,6 +30,7 @@ class MessageForTicketSerializer(serializers.ModelSerializer): exclude = ('sender', 'ticket') class TicketSerializer(serializers.ModelSerializer): status = serializers.SerializerMethodField() + ticket_category = serializers.SerializerMethodField() messages = MessageSerializer(many=True, read_only=True) message = MessageForTicketSerializer(write_only=True) class Meta: @@ -51,8 +52,12 @@ class TicketSerializer(serializers.ModelSerializer): def get_status(self, obj): return obj.get_status_display() + def get_ticket_category(self, obj): + return obj.get_ticket_category_display() + class TicketListSerializer(serializers.ModelSerializer): status = serializers.SerializerMethodField() + ticket_category = serializers.SerializerMethodField() class Meta: model = Ticket exclude = ('customer', 'admin', ) @@ -60,3 +65,5 @@ class TicketListSerializer(serializers.ModelSerializer): def get_status(self, obj): return obj.get_status_display() + def get_ticket_category(self, obj): + return obj.get_ticket_category_display() \ No newline at end of file From d5ce25d85c271336d97123a1a06d0e6868d7bab5 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Fri, 28 Feb 2025 19:36:52 +0330 Subject: [PATCH 3/9] is user field for message --- backend/ticket/serializers.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backend/ticket/serializers.py b/backend/ticket/serializers.py index 7a82e83..813506e 100644 --- a/backend/ticket/serializers.py +++ b/backend/ticket/serializers.py @@ -19,10 +19,14 @@ class AttachmentSerializer(serializers.ModelSerializer): return obj.file.url class MessageSerializer(serializers.ModelSerializer): + is_user = serializers.SerializerMethodField(read_only=True) class Meta: model = Message exclude = ('sender', ) extra_kwargs = {'ticket': {'write_only': True}} + def get_is_user(self, obj): + user = self.context['request'].user + return user == obj.sender class MessageForTicketSerializer(serializers.ModelSerializer): class Meta: From e7ae5505f7fc56afe6ec4e42cd4b2d625bc1a302 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Fri, 28 Feb 2025 19:43:45 +0330 Subject: [PATCH 4/9] new names for status --- .../migrations/0017_alter_ticket_status.py | 18 ++++++++++++++++++ backend/ticket/models.py | 6 +++--- 2 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 backend/ticket/migrations/0017_alter_ticket_status.py diff --git a/backend/ticket/migrations/0017_alter_ticket_status.py b/backend/ticket/migrations/0017_alter_ticket_status.py new file mode 100644 index 0000000..71e1ade --- /dev/null +++ b/backend/ticket/migrations/0017_alter_ticket_status.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.2 on 2025-02-28 16:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0016_alter_ticket_status'), + ] + + operations = [ + migrations.AlterField( + model_name='ticket', + name='status', + field=models.CharField(choices=[('in_progress', 'در انتظار پاسخ'), ('resolved', 'پاسخ داده شده'), ('closed', 'بسته شده')], default='in_progress', max_length=20, verbose_name='وضعیت تیکت'), + ), + ] diff --git a/backend/ticket/models.py b/backend/ticket/models.py index 7d92380..965d7e6 100644 --- a/backend/ticket/models.py +++ b/backend/ticket/models.py @@ -23,9 +23,9 @@ class Attachment(models.Model): class Ticket(models.Model): objects = jmodels.jManager() STATUS_CHOICES = [ - ('in_progress', 'در حال پردازش'), - ('resolved', 'حل شده'), - ('closed', 'بسته'), + ('in_progress', 'در انتظار پاسخ'), + ('resolved', 'پاسخ داده شده'), + ('closed', 'بسته شده'), ] CATEGORY_CHOICES = [ ('finance_and_accounting', 'مالی و حسابداری'), From abe907ee4e8c9925c69b867d310ad47d421f3fd8 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Fri, 28 Feb 2025 20:38:22 +0330 Subject: [PATCH 5/9] debug ticket ser --- backend/ticket/serializers.py | 2 +- backend/ticket/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/ticket/serializers.py b/backend/ticket/serializers.py index 813506e..812913f 100644 --- a/backend/ticket/serializers.py +++ b/backend/ticket/serializers.py @@ -52,7 +52,7 @@ class TicketSerializer(serializers.ModelSerializer): message_obj.save(sender=ticket.customer) return ticket else: - raise Exception('bullshit data for message') + raise Exception(message_obj.errors) def get_status(self, obj): return obj.get_status_display() diff --git a/backend/ticket/views.py b/backend/ticket/views.py index 50f80b4..ac6fdae 100644 --- a/backend/ticket/views.py +++ b/backend/ticket/views.py @@ -55,7 +55,7 @@ class TicketCreateView(APIView): serializer_class = TicketSerializer permission_classes = [permissions.IsAuthenticated] def post(self, request): - new_ticket_ser = self.serializer_class(data=request.data) + new_ticket_ser = self.serializer_class(data=request.data, context={'request': request}) message = request.data.get('message', None) if new_ticket_ser.is_valid(): new_ticket_ser.save(customer=request.user) From 21bd4a2134645e61f55216507d44f97633d9c0b0 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Fri, 28 Feb 2025 21:54:00 +0330 Subject: [PATCH 6/9] update ticket serializer --- backend/ticket/serializers.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/backend/ticket/serializers.py b/backend/ticket/serializers.py index 812913f..63f07d2 100644 --- a/backend/ticket/serializers.py +++ b/backend/ticket/serializers.py @@ -2,6 +2,8 @@ from rest_framework import serializers from .models import Ticket, Message, Attachment from django.utils.timezone import localtime from account.serializers import ProfileSerializer +from order.serializers import OrderSerializer +from order.serializers import OrderModel class AttachmentSerializer(serializers.ModelSerializer): file = serializers.FileField(write_only=True) @@ -20,6 +22,7 @@ class AttachmentSerializer(serializers.ModelSerializer): class MessageSerializer(serializers.ModelSerializer): is_user = serializers.SerializerMethodField(read_only=True) + attachments = AttachmentSerializer(many=True) class Meta: model = Message exclude = ('sender', ) @@ -37,6 +40,8 @@ class TicketSerializer(serializers.ModelSerializer): ticket_category = serializers.SerializerMethodField() messages = MessageSerializer(many=True, read_only=True) message = MessageForTicketSerializer(write_only=True) + order_id = serializers.PrimaryKeyRelatedField(queryset=OrderModel.objects.all(), write_only=True, source='order') + order = OrderSerializer(read_only=True) class Meta: model = Ticket exclude = ('customer', 'admin') @@ -44,15 +49,18 @@ class TicketSerializer(serializers.ModelSerializer): def create(self, validated_data): message = validated_data.pop('message', None) - ticket = super().create(validated_data) - print(f'fck this shit id {ticket.pk}') - message['ticket'] = ticket.pk - message_obj = MessageSerializer(data=message) - if message_obj.is_valid(): - message_obj.save(sender=ticket.customer) - return ticket - else: - raise Exception(message_obj.errors) + ticket = super().create(validated_data) + if message: + message['ticket'] = ticket.pk + if 'attachments' in message: + message['attachments'] = [attachment.pk for attachment in message['attachments']] + message_obj = MessageSerializer(data=message) + if message_obj.is_valid(): + message_obj.save(sender=ticket.customer) + else: + raise Exception(f'error in create failed: {message_obj.errors}') + return ticket + def get_status(self, obj): return obj.get_status_display() @@ -62,6 +70,7 @@ class TicketSerializer(serializers.ModelSerializer): class TicketListSerializer(serializers.ModelSerializer): status = serializers.SerializerMethodField() ticket_category = serializers.SerializerMethodField() + order = OrderSerializer() class Meta: model = Ticket exclude = ('customer', 'admin', ) From db4fc164fc75d3fae7f0e77f678a908f9a48aa3a Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Fri, 28 Feb 2025 22:00:04 +0330 Subject: [PATCH 7/9] debug ticket --- backend/ticket/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/ticket/serializers.py b/backend/ticket/serializers.py index 63f07d2..4f6f91d 100644 --- a/backend/ticket/serializers.py +++ b/backend/ticket/serializers.py @@ -22,7 +22,7 @@ class AttachmentSerializer(serializers.ModelSerializer): class MessageSerializer(serializers.ModelSerializer): is_user = serializers.SerializerMethodField(read_only=True) - attachments = AttachmentSerializer(many=True) + attachments = AttachmentSerializer(many=True, read_only=True) class Meta: model = Message exclude = ('sender', ) From 308b63ba711ba54ddda04194812aba3b6e5872c3 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Fri, 28 Feb 2025 22:44:27 +0330 Subject: [PATCH 8/9] update serilaizer of ticket and message --- backend/ticket/serializers.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/backend/ticket/serializers.py b/backend/ticket/serializers.py index 4f6f91d..7dc19d4 100644 --- a/backend/ticket/serializers.py +++ b/backend/ticket/serializers.py @@ -21,6 +21,16 @@ class AttachmentSerializer(serializers.ModelSerializer): return obj.file.url class MessageSerializer(serializers.ModelSerializer): + is_user = serializers.SerializerMethodField(read_only=True) + class Meta: + model = Message + exclude = ('sender', ) + extra_kwargs = {'ticket': {'write_only': True}} + def get_is_user(self, obj): + user = self.context['request'].user + return user == obj.sender + +class MessageAttachmentSerializer(serializers.ModelSerializer): is_user = serializers.SerializerMethodField(read_only=True) attachments = AttachmentSerializer(many=True, read_only=True) class Meta: @@ -38,7 +48,7 @@ class MessageForTicketSerializer(serializers.ModelSerializer): class TicketSerializer(serializers.ModelSerializer): status = serializers.SerializerMethodField() ticket_category = serializers.SerializerMethodField() - messages = MessageSerializer(many=True, read_only=True) + messages = MessageAttachmentSerializer(many=True, read_only=True) message = MessageForTicketSerializer(write_only=True) order_id = serializers.PrimaryKeyRelatedField(queryset=OrderModel.objects.all(), write_only=True, source='order') order = OrderSerializer(read_only=True) From 582dfb13f9cefc66f9f8dbd83fe9cf9f2fcf635c Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Fri, 28 Feb 2025 22:50:19 +0330 Subject: [PATCH 9/9] english date --- ...cket_created_at_alter_ticket_updated_at.py | 23 +++++++++++++++++++ backend/ticket/models.py | 8 ++++--- 2 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 backend/ticket/migrations/0018_alter_ticket_created_at_alter_ticket_updated_at.py diff --git a/backend/ticket/migrations/0018_alter_ticket_created_at_alter_ticket_updated_at.py b/backend/ticket/migrations/0018_alter_ticket_created_at_alter_ticket_updated_at.py new file mode 100644 index 0000000..b5d35f1 --- /dev/null +++ b/backend/ticket/migrations/0018_alter_ticket_created_at_alter_ticket_updated_at.py @@ -0,0 +1,23 @@ +# Generated by Django 5.1.2 on 2025-02-28 19:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0017_alter_ticket_status'), + ] + + operations = [ + migrations.AlterField( + model_name='ticket', + name='created_at', + field=models.DateTimeField(auto_now_add=True, verbose_name='ساخته شده در'), + ), + migrations.AlterField( + model_name='ticket', + name='updated_at', + field=models.DateTimeField(auto_now=True, verbose_name='اپدیت شده در'), + ), + ] diff --git a/backend/ticket/models.py b/backend/ticket/models.py index 965d7e6..76933b7 100644 --- a/backend/ticket/models.py +++ b/backend/ticket/models.py @@ -21,7 +21,7 @@ class Attachment(models.Model): super(Attachment, self).save(*args, **kwargs) class Ticket(models.Model): - objects = jmodels.jManager() + # objects = jmodels.jManager() STATUS_CHOICES = [ ('in_progress', 'در انتظار پاسخ'), ('resolved', 'پاسخ داده شده'), @@ -41,8 +41,10 @@ class Ticket(models.Model): 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='ادمین') status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='in_progress', verbose_name='وضعیت تیکت') - created_at = jmodels.jDateTimeField(auto_now_add=True, verbose_name='ساخته شده در') - updated_at = jmodels.jDateTimeField(auto_now=True, verbose_name='اپدیت شده در') + # created_at = jmodels.jDateTimeField(auto_now_add=True, verbose_name='ساخته شده در') + # updated_at = jmodels.jDateTimeField(auto_now=True, verbose_name='اپدیت شده در') + created_at = models.DateTimeField(auto_now_add=True, verbose_name='ساخته شده در') + updated_at = models.DateTimeField(auto_now=True, verbose_name='اپدیت شده در') order = models.ForeignKey(OrderModel ,blank=True, null=True, on_delete=models.SET_NULL) def __str__(self):