From 8def6d126ac2b659537015d0e9bb65f21bd672c0 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Fri, 20 Feb 2026 18:40:32 +0330 Subject: [PATCH 1/7] filter categorys to show in home --- backend/home/views.py | 2 +- .../0071_maincategorymodel_show_in_home.py | 18 ++++++++++++++++++ backend/product/models.py | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 backend/product/migrations/0071_maincategorymodel_show_in_home.py diff --git a/backend/home/views.py b/backend/home/views.py index eeb8e40..3ce3f4f 100644 --- a/backend/home/views.py +++ b/backend/home/views.py @@ -24,7 +24,7 @@ class HomeView(APIView): sliders = SliderModel.objects.all() slider_ser = SliderSerializer(instance=sliders, many=True, context={'request': request}) - main_categories = MainCategoryModel.objects.all() + main_categories = MainCategoryModel.objects.filter(show_in_home=True) main_category_ser = MainCategorySerializer(instance=main_categories, many=True, context={'request': request}) products_to_show = ProductModel.objects.filter(show=True) diff --git a/backend/product/migrations/0071_maincategorymodel_show_in_home.py b/backend/product/migrations/0071_maincategorymodel_show_in_home.py new file mode 100644 index 0000000..12a5446 --- /dev/null +++ b/backend/product/migrations/0071_maincategorymodel_show_in_home.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.2 on 2026-02-20 15:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('product', '0070_enable_pg_trgm'), + ] + + operations = [ + migrations.AddField( + model_name='maincategorymodel', + name='show_in_home', + field=models.BooleanField(default=False, verbose_name='نمایش در خانه'), + ), + ] diff --git a/backend/product/models.py b/backend/product/models.py index 33fc412..cf95763 100644 --- a/backend/product/models.py +++ b/backend/product/models.py @@ -58,6 +58,7 @@ class MainCategoryModel(models.Model): blank=True, null=True, verbose_name='ویدیو') parent = models.ForeignKey(UnitCategoryModel, on_delete=models.SET_NULL, related_name='maincategorys', verbose_name='دسته‌بندی والد', null=True) + show_in_home = models.BooleanField(default=False, verbose_name='نمایش در خانه') class Meta: verbose_name = "دسته‌بندی اصلی" verbose_name_plural = "دسته‌بندی‌هااصلی" From 201a06ea8b7bb519845faee92f21bb91f89c49a7 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Fri, 20 Feb 2026 19:12:14 +0330 Subject: [PATCH 2/7] new sliders add for home page --- backend/home/views.py | 19 +++++- backend/product/admin.py | 17 ++---- ..._productmodel_product_show_idx_and_more.py | 58 +++++++++++++++++++ backend/product/models.py | 10 +++- 4 files changed, 86 insertions(+), 18 deletions(-) create mode 100644 backend/product/migrations/0072_remove_productmodel_product_show_idx_and_more.py diff --git a/backend/home/views.py b/backend/home/views.py index 3ce3f4f..99817bb 100644 --- a/backend/home/views.py +++ b/backend/home/views.py @@ -27,8 +27,17 @@ class HomeView(APIView): main_categories = MainCategoryModel.objects.filter(show_in_home=True) main_category_ser = MainCategorySerializer(instance=main_categories, many=True, context={'request': request}) - products_to_show = ProductModel.objects.filter(show=True) - product_ser = DynamicProductSerializer(instance=products_to_show, many=True, context={'request': request, 'view_type': 'list'}) + top_seller_products = ProductModel.objects.filter(show_in_top_seller=True) + top_seller_products_ser = DynamicProductSerializer(instance=top_seller_products, many=True, context={'request': request, 'view_type': 'list'}) + + lot_of_discount_products = ProductModel.objects.filter(show_in_lot_of_discount=True) + lot_of_discount_products_ser = DynamicProductSerializer(instance=lot_of_discount_products, many=True, context={'request': request, 'view_type': 'list'}) + + most_viewed_products = ProductModel.objects.filter(show_in_most_viewed=True) + most_viewed_products_ser = DynamicProductSerializer(instance=most_viewed_products, many=True, context={'request': request, 'view_type': 'list'}) + + trends_products = ProductModel.objects.filter(show_in_trends=True) + trends_products_ser = DynamicProductSerializer(instance=trends_products, many=True, context={'request': request, 'view_type': 'list'}) home_image = HomeImageModel.objects.all().first() home_image_ser = HomeImageSerializer(instance=home_image, context={'request': request}) @@ -39,7 +48,11 @@ class HomeView(APIView): response = { 'sliders': slider_ser.data, 'main_categories': main_category_ser.data, - 'products': product_ser.data, + 'products': [], + 'top_seller_products': top_seller_products_ser.data, + 'lot_of_discount_products': lot_of_discount_products_ser.data, + 'most_viewed_products': most_viewed_products_ser.data, + 'trends_products': trends_products_ser.data, 'difreance_section': home_image_ser.data, 'show_case_slider': show_cases_ser.data } diff --git a/backend/product/admin.py b/backend/product/admin.py index 94fab0b..1c3d2d7 100644 --- a/backend/product/admin.py +++ b/backend/product/admin.py @@ -295,16 +295,16 @@ class ProductModelAdmin(ProductAdminPermission, ModelAdmin, ImportExportModelAdm inlines = [ProductVariantInLine] readonly_fields = ('slug', 'created_at') search_fields = ['name', 'description', ] - list_filter = ['show', ('category', RelatedDropdownFilter), 'show_in_bot', ('category__parent', RelatedDropdownFilter)] + list_filter = [('category', RelatedDropdownFilter), 'show_in_bot', ('category__parent', RelatedDropdownFilter)] list_filter_submit = True autocomplete_fields = ['related_products', 'shop', 'category'] # compressed_fields = True warn_unsaved_form = True # list_per_page = 2 actions_list = ['redirect_to_learn', 'update_products_price'] - list_display = ['display_image', 'shop__shop_name','display_price', 'view', 'show', 'rating', 'category', 'created_at'] + list_display = ['display_image', 'shop__shop_name','display_price', 'view', 'rating', 'category', 'created_at'] fieldsets = ( - ('فیلد های اصلی', {'fields': ('name', 'description', 'category', 'image', 'related_products', 'show', 'shop', 'show_in_bot', 'bot_banner'), "classes": ["tab"],}), + ('فیلد های اصلی', {'fields': ('name', 'description', 'category', 'image', 'related_products','show_in_trends', 'show_in_most_viewed', 'show_in_lot_of_discount', 'show_in_top_seller', 'shop', 'show_in_bot', 'bot_banner'), "classes": ["tab"],}), ('فیلد های سيو', {'fields': ('meta_description', 'meta_keywords', 'meta_rating', 'slug'), "classes": ["tab"],}), ('فیلد های مربوط به کاربر', {'fields': ('rating', 'view',), "classes": ["tab"],}), # ('فیلد های ایتم های پک', {'fields': ('in_pack_items', ), "classes": ["tab"],}) @@ -324,7 +324,7 @@ class ProductModelAdmin(ProductAdminPermission, ModelAdmin, ImportExportModelAdm if request.user.is_superuser: return ['slug', 'created_at'] else: - return ['show_in_bot', 'bot_banner', 'created_at', 'show', 'meta_description', 'meta_keywords', 'meta_rating', 'rating', 'view', 'slug'] + return ['show_in_bot', 'bot_banner', 'created_at', 'show_in_top_seller','show_in_trends', 'show_in_most_viewed', 'show_in_lot_of_discount','meta_description', 'meta_keywords', 'meta_rating', 'rating', 'view', 'slug'] def display_price(self, obj): if obj.variants.all().first(): @@ -398,15 +398,6 @@ class ProductModelAdmin(ProductAdminPermission, ModelAdmin, ImportExportModelAdm actions = ['bulk_update_subcategory_action'] - # @display( - # description=("نمایش در صفحه ی اصلی"), - # label={ - # True: "danger", - # False: "success", - # }, - # ) - # def display_show(self, instance): - # return instance.show @admin.register(MainCategoryModel) diff --git a/backend/product/migrations/0072_remove_productmodel_product_show_idx_and_more.py b/backend/product/migrations/0072_remove_productmodel_product_show_idx_and_more.py new file mode 100644 index 0000000..60d91fb --- /dev/null +++ b/backend/product/migrations/0072_remove_productmodel_product_show_idx_and_more.py @@ -0,0 +1,58 @@ +# Generated by Django 5.1.2 on 2026-02-20 15:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0034_add_telegram_chat_id_to_shop'), + ('product', '0071_maincategorymodel_show_in_home'), + ] + + operations = [ + migrations.RemoveIndex( + model_name='productmodel', + name='product_show_idx', + ), + migrations.RemoveField( + model_name='productmodel', + name='show', + ), + migrations.AddField( + model_name='productmodel', + name='show_in_lot_of_discount', + field=models.BooleanField(default=False, verbose_name='نمایش در پر تخفیف ها'), + ), + migrations.AddField( + model_name='productmodel', + name='show_in_most_viewed', + field=models.BooleanField(default=False, verbose_name='نمایش در پر بازدید ها'), + ), + migrations.AddField( + model_name='productmodel', + name='show_in_top_seller', + field=models.BooleanField(default=False, verbose_name='نمایش در پر فروش ها'), + ), + migrations.AddField( + model_name='productmodel', + name='show_in_trends', + field=models.BooleanField(default=False, verbose_name='نمایش در ترند ها'), + ), + migrations.AddIndex( + model_name='productmodel', + index=models.Index(fields=['show_in_trends'], name='product_show_in_trends_idx'), + ), + migrations.AddIndex( + model_name='productmodel', + index=models.Index(fields=['show_in_most_viewed'], name='product_most_viewed_idx'), + ), + migrations.AddIndex( + model_name='productmodel', + index=models.Index(fields=['show_in_lot_of_discount'], name='product_lot_of_discount_idx'), + ), + migrations.AddIndex( + model_name='productmodel', + index=models.Index(fields=['show_in_top_seller'], name='product_show_in_top_seller_idx'), + ), + ] diff --git a/backend/product/models.py b/backend/product/models.py index cf95763..1492992 100644 --- a/backend/product/models.py +++ b/backend/product/models.py @@ -181,7 +181,10 @@ class ProductModel(models.Model): description = models.TextField(verbose_name='توضیحات') image = models.ImageField(upload_to='product_main/', null=True, blank=True) rating = models.PositiveIntegerField(default=0, verbose_name='امتیاز') - show = models.BooleanField(default=False, verbose_name='نمایش در خانه') + show_in_trends = models.BooleanField(default=False, verbose_name='نمایش در ترند ها') + show_in_most_viewed = models.BooleanField(default=False, verbose_name='نمایش در پر بازدید ها') + show_in_lot_of_discount = models.BooleanField(default=False, verbose_name='نمایش در پر تخفیف ها') + show_in_top_seller = models.BooleanField(default=False, verbose_name='نمایش در پر فروش ها') view = models.IntegerField(default=0, verbose_name='بازدید') slug = models.SlugField(max_length=255, unique=True, blank=True, null=True, allow_unicode=True, verbose_name='نام یکتا', help_text="این فیلد را خالی بگذارید") @@ -224,7 +227,10 @@ class ProductModel(models.Model): models.Index(fields=['category'], name='product_category_idx'), models.Index(fields=['name'], name='product_name_idx'), models.Index(fields=['created_at'], name='product_created_at_idx'), - models.Index(fields=['show'], name='product_show_idx'), + models.Index(fields=['show_in_trends'], name='product_show_in_trends_idx'), + models.Index(fields=['show_in_most_viewed'], name='product_most_viewed_idx'), + models.Index(fields=['show_in_lot_of_discount'], name='product_lot_of_discount_idx'), + models.Index(fields=['show_in_top_seller'], name='product_show_in_top_seller_idx'), models.Index(fields=['category', 'created_at'], name='product_category_created_idx'), models.Index(fields=['category', 'name'], From 1344b39e5629f9e0cdaad5b5b2fea996208f5caa Mon Sep 17 00:00:00 2001 From: Mamalizz-dev Date: Sat, 21 Feb 2026 02:24:31 +0330 Subject: [PATCH 3/7] fixed gender input bug in dashboard --- frontend/components/global/product/ProductCard.vue | 8 ++++++-- frontend/pages/profile/index.vue | 7 ++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/frontend/components/global/product/ProductCard.vue b/frontend/components/global/product/ProductCard.vue index b77c6ca..2d87e89 100644 --- a/frontend/components/global/product/ProductCard.vue +++ b/frontend/components/global/product/ProductCard.vue @@ -108,7 +108,7 @@ const parallaxStyle = computed(() => {
- + {{ title }}
@@ -118,7 +118,11 @@ const parallaxStyle = computed(() => { > {{ price }} - {{ priceAfter }} + {{ priceAfter }}
diff --git a/frontend/pages/profile/index.vue b/frontend/pages/profile/index.vue index 80b4b8b..4ac2035 100644 --- a/frontend/pages/profile/index.vue +++ b/frontend/pages/profile/index.vue @@ -33,7 +33,7 @@ const personalData = ref({ first_name: account.value?.first_name ?? "", last_name: account.value?.last_name ?? "", phone: account.value?.phone ?? "", - gender: account.value?.gender ?? undefined, + gender: account.value?.gender || undefined, email: account.value?.email ?? "", birth_date: account.value?.birth_date ?? "", }); @@ -64,7 +64,7 @@ const formRules = computed(() => { required: helpers.withMessage("فیلد شماره تلفن الزامی می باشد", required), phoneValidator: helpers.withMessage( "شماره تلفن وارد شده معتبر نمی باشد", - helpers.regex(/^0?[1-9][0-9]{9}$/) + helpers.regex(/^0?[1-9][0-9]{9}$/), ), }, }; @@ -99,7 +99,7 @@ const updateData = () => { }, }); }, - } + }, ); }; @@ -243,6 +243,7 @@ const handleSubmit = (withValidation: boolean) => { From c5d0d1b1cb8b1209f7f804a579fce2e5d8dc56ef Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Sun, 22 Feb 2026 01:07:57 +0330 Subject: [PATCH 4/7] Update categories slider slides count problem --- .../global/product-detail/ProductsSlider.vue | 8 ++++---- frontend/components/home/Categories.vue | 8 +++++++- frontend/pages/index.vue | 10 +++++----- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/frontend/components/global/product-detail/ProductsSlider.vue b/frontend/components/global/product-detail/ProductsSlider.vue index d2593c2..401149f 100644 --- a/frontend/components/global/product-detail/ProductsSlider.vue +++ b/frontend/components/global/product-detail/ProductsSlider.vue @@ -27,12 +27,12 @@ const onSwiper = (swiper: SwiperClass) => {