From a063b7c64f2d8772a22381497520c50e149ee5e7 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Tue, 28 Jan 2025 20:21:35 +0330 Subject: [PATCH] admin conf and import export product full url --- backend/account/admin.py | 27 +++++- backend/chat/admin.py | 22 ++++- backend/core/settings.py | 1 + backend/home/admin.py | 41 +++++++- backend/order/admin.py | 39 +++++++- backend/product/admin.py | 95 +++++++++++++++++-- backend/product/models.py | 9 ++ backend/product/views.py | 2 +- backend/ticket/admin.py | 48 +++++++++- .../migrations/0002_alter_ticket_status.py | 18 ++++ backend/ticket/models.py | 8 +- 11 files changed, 286 insertions(+), 24 deletions(-) create mode 100644 backend/ticket/migrations/0002_alter_ticket_status.py diff --git a/backend/account/admin.py b/backend/account/admin.py index 26e8d99..f9e56e8 100644 --- a/backend/account/admin.py +++ b/backend/account/admin.py @@ -2,8 +2,31 @@ from django.contrib import admin from .models import * from unfold.admin import ModelAdmin +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 @admin.register(User) -class UserAdmin(ModelAdmin): +class UserAdmin(ModelAdmin, ImportExportModelAdmin): + list_display = ['phone', 'email', 'is_superuser'] - readonly_fields = ['password', 'last_login', 'otp_expiry', 'otp_hash'] \ No newline at end of file + readonly_fields = ['phone'] + + exclude = ('otp_hash', 'otp_expiry', 'is_active', 'is_staff', 'password', 'last_login') + import_form_class = ImportForm + export_form_class = ExportForm + + + compressed_fields = True + warn_unsaved_form = True + + formfield_overrides = { + models.TextField: { + "widget": WysiwygWidget, + }, + ArrayField: { + "widget": ArrayWidget, + } + } + \ No newline at end of file diff --git a/backend/chat/admin.py b/backend/chat/admin.py index 63ad8f7..fa8ee7c 100644 --- a/backend/chat/admin.py +++ b/backend/chat/admin.py @@ -2,7 +2,25 @@ from django.contrib import admin from .models import * from unfold.admin import ModelAdmin +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 + @admin.register(ProductChatModel) -class ProductChatAdmin(ModelAdmin): - pass \ No newline at end of file +class ProductChatAdmin(ModelAdmin, ImportExportModelAdmin): + import_form_class = ImportForm + export_form_class = ExportForm + + compressed_fields = True + warn_unsaved_form = True + + formfield_overrides = { + models.TextField: { + "widget": WysiwygWidget, + }, + ArrayField: { + "widget": ArrayWidget, + } + } diff --git a/backend/core/settings.py b/backend/core/settings.py index 65a2e8d..7421780 100644 --- a/backend/core/settings.py +++ b/backend/core/settings.py @@ -103,6 +103,7 @@ INSTALLED_APPS = [ 'rest_framework_simplejwt', 'rest_framework_simplejwt.token_blacklist', 'rest_framework.authtoken', + 'import_export', # custom apps 'product', 'account', diff --git a/backend/home/admin.py b/backend/home/admin.py index 173a572..4d162df 100644 --- a/backend/home/admin.py +++ b/backend/home/admin.py @@ -2,11 +2,44 @@ from django.contrib import admin from .models import * from unfold.admin import ModelAdmin +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 + @admin.register(SliderModel) -class SliderAdmin(ModelAdmin): - pass +class SliderAdmin(ModelAdmin, ImportExportModelAdmin): + import_form_class = ImportForm + export_form_class = ExportForm + + + compressed_fields = False + warn_unsaved_form = True + + formfield_overrides = { + models.TextField: { + "widget": WysiwygWidget, + }, + ArrayField: { + "widget": ArrayWidget, + } + } @admin.register(HomeImageModel) -class HomeImageAdmin(ModelAdmin): - pass \ No newline at end of file +class HomeImageAdmin(ModelAdmin, ImportExportModelAdmin): + import_form_class = ImportForm + export_form_class = ExportForm + + + compressed_fields = True + warn_unsaved_form = True + + formfield_overrides = { + models.TextField: { + "widget": WysiwygWidget, + }, + ArrayField: { + "widget": ArrayWidget, + } + } \ No newline at end of file diff --git a/backend/order/admin.py b/backend/order/admin.py index 8c38f3f..90a6fb9 100644 --- a/backend/order/admin.py +++ b/backend/order/admin.py @@ -1,3 +1,40 @@ from django.contrib import admin +from .models import * +from unfold.admin import ModelAdmin, TabularInline -# Register your models here. +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 + + +class OrderItemModelInline(TabularInline): + model = OrderItemModel + extra = 0 + max_num = 0 + def has_delete_permission(self, request, obj=None): + return False + def get_readonly_fields(self, request, obj=None): + return [field.name for field in self.model._meta.fields] + + + + +@admin.register(OrderModel) +class OrderAdmin(ModelAdmin, ImportExportModelAdmin): + import_form_class = ImportForm + export_form_class = ExportForm + + + compressed_fields = True + warn_unsaved_form = True + + formfield_overrides = { + models.TextField: { + "widget": WysiwygWidget, + }, + ArrayField: { + "widget": ArrayWidget, + } + } + inlines = [OrderItemModelInline] \ No newline at end of file diff --git a/backend/product/admin.py b/backend/product/admin.py index b1f3efd..bddaa37 100644 --- a/backend/product/admin.py +++ b/backend/product/admin.py @@ -2,23 +2,100 @@ from django.contrib import admin from .models import * from unfold.admin import ModelAdmin +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 + @admin.register(ProductModel) -class ProductModelAdmin(ModelAdmin): - pass +class ProductModelAdmin(ModelAdmin, ImportExportModelAdmin): + import_form_class = ImportForm + export_form_class = ExportForm + + + compressed_fields = True + warn_unsaved_form = True + + formfield_overrides = { + models.TextField: { + "widget": WysiwygWidget, + }, + ArrayField: { + "widget": ArrayWidget, + } + } @admin.register(MainCategoryModel) -class MainCategoryModelAdmin(ModelAdmin): - pass +class MainCategoryModelAdmin(ModelAdmin, ImportExportModelAdmin): + import_form_class = ImportForm + export_form_class = ExportForm + + + compressed_fields = True + warn_unsaved_form = True + + formfield_overrides = { + models.TextField: { + "widget": WysiwygWidget, + }, + ArrayField: { + "widget": ArrayWidget, + } + } @admin.register(SubCategoryModel) -class SubCategoryModelAdmin(ModelAdmin): - pass +class SubCategoryModelAdmin(ModelAdmin, ImportExportModelAdmin): + import_form_class = ImportForm + export_form_class = ExportForm + + + compressed_fields = True + warn_unsaved_form = True + + formfield_overrides = { + models.TextField: { + "widget": WysiwygWidget, + }, + ArrayField: { + "widget": ArrayWidget, + } + } @admin.register(CommentModel) -class CommentAdmin(ModelAdmin): - pass +class CommentAdmin(ModelAdmin, ImportExportModelAdmin): + import_form_class = ImportForm + export_form_class = ExportForm + + + compressed_fields = True + warn_unsaved_form = True + + formfield_overrides = { + models.TextField: { + "widget": WysiwygWidget, + }, + ArrayField: { + "widget": ArrayWidget, + } + } @admin.register(DollorModel) -class DollorAdmin(ModelAdmin): +class DollorAdmin(ModelAdmin, ImportExportModelAdmin): + import_form_class = ImportForm + export_form_class = ExportForm + + exclude = ('unique_filed', ) + + compressed_fields = True + warn_unsaved_form = True + + formfield_overrides = { + models.TextField: { + "widget": WysiwygWidget, + }, + ArrayField: { + "widget": ArrayWidget, + } + } readonly_fields = ('price',) \ No newline at end of file diff --git a/backend/product/models.py b/backend/product/models.py index bca4739..c3f3110 100644 --- a/backend/product/models.py +++ b/backend/product/models.py @@ -24,11 +24,20 @@ class MainCategoryModel(models.Model): class SubCategoryModel(MainCategoryModel): + # name = models.CharField(max_length=50, verbose_name='نام') + # slug = models.SlugField(max_length=50, unique=True, help_text="اسم دسته را برای مسیر به انگلیسی و بدون فاصله وارد کنید") + # icon = models.ImageField(upload_to='category_model/',verbose_name='آیکون', blank=True, null=True) + # meta_title = models.CharField(max_length=60, verbose_name="عنوان متا", help_text="عنوان متا برای SEO", blank=True, null=True) + # meta_description = models.TextField(max_length=160, verbose_name="توضیحات متا", help_text="توضیحات متا برای SEO", blank=True, null=True) parent = models.ForeignKey(MainCategoryModel, on_delete=models.CASCADE, related_name='subcategorys', null=True, blank=True, verbose_name='دسته‌بندی والد') show = models.BooleanField(default=False, verbose_name='نمایش در خانه') + class Meta: verbose_name = "زیر دسته‌بندی" verbose_name_plural = "زیر دسته‌بندی‌ها" + + def __str__(self): + return self.name class DollorModel(models.Model): price = models.FloatField(null=True, blank=True, verbose_name='قیمت دلار') diff --git a/backend/product/views.py b/backend/product/views.py index 05ee93d..3538c5c 100644 --- a/backend/product/views.py +++ b/backend/product/views.py @@ -56,7 +56,7 @@ class ProductView(APIView): product = get_object_or_404(ProductModel, id=pk) dollor_object, _ = DollorModel.objects.get_or_create(unique_filed='unique') dollor_price = dollor_object.price - product_ser = self.serializer_class(instance=product, many=False, context={'dollor_price': dollor_price}) + product_ser = self.serializer_class(instance=product, many=False, context={'dollor_price': dollor_price, 'request': request}) return Response(product_ser.data, status=status.HTTP_200_OK) diff --git a/backend/ticket/admin.py b/backend/ticket/admin.py index 8c38f3f..1e67359 100644 --- a/backend/ticket/admin.py +++ b/backend/ticket/admin.py @@ -1,3 +1,49 @@ from django.contrib import admin +from .models import * +from unfold.admin import ModelAdmin, TabularInline -# Register your models here. +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 + +class MessageInline(TabularInline): + model = Message + extra = 1 + +@admin.register(Ticket) +class TicketAdmin(ModelAdmin, ImportExportModelAdmin): + import_form_class = ImportForm + export_form_class = ExportForm + + + compressed_fields = True + warn_unsaved_form = True + + formfield_overrides = { + models.TextField: { + "widget": WysiwygWidget, + }, + ArrayField: { + "widget": ArrayWidget, + } + } + inlines = [MessageInline] + +@admin.register(Message) +class MessageAdmin(ModelAdmin, ImportExportModelAdmin): + import_form_class = ImportForm + export_form_class = ExportForm + + + compressed_fields = True + warn_unsaved_form = True + + formfield_overrides = { + models.TextField: { + "widget": WysiwygWidget, + }, + ArrayField: { + "widget": ArrayWidget, + } + } \ No newline at end of file diff --git a/backend/ticket/migrations/0002_alter_ticket_status.py b/backend/ticket/migrations/0002_alter_ticket_status.py new file mode 100644 index 0000000..1549f36 --- /dev/null +++ b/backend/ticket/migrations/0002_alter_ticket_status.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.2 on 2025-01-28 16:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='ticket', + name='status', + field=models.CharField(choices=[('open', 'یاز'), ('in_progress', 'در حال پردازش'), ('resolved', 'حل شده'), ('closed', 'باز')], default='open', max_length=20), + ), + ] diff --git a/backend/ticket/models.py b/backend/ticket/models.py index 7bc0120..15b03da 100644 --- a/backend/ticket/models.py +++ b/backend/ticket/models.py @@ -3,10 +3,10 @@ from account.models import User class Ticket(models.Model): STATUS_CHOICES = [ - ('open', 'Open'), - ('in_progress', 'In Progress'), - ('resolved', 'Resolved'), - ('closed', 'Closed'), + ('open', 'یاز'), + ('in_progress', 'در حال پردازش'), + ('resolved', 'حل شده'), + ('closed', 'باز'), ] subject = models.CharField(max_length=255)