admin conf and import export

product full url
This commit is contained in:
Parsa Nazer
2025-01-28 20:21:35 +03:30
parent b3a0dd8610
commit a063b7c64f
11 changed files with 286 additions and 24 deletions
+25 -2
View File
@@ -2,8 +2,31 @@ from django.contrib import admin
from .models import * from .models import *
from unfold.admin import ModelAdmin 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) @admin.register(User)
class UserAdmin(ModelAdmin): class UserAdmin(ModelAdmin, ImportExportModelAdmin):
list_display = ['phone', 'email', 'is_superuser'] list_display = ['phone', 'email', 'is_superuser']
readonly_fields = ['password', 'last_login', 'otp_expiry', 'otp_hash'] 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,
}
}
+20 -2
View File
@@ -2,7 +2,25 @@ from django.contrib import admin
from .models import * from .models import *
from unfold.admin import ModelAdmin 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) @admin.register(ProductChatModel)
class ProductChatAdmin(ModelAdmin): class ProductChatAdmin(ModelAdmin, ImportExportModelAdmin):
pass import_form_class = ImportForm
export_form_class = ExportForm
compressed_fields = True
warn_unsaved_form = True
formfield_overrides = {
models.TextField: {
"widget": WysiwygWidget,
},
ArrayField: {
"widget": ArrayWidget,
}
}
+1
View File
@@ -103,6 +103,7 @@ INSTALLED_APPS = [
'rest_framework_simplejwt', 'rest_framework_simplejwt',
'rest_framework_simplejwt.token_blacklist', 'rest_framework_simplejwt.token_blacklist',
'rest_framework.authtoken', 'rest_framework.authtoken',
'import_export',
# custom apps # custom apps
'product', 'product',
'account', 'account',
+37 -4
View File
@@ -2,11 +2,44 @@ from django.contrib import admin
from .models import * from .models import *
from unfold.admin import ModelAdmin 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) @admin.register(SliderModel)
class SliderAdmin(ModelAdmin): class SliderAdmin(ModelAdmin, ImportExportModelAdmin):
pass 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) @admin.register(HomeImageModel)
class HomeImageAdmin(ModelAdmin): class HomeImageAdmin(ModelAdmin, ImportExportModelAdmin):
pass import_form_class = ImportForm
export_form_class = ExportForm
compressed_fields = True
warn_unsaved_form = True
formfield_overrides = {
models.TextField: {
"widget": WysiwygWidget,
},
ArrayField: {
"widget": ArrayWidget,
}
}
+38 -1
View File
@@ -1,3 +1,40 @@
from django.contrib import admin 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]
+86 -9
View File
@@ -2,23 +2,100 @@ from django.contrib import admin
from .models import * from .models import *
from unfold.admin import ModelAdmin 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) @admin.register(ProductModel)
class ProductModelAdmin(ModelAdmin): class ProductModelAdmin(ModelAdmin, ImportExportModelAdmin):
pass 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) @admin.register(MainCategoryModel)
class MainCategoryModelAdmin(ModelAdmin): class MainCategoryModelAdmin(ModelAdmin, ImportExportModelAdmin):
pass 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) @admin.register(SubCategoryModel)
class SubCategoryModelAdmin(ModelAdmin): class SubCategoryModelAdmin(ModelAdmin, ImportExportModelAdmin):
pass 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) @admin.register(CommentModel)
class CommentAdmin(ModelAdmin): class CommentAdmin(ModelAdmin, ImportExportModelAdmin):
pass 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) @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',) readonly_fields = ('price',)
+9
View File
@@ -24,12 +24,21 @@ class MainCategoryModel(models.Model):
class SubCategoryModel(MainCategoryModel): 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='دسته‌بندی والد') parent = models.ForeignKey(MainCategoryModel, on_delete=models.CASCADE, related_name='subcategorys', null=True, blank=True, verbose_name='دسته‌بندی والد')
show = models.BooleanField(default=False, verbose_name='نمایش در خانه') show = models.BooleanField(default=False, verbose_name='نمایش در خانه')
class Meta: class Meta:
verbose_name = "زیر دسته‌بندی" verbose_name = "زیر دسته‌بندی"
verbose_name_plural = "زیر دسته‌بندی‌ها" verbose_name_plural = "زیر دسته‌بندی‌ها"
def __str__(self):
return self.name
class DollorModel(models.Model): class DollorModel(models.Model):
price = models.FloatField(null=True, blank=True, verbose_name='قیمت دلار') price = models.FloatField(null=True, blank=True, verbose_name='قیمت دلار')
defualt_price = models.FloatField(null=True, blank=True, default=80000.0, verbose_name='قیمت دستی') defualt_price = models.FloatField(null=True, blank=True, default=80000.0, verbose_name='قیمت دستی')
+1 -1
View File
@@ -56,7 +56,7 @@ class ProductView(APIView):
product = get_object_or_404(ProductModel, id=pk) product = get_object_or_404(ProductModel, id=pk)
dollor_object, _ = DollorModel.objects.get_or_create(unique_filed='unique') dollor_object, _ = DollorModel.objects.get_or_create(unique_filed='unique')
dollor_price = dollor_object.price 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) return Response(product_ser.data, status=status.HTTP_200_OK)
+47 -1
View File
@@ -1,3 +1,49 @@
from django.contrib import admin 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,
}
}
@@ -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),
),
]
+4 -4
View File
@@ -3,10 +3,10 @@ from account.models import User
class Ticket(models.Model): class Ticket(models.Model):
STATUS_CHOICES = [ STATUS_CHOICES = [
('open', 'Open'), ('open', 'یاز'),
('in_progress', 'In Progress'), ('in_progress', 'در حال پردازش'),
('resolved', 'Resolved'), ('resolved', 'حل شده'),
('closed', 'Closed'), ('closed', 'باز'),
] ]
subject = models.CharField(max_length=255) subject = models.CharField(max_length=255)