from django.db import models from django.utils.text import slugify from account.models import User from django.urls import reverse import requests class MainCategoryModel(models.Model): 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) class Meta: verbose_name = "دسته‌بندی اصلی" verbose_name_plural = "دسته‌بندی‌هااصلی" 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 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) parent = models.ForeignKey(MainCategoryModel, on_delete=models.CASCADE, related_name='subcategorys', verbose_name='دسته‌بندی والد') show = models.BooleanField(default=False, verbose_name='نمایش در خانه') class Meta: verbose_name = "زیر دسته‌بندی" verbose_name_plural = "زیر دسته‌بندی‌ها" 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='قیمت دلار') 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') 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 Meta: verbose_name = 'مدل دلار' verbose_name_plural = 'مدل دلار' class ProductModel(models.Model): 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/', 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="تعداد موجود") 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="این فیلد را خالی بگذارید") 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='امتیاز محصول') 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', verbose_name='دسته بندی محصول') 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 get_toman_price(self): dollor_object, _ = DollorModel.objects.get_or_create(unique_filed='unique') dollor_price = dollor_object.price dollar_to_dirham = 0.27 if dollor_price is None: raise ValidationError({"dollor_price": "The 'dollor_price' must be provided in the context for dollar pricing."}) if self.currency == 'toman': toman_price = self.price elif self.currency == 'dollor': toman_price = self.price * dollor_price elif self.currency == 'derham': toman_price = self.price * dollor_price * dollar_to_dirham return toman_price def get_toman_price_after_discount(self): return self.get_toman_price() * ((100 - self.discount) / 100) def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.name, allow_unicode=True) super().save(*args, **kwargs) class Meta: verbose_name = 'محصول' verbose_name_plural = 'محصولات' 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, verbose_name='کاربر') 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]}"