diff --git a/backend/product/admin.py b/backend/product/admin.py index d38a2e3..5514d08 100644 --- a/backend/product/admin.py +++ b/backend/product/admin.py @@ -13,6 +13,7 @@ class ProductModelAdmin(ModelAdmin, ImportExportModelAdmin): import_form_class = ImportForm export_form_class = ExportForm + readonly_fields = ('slug', ) compressed_fields = True warn_unsaved_form = True @@ -31,6 +32,7 @@ class MainCategoryModelAdmin(ModelAdmin, ImportExportModelAdmin): import_form_class = ImportForm export_form_class = ExportForm + readonly_fields = ('slug', ) compressed_fields = True warn_unsaved_form = True @@ -46,6 +48,7 @@ class SubCategoryModelAdmin(ModelAdmin, ImportExportModelAdmin): import_form_class = ImportForm export_form_class = ExportForm + readonly_fields = ('slug', ) compressed_fields = True warn_unsaved_form = True diff --git a/backend/product/migrations/0002_rename_icon_subcategorymodel_image.py b/backend/product/migrations/0002_rename_icon_subcategorymodel_image.py new file mode 100644 index 0000000..4d143cb --- /dev/null +++ b/backend/product/migrations/0002_rename_icon_subcategorymodel_image.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.2 on 2025-01-28 17:48 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('product', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='subcategorymodel', + old_name='icon', + new_name='image', + ), + ] diff --git a/backend/product/migrations/0003_subcategorymodel_icon_alter_subcategorymodel_image.py b/backend/product/migrations/0003_subcategorymodel_icon_alter_subcategorymodel_image.py new file mode 100644 index 0000000..56fe281 --- /dev/null +++ b/backend/product/migrations/0003_subcategorymodel_icon_alter_subcategorymodel_image.py @@ -0,0 +1,23 @@ +# Generated by Django 5.1.2 on 2025-01-28 17:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('product', '0002_rename_icon_subcategorymodel_image'), + ] + + operations = [ + migrations.AddField( + model_name='subcategorymodel', + name='icon', + field=models.ImageField(blank=True, null=True, upload_to='category_model/', verbose_name='آیکون'), + ), + migrations.AlterField( + model_name='subcategorymodel', + name='image', + field=models.ImageField(blank=True, null=True, upload_to='category_model/', verbose_name='عکس'), + ), + ] diff --git a/backend/product/models.py b/backend/product/models.py index 6f66298..cabc85f 100644 --- a/backend/product/models.py +++ b/backend/product/models.py @@ -19,13 +19,16 @@ class MainCategoryModel(models.Model): def __str__(self): return self.name - # def get_absolute_url(self): - # return reverse('category_detail', kwargs={'slug': self.slug}) + def save(self, *args, **kwargs): + if not self.slug: + self.slug = slugify(self.name, allow_unicode=True) + super().save(*args, **kwargs) class SubCategoryModel(models.Model): name = models.CharField(max_length=50, verbose_name='نام') slug = models.SlugField(max_length=50, unique=True, help_text="اسم دسته را برای مسیر به انگلیسی و بدون فاصله وارد کنید") + image = models.ImageField(upload_to='category_model/',verbose_name='عکس', blank=True, null=True) 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) @@ -38,6 +41,10 @@ class SubCategoryModel(models.Model): def __str__(self): return self.name + def save(self, *args, **kwargs): + if not self.slug: + self.slug = slugify(self.name, allow_unicode=True) + super().save(*args, **kwargs) class DollorModel(models.Model): price = models.FloatField(null=True, blank=True, verbose_name='قیمت دلار') diff --git a/backend/product/serializers.py b/backend/product/serializers.py index c331bb7..2fde664 100644 --- a/backend/product/serializers.py +++ b/backend/product/serializers.py @@ -37,11 +37,14 @@ class CommentSerializer(serializers.ModelSerializer): class SubCategorySerializer(serializers.ModelSerializer): product_count = serializers.SerializerMethodField() + parent = serializers.SerializerMethodField() class Meta: model = SubCategoryModel - fields = ['id', 'name', 'slug','icon', 'meta_title', 'meta_description', 'product_count', 'show'] + fields = ['id', 'name', 'slug','icon', 'meta_title', 'meta_description', 'product_count', 'show', 'parent'] def get_product_count(self, obj): return obj.products.count() + def get_parent(self, obj): + return obj.parent.name class MainCategorySerializer(serializers.ModelSerializer): diff --git a/frontend/components/product/ChatBox/ChatButton.vue b/frontend/components/product/ChatBox/ChatButton.vue index dbdf9a3..22ab002 100644 --- a/frontend/components/product/ChatBox/ChatButton.vue +++ b/frontend/components/product/ChatBox/ChatButton.vue @@ -33,4 +33,4 @@ provide("isOpen", { - \ No newline at end of file +