From e507fd95a5ac5a05741f1bde7425b73f3418a5ea Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Mon, 27 Jan 2025 21:11:26 +0330 Subject: [PATCH] home app and home view and some verbose name --- backend/core/settings.py | 6 ++++++ backend/core/urls.py | 4 ++-- backend/home/__init__.py | 0 backend/home/admin.py | 8 ++++++++ backend/home/apps.py | 6 ++++++ backend/home/models.py | 18 ++++++++++++++++++ backend/home/serializers.py | 11 +++++++++++ backend/home/tests.py | 3 +++ backend/home/views.py | 31 +++++++++++++++++++++++++++++++ backend/product/models.py | 26 ++++++++++++++------------ backend/product/serializers.py | 2 +- 11 files changed, 100 insertions(+), 15 deletions(-) create mode 100644 backend/home/__init__.py create mode 100644 backend/home/admin.py create mode 100644 backend/home/apps.py create mode 100644 backend/home/models.py create mode 100644 backend/home/serializers.py create mode 100644 backend/home/tests.py create mode 100644 backend/home/views.py diff --git a/backend/core/settings.py b/backend/core/settings.py index 6dc2fd1..65a2e8d 100644 --- a/backend/core/settings.py +++ b/backend/core/settings.py @@ -109,6 +109,7 @@ INSTALLED_APPS = [ 'ticket', 'chat', 'order', + 'home', ] MIDDLEWARE = [ @@ -279,6 +280,11 @@ UNFOLD = { "icon": "dashboard", "link": reverse_lazy("admin:index"), }, + { + "title": _("اسلایدر"), + "icon": "home", + "link": reverse_lazy("admin:home_slidermodel_changelist"), + }, ], }, diff --git a/backend/core/urls.py b/backend/core/urls.py index 2286b6f..c2470c3 100644 --- a/backend/core/urls.py +++ b/backend/core/urls.py @@ -6,7 +6,7 @@ from django.conf import settings from rest_framework_simplejwt.views import TokenObtainPairView,TokenRefreshView from product import views from account.views import CustomTokenObtainPairView - +from home.views import HomeView urlpatterns = [ @@ -14,7 +14,7 @@ urlpatterns = [ # path('auth/', include('djoser.urls')), # path('auth/', include('djoser.urls.jwt')), - + path('home', HomeView.as_view()), path('token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'), path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), path('admin/', admin.site.urls), diff --git a/backend/home/__init__.py b/backend/home/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/home/admin.py b/backend/home/admin.py new file mode 100644 index 0000000..0a97d0c --- /dev/null +++ b/backend/home/admin.py @@ -0,0 +1,8 @@ +from django.contrib import admin +from .models import * +from unfold.admin import ModelAdmin + + +@admin.register(SliderModel) +class SliderAdmin(ModelAdmin): + pass \ No newline at end of file diff --git a/backend/home/apps.py b/backend/home/apps.py new file mode 100644 index 0000000..e5ea0af --- /dev/null +++ b/backend/home/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class HomeConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'home' diff --git a/backend/home/models.py b/backend/home/models.py new file mode 100644 index 0000000..f2819a6 --- /dev/null +++ b/backend/home/models.py @@ -0,0 +1,18 @@ +from django.db import models +from product.models import ProductModel + + +class SliderModel(models.Model): + product = models.ForeignKey(ProductModel, on_delete=models.CASCADE, verbose_name='محصول') + title = models.CharField(max_length=50, verbose_name='عنوان') + image = models.ImageField(upload_to='slider_image/', blank=True, null=True, verbose_name='عکس اسلایدر') + video = models.FileField(upload_to='slider_video/', blank=True, null=True, verbose_name='ویدیواسلایدر') + + def __str__(self): + return self.title + + class Meta: + verbose_name = 'اسلایدر' + verbose_name_plural = 'اسلایدر ها' + + diff --git a/backend/home/serializers.py b/backend/home/serializers.py new file mode 100644 index 0000000..d0d97d8 --- /dev/null +++ b/backend/home/serializers.py @@ -0,0 +1,11 @@ +from .models import * +from rest_framework import serializers +from django.utils import timezone +from datetime import timedelta + + + +class SliderSerializer(serializers.ModelSerializer): + class Meta: + model = SliderModel + fields = "__all__" \ No newline at end of file diff --git a/backend/home/tests.py b/backend/home/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/backend/home/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/home/views.py b/backend/home/views.py new file mode 100644 index 0000000..29a9240 --- /dev/null +++ b/backend/home/views.py @@ -0,0 +1,31 @@ +from django.shortcuts import render +from rest_framework.views import APIView, Response +from product.models import ProductModel, SubCategoryModel, DollorModel +from product.serializers import SubCategorySerializer, ProductSerializer +from .serializers import SliderSerializer +from .models import SliderModel +from rest_framework import status + + +class HomeView(APIView): + def get(self, request): + + dollor_object, _ = DollorModel.objects.get_or_create(unique_filed='unique') + dollor_price = dollor_object.price + + sliders = SliderModel.objects.all() + slider_ser = SliderSerializer(instance=sliders, many=True, context={'request': request}) + + sub_categories = SubCategoryModel.objects.filter(show=True) + sub_category_ser = SubCategorySerializer(instance=sub_categories, many=True, context={'request': request}) + + products_to_show = ProductModel.objects.filter(show=True) + product_ser = ProductSerializer(instance=products_to_show, many=True, context={'request': request, 'dollor_price': dollor_price}) + + response = { + 'sliders': slider_ser.data, + 'sub_categories': sub_category_ser.data, + 'products': product_ser.data + } + + return Response(response, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/backend/product/models.py b/backend/product/models.py index 3ecb808..bca4739 100644 --- a/backend/product/models.py +++ b/backend/product/models.py @@ -25,13 +25,14 @@ class MainCategoryModel(models.Model): class SubCategoryModel(MainCategoryModel): 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 = "زیر دسته‌بندی‌ها" class DollorModel(models.Model): - price = models.FloatField(null=True, blank=True) - defualt_price = models.FloatField(null=True, blank=True, default=80000.0) + price = models.FloatField(null=True, blank=True, verbose_name='قیمت دلار') + defualt_price = models.FloatField(null=True, blank=True, default=80000.0, verbose_name='قیمت دستی') # these fields will avoid dublicate of this model unique = (('unique', 'unique'),) unique_filed = models.CharField(max_length=20, choices=unique, unique=True, default='unique') @@ -66,20 +67,21 @@ class DollorModel(models.Model): class ProductModel(models.Model): - name = models.CharField(max_length=255) - description = models.TextField() - price = models.PositiveIntegerField(default=0, help_text='قیمت') + name = models.CharField(max_length=255, verbose_name='نام') + description = models.TextField(verbose_name='توضیحات') + price = models.PositiveIntegerField(default=0, verbose_name='قیمت') currency_type = ( ('dollor', 'دلار'), ('toman', 'تومان'), ('derham', 'درهم') ) currency = models.CharField(verbose_name='نوع ارز', max_length=20, choices=currency_type) - image1 = models.ImageField(upload_to='product_images/') - image2 = models.ImageField(upload_to='product_images/', blank=True, null=True) - image3 = models.ImageField(upload_to='product_images/', blank=True, null=True) - video = models.FileField(upload_to='product_videos/', blank=True, null=True) - rating = models.PositiveIntegerField(default=0) + image1 = models.ImageField(upload_to='product_images/', verbose_name='عکس اول') + image2 = models.ImageField(upload_to='product_images/', blank=True, null=True, verbose_name='عکس دوم') + image3 = models.ImageField(upload_to='product_images/', blank=True, null=True, verbose_name='عکس سوم') + video = models.FileField(upload_to='product_videos/', blank=True, null=True, verbose_name='ویدیو') + rating = models.PositiveIntegerField(default=0, verbose_name='امتیاز') + show = models.BooleanField(default=False, verbose_name='نمایش در خانه') view = models.IntegerField(default=0, verbose_name='بازدید') sell = models.IntegerField(default=0, verbose_name='فروش') in_stock = models.IntegerField(default=0, verbose_name="تعداد موجود") @@ -90,7 +92,7 @@ class ProductModel(models.Model): meta_keywords = models.CharField(max_length=300, blank=True, null=True, help_text='این فیلد را حتما پر کنید') meta_rating = models.FloatField(default=5, help_text='امتیاز محصول') created_at = models.DateTimeField(auto_now_add=True, verbose_name='زمان ثبت محصول') - category = models.ForeignKey(SubCategoryModel, blank=True, null=True, on_delete=models.SET_NULL, related_name='products') + category = models.ForeignKey(SubCategoryModel, blank=True, null=True, on_delete=models.SET_NULL, related_name='products', verbose_name='دسته بندی محصول') def format_discount_price(self): discount_price = int(self.price * (100 - self.discount) / 100) formatted_num = "{:,.0f}".format(discount_price) @@ -126,7 +128,7 @@ class ProductModel(models.Model): class CommentModel(models.Model): product = models.ForeignKey(ProductModel, on_delete=models.CASCADE, related_name='comments', verbose_name='محصول') content = models.TextField(verbose_name='محتوای نظر') - user = models.ForeignKey(User, on_delete=models.CASCADE) + user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='کاربر') timestamp = models.DateTimeField(auto_now_add=True, verbose_name='زمان ثبت کامنت') show = models.BooleanField(default=True, verbose_name='نشان دادن کامنت') class Meta: diff --git a/backend/product/serializers.py b/backend/product/serializers.py index e05a61c..c331bb7 100644 --- a/backend/product/serializers.py +++ b/backend/product/serializers.py @@ -39,7 +39,7 @@ class SubCategorySerializer(serializers.ModelSerializer): product_count = serializers.SerializerMethodField() class Meta: model = SubCategoryModel - fields = ['id', 'name', 'slug','icon', 'meta_title', 'meta_description', 'product_count'] + fields = ['id', 'name', 'slug','icon', 'meta_title', 'meta_description', 'product_count', 'show'] def get_product_count(self, obj): return obj.products.count()