From 00b5ce5a6c3b87a6cd01f92e4b749b6db06d3b78 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Sat, 15 Feb 2025 00:04:51 +0330 Subject: [PATCH] ticket model and admin add ticket category --- backend/requirements.txt | 3 ++- backend/ticket/admin.py | 16 ++++++++++++---- .../migrations/0005_ticket_ticket_category.py | 19 +++++++++++++++++++ .../0006_alter_ticket_ticket_category.py | 18 ++++++++++++++++++ .../0007_alter_ticket_ticket_category.py | 18 ++++++++++++++++++ backend/ticket/models.py | 11 ++++++++++- 6 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 backend/ticket/migrations/0005_ticket_ticket_category.py create mode 100644 backend/ticket/migrations/0006_alter_ticket_ticket_category.py create mode 100644 backend/ticket/migrations/0007_alter_ticket_ticket_category.py diff --git a/backend/requirements.txt b/backend/requirements.txt index 37e397b..d8019ef 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -19,7 +19,8 @@ django-dbbackup==4.2.1 django-filter==24.3 django-import-export==4.1.1 django-iranian-cities==1.0.2 -django-unfold==0.46.0 +django-jalali==7.3.0 +django-unfold==0.48.0 djangorestframework==3.15.2 djangorestframework-simplejwt==5.3.1 djoser==2.3.1 diff --git a/backend/ticket/admin.py b/backend/ticket/admin.py index 21fd491..121c965 100644 --- a/backend/ticket/admin.py +++ b/backend/ticket/admin.py @@ -6,6 +6,13 @@ from import_export.admin import ImportExportModelAdmin from unfold.contrib.import_export.forms import ExportForm, ImportForm, SelectableFieldsExportForm from unfold.contrib.forms.widgets import ArrayWidget, WysiwygWidget from django.contrib.postgres.fields import ArrayField +from unfold.contrib.filters.admin import ( + ChoicesDropdownFilter, + MultipleChoicesDropdownFilter, +) + + + class MessageInline(TabularInline): model = Message @@ -16,9 +23,9 @@ class TicketAdmin(ModelAdmin, ImportExportModelAdmin): import_form_class = ImportForm export_form_class = ExportForm - search_fields = ['subject',] - list_filter = ['status'] - + search_fields = ['subject', 'messages__content'] + list_filter = [('status', ChoicesDropdownFilter), ('ticket_category', ChoicesDropdownFilter)] + list_filter_submit = True compressed_fields = True warn_unsaved_form = True @@ -27,7 +34,8 @@ class TicketAdmin(ModelAdmin, ImportExportModelAdmin): "widget": ArrayWidget, } } - list_display = ['subject', 'customer', 'admin', 'status', 'admin', 'status', 'created_at'] + readonly_fields = ('created_at', 'updated_at') + list_display = ['subject', 'ticket_category', 'customer', 'admin', 'status', 'created_at'] inlines = [MessageInline] radio_fields = {'status': admin.VERTICAL} diff --git a/backend/ticket/migrations/0005_ticket_ticket_category.py b/backend/ticket/migrations/0005_ticket_ticket_category.py new file mode 100644 index 0000000..9ab18fb --- /dev/null +++ b/backend/ticket/migrations/0005_ticket_ticket_category.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.2 on 2025-02-13 21:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0004_alter_message_content_alter_message_created_at_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='ticket', + name='ticket_category', + field=models.CharField(default='other', max_length=30, verbose_name='دسته بندی تیکت'), + preserve_default=False, + ), + ] diff --git a/backend/ticket/migrations/0006_alter_ticket_ticket_category.py b/backend/ticket/migrations/0006_alter_ticket_ticket_category.py new file mode 100644 index 0000000..21535ef --- /dev/null +++ b/backend/ticket/migrations/0006_alter_ticket_ticket_category.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.2 on 2025-02-13 21:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0005_ticket_ticket_category'), + ] + + operations = [ + migrations.AlterField( + model_name='ticket', + name='ticket_category', + field=models.CharField(choices=[('finance_and_accounting', 'مالی و حسابداری - Finance and Accounting'), ('user_profile', 'پروفایل کاربری - User Profile'), ('order_tracking', 'پیگیری سفارش - Order Tracking'), ('authentication', 'احراز هویت - Authentication'), ('product', 'محصول - Product'), ('bug_reporting', 'اعلام باگ و خطا در وبسایت - Bug and Error Reporting'), ('other', 'سایر - Other')], max_length=30, verbose_name='دسته بندی تیکت'), + ), + ] diff --git a/backend/ticket/migrations/0007_alter_ticket_ticket_category.py b/backend/ticket/migrations/0007_alter_ticket_ticket_category.py new file mode 100644 index 0000000..ab5d047 --- /dev/null +++ b/backend/ticket/migrations/0007_alter_ticket_ticket_category.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.2 on 2025-02-13 21:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0006_alter_ticket_ticket_category'), + ] + + operations = [ + migrations.AlterField( + model_name='ticket', + name='ticket_category', + field=models.CharField(choices=[('Finance and Accounting', 'مالی و حسابداری'), ('User Profile', 'پروفایل کاربری'), ('Order Tracking', 'پیگیری سفارش'), ('Authentication', 'احراز هویت'), ('Product', 'محصول'), ('Bug and Error Reporting', 'اعلام باگ و خطا در وبسایت'), ('Other', 'سایر')], max_length=30, verbose_name='دسته بندی تیکت'), + ), + ] diff --git a/backend/ticket/models.py b/backend/ticket/models.py index 75600c4..c6d7fcb 100644 --- a/backend/ticket/models.py +++ b/backend/ticket/models.py @@ -8,8 +8,17 @@ class Ticket(models.Model): ('resolved', 'حل شده'), ('closed', 'بسته'), ] - + CATEGORY_CHOICES = [ + ('finance_and_accounting', 'مالی و حسابداری'), + ('user_profile', 'پروفایل کاربری'), + ('order_tracking', 'پیگیری سفارش'), + ('authentication', 'احراز هویت'), + ('product', 'محصول'), + ('bug_and_error_reporting', 'اعلام باگ و خطا در وبسایت'), + ('other', 'سایر'), + ] subject = models.CharField(max_length=255, 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='ادمین') status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='open', verbose_name='وضعیت تیکت')