120 lines
4.6 KiB
Python
120 lines
4.6 KiB
Python
from django.db import models
|
|
from account.models import User, UserAddressModel, PushSubscription
|
|
from product.models import ProductModel, ProductVariant, ProductImageModel
|
|
from django.utils import timezone
|
|
from .execptions import DiscountNotAvailableError
|
|
from django_jalali.db import models as jmodels
|
|
|
|
class DiscountCode(models.Model):
|
|
code = models.CharField(max_length=50, verbose_name='کد تخفیف')
|
|
percent = models.DecimalField(max_digits=4, decimal_places=2, verbose_name='درصد')
|
|
quantity = models.PositiveIntegerField(verbose_name='تعداد')
|
|
expiration_date = models.DateTimeField(verbose_name='تاریخ انقضا')
|
|
|
|
def __str__(self):
|
|
return self.code
|
|
|
|
class Meta:
|
|
verbose_name = 'کد تخفیف'
|
|
verbose_name_plural = 'کد های تخفیف'
|
|
|
|
def is_valid(self):
|
|
return self.expiration_date > timezone.now() and self.quantity > 0
|
|
|
|
def not_valid_reason(self):
|
|
if self.expiration_date > timezone.now() and self.quantity > 0:
|
|
return 'این کد معتبر میباشد'
|
|
elif not self.expiration_date > timezone.now():
|
|
return 'تایم کد تخفیف تمام شده'
|
|
elif not self.quantity > 0:
|
|
return 'این کد تخفیف تمام شده است'
|
|
else:
|
|
print('log later bug')
|
|
|
|
|
|
|
|
class OrderModel(models.Model):
|
|
objects = jmodels.jManager()
|
|
STATUS_CHOICES = [
|
|
('CART', 'در سبد خرید'),
|
|
('ADMIN_PENDING', 'در انتظار تایید'),
|
|
('PENDING', 'درحال پردازش'),
|
|
('POSTED', 'ارسال شده'),
|
|
('RECEIVED', 'تحویل شده'),
|
|
('CANCELED', 'لغو شده'),
|
|
('BACK', 'مرجوع شده'),
|
|
]
|
|
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='orders', verbose_name='کاربر')
|
|
address = models.ForeignKey(UserAddressModel, on_delete=models.SET_NULL, related_name='orders', null=True, verbose_name='ادرس')
|
|
created_at = jmodels.jDateField(blank=True, null=True, verbose_name="تاریخ ثبت سفارش")
|
|
is_paid = models.BooleanField(default=False, verbose_name="وضعیت پرداخت")
|
|
discount_code = models.ForeignKey(DiscountCode, on_delete=models.PROTECT, null=True, blank=True, verbose_name="کدتخفیف")
|
|
status = models.CharField(max_length=20, choices=STATUS_CHOICES, verbose_name="وضعیت سفارش")
|
|
def __str__(self):
|
|
return f'سفارش: {self.id}'
|
|
|
|
class Meta:
|
|
verbose_name = 'سفارش'
|
|
verbose_name_plural = 'سفارشات'
|
|
|
|
|
|
# def total_without_tax(self):
|
|
# return sum(item.total() for item in self.items.all())
|
|
|
|
|
|
def save(self, *args, **kwargs):
|
|
try:
|
|
push_object = PushSubscription.objects.get(user=self.user)
|
|
except:
|
|
print('object not found')
|
|
try:
|
|
push_object.send_notif(f'سفارش شما به {self.get_status_display()} تغییر کرد', f'سفارش شما به {self.get_status_display()} تغییر کرد', ProductImageModel.objects.all().first().image.url)
|
|
except:
|
|
print('didnt send')
|
|
super().save(*args, **kwargs)
|
|
|
|
|
|
def discount(self):
|
|
pass
|
|
# total_with_item_discount = sum(item.total_with_discount() for item in self.items.all())
|
|
# if self.discount_code:
|
|
# if not self.discount_code.is_valid():
|
|
# raise DiscountNotAvailableError('این کد تخفیف دیگر معتبر نیست')
|
|
# discount_percent = self.discount_code.percent
|
|
# return total_with_item_discount * ((100 - discount_percent) / 100)
|
|
# return total_with_item_discount
|
|
|
|
|
|
def tax(self):
|
|
return self.total_without_tax() * 0.2
|
|
|
|
|
|
def total(self):
|
|
pass
|
|
# return self.total_with_discount() + self.tax()
|
|
|
|
def final_price(self):
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
class OrderItemModel(models.Model):
|
|
order = models.ForeignKey(OrderModel, on_delete=models.CASCADE, related_name='items', verbose_name='سفارش')
|
|
quantity = models.PositiveSmallIntegerField(verbose_name="تعداد")
|
|
price = models.PositiveIntegerField(verbose_name='قیمت')
|
|
product = models.ForeignKey(ProductVariant, on_delete=models.PROTECT, verbose_name="محصول")
|
|
class Meta:
|
|
verbose_name = 'ایتم سبد خرید'
|
|
verbose_name_plural = 'ایتم های سبد خرید'
|
|
|
|
def total(self):
|
|
return self.quantity * self.product.price
|
|
|
|
def total_with_discount(self):
|
|
return self.quantity * self.product.get_toman_price_after_discount()
|
|
def __str__(self):
|
|
return f'({self.product}) - ({self.order.user})'
|
|
|