Files
hossein-por-shop/backend/product/models.py
T
2025-01-11 19:59:10 +03:30

142 lines
5.5 KiB
Python

from django.db import models
from django.utils.text import slugify
from account.models import User
from django.urls import reverse
import requests
class CategoryModel(models.Model):
name = models.CharField(max_length=50, verbose_name='نام دسته‌بندی')
slug = models.SlugField(
max_length=50,
unique=True,
help_text="اسم دسته را برای مسیر به انگلیسی و بدون فاصله وارد کنید"
)
parent = models.ForeignKey(
'self',
on_delete=models.CASCADE,
related_name='children',
null=True,
blank=True,
verbose_name='دسته‌بندی والد'
)
icon = models.CharField(max_length=100, 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
)
class Meta:
verbose_name = "دسته‌بندی"
verbose_name_plural = "دسته‌بندی‌ها"
ordering = ['parent__id', 'id'] # Optional: to order by hierarchy
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('category_detail', kwargs={'slug': self.slug})
def get_breadcrumb(self):
breadcrumb = []
category = self
while category:
breadcrumb.append(category)
category = category.parent
return breadcrumb[::-1]
class DollorModel(models.Model):
price = models.FloatField(null=True, blank=True)
defualt_price = models.FloatField(null=True, blank=True, default=80000.0)
# these fields will avoid dublicate of this model
unique = (('unique', 'unique'),)
unique_filed = models.CharField(max_length=20, choices=unique, unique=True, default='unique')
def __str__(self):
return str(self.price)
def save(self, *args, **kwargs):
if not self.price:
self.update_price()
super().save(*args, **kwargs)
def update_price(self):
self.price = self.get_usd_price()
def get_usd_price(self):
try:
api_usd = "https://api.nobitex.ir/v2/orderbook/USDTIRT"
response = requests.get(api_usd)
data = response.json()
price = int(data["lastTradePrice"])
price_in_usd = price / 10.0
print('\n\nprice from api \n\n')
except:
if self.price:
print('\n\nprice from last price \n\n')
return self.price
else:
print('\n\nprice from defualt price \n\n')
return self.defualt_price
return price_in_usd
class ProductModel(models.Model):
name = models.CharField(max_length=255)
description = models.TextField()
price = models.PositiveIntegerField(default=0, help_text='قیمت')
currency_type = (
('dollor', 'دلار'),
('toman', 'تومان'),
('derham', 'درهم')
)
currency = models.CharField(verbose_name='نوع ارز', max_length=20, choices=currency_type)
image = models.ImageField(upload_to='product_images/')
rating = models.PositiveIntegerField(default=0)
view = models.IntegerField(default=0, verbose_name='بازدید')
sell = models.IntegerField(default=0, verbose_name='فروش')
in_stock = models.IntegerField(default=0, verbose_name="تعداد موجود")
discount = models.SmallIntegerField(default=0, verbose_name='تخفیف')
slug = models.SlugField(max_length=50, unique=True, blank=True, null=True, allow_unicode=True,
verbose_name='نام یکتا', help_text="این فیلد را خالی بگذارید")
link_of_metas = models.CharField(max_length=400, verbose_name='لینک استخراج متا', null=True, blank=True)
meta_description = models.CharField(max_length=300, blank=True, null=True, help_text='این فیلد را حتما پر کنید')
meta_keywords = models.CharField(max_length=300, blank=True, null=True, help_text='این فیلد را حتما پر کنید')
meta_rating = models.FloatField(default=5, help_text='امتیاز محصول')
def format_discount_price(self):
discount_price = int(self.price * (100 - self.discount) / 100)
formatted_num = "{:,.0f}".format(discount_price)
return formatted_num
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 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)
timestamp = models.DateTimeField(auto_now_add=True, verbose_name='زمان ثبت کامنت')
show = models.BooleanField(default=True, verbose_name='نشان دادن کامنت')
class Meta:
verbose_name = 'نظر'
verbose_name_plural = 'نظرات'
def __str__(self):
return f"{self.user}-{self.content[:30]}"