You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

112 lines
4.8 KiB

from django.db import models
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from phonenumber_field.modelfields import PhoneNumberField
# from discount.models import Discount
from decimal import Decimal
from django.core.validators import MinValueValidator, MaxValueValidator
from products.models import Product, Offer
class Status(models.Model):
name = models.CharField(max_length=16, blank=True, null=True, default=None)
is_active = models.BooleanField(default=True)
created = models.DateField(auto_now_add=True, auto_now=False)
updated = models.DateField(auto_now_add=False, auto_now=True)
def __str__(self):
return self.name
class Meta:
verbose_name = 'State of order'
verbose_name_plural = 'States'
class Order(models.Model):
user = models.ForeignKey(User, blank=True, null=True, default=None)
total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0)
customer_name = models.CharField(max_length=64, blank=True, null=True, default=None)
customer_email = models.EmailField(blank=True, null=True, default=None)
customer_phone = PhoneNumberField(blank=True, null=True, default=None)
city = models.CharField(max_length=100, blank=True, null=True, default=None)
customer_address = models.CharField(max_length=128, blank=True, null=True, default=None)
comment = models.TextField(blank=True, null=True, default=None)
status = models.ForeignKey(Status, blank=True, null=True, default=None)
created = models.DateField(auto_now_add=True, auto_now=False)
updated = models.DateField(auto_now_add=False, auto_now=True)
paid = models.BooleanField(default=False)
# discount = models.ForeignKey(Discount, related_name='orders', null=True, blank=True)
# discount_value = models.IntegerField(default=0, validators=[MinValueValidator(0), MaxValueValidator(100)])
points_quant = models.IntegerField(default=0)
def __str__(self):
return "Order {!s} has status {}: ".format(self.id, self.status)
class Meta:
ordering = ('-created',)
verbose_name = 'Order'
verbose_name_plural = 'Orders'
def save(self, *args, **kwargs):
super(Order, self).save(*args, **kwargs)
class ProductsInOrder(models.Model):
order = models.ForeignKey(Order, blank=True, null=True, default=None, related_name='items')
product = models.ForeignKey(Offer, blank=True, null=True, default=None)
number = models.PositiveIntegerField(default=1)
price_per_itom = models.DecimalField(max_digits=10, decimal_places=2, default=0)
total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0)
is_active = models.BooleanField(default=True)
created = models.DateField(auto_now_add=True, auto_now=False)
updated = models.DateField(auto_now_add=False, auto_now=True)
def __str__(self):
return self.product.name
class Meta:
verbose_name = 'Product in Order'
verbose_name_plural = 'Products in Order'
def save(self, *args, **kwargs):
# self.price_per_itom = self.product.price
self.total_price = self.number * self.price_per_itom
super(ProductsInOrder, self).save(*args, **kwargs)
class ProductsInBasket(models.Model):
session_key = models.CharField(max_length=128, blank=True, null=True, default=None)
order = models.ForeignKey(Order, blank=True, null=True, default=None)
product = models.ForeignKey(Product, blank=True, null=True, default=None)
number = models.IntegerField(default=1)
price_per_itom = models.DecimalField(max_digits=10, decimal_places=2, default=0)
total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0)
is_active = models.BooleanField(default=True)
created = models.DateField(auto_now_add=True, auto_now=False)
updated = models.DateField(auto_now_add=False, auto_now=True)
def __str__(self):
return self.product.name
class Meta:
verbose_name = 'Product in Cart'
verbose_name_plural = 'Products in Cart'
def save(self, *args, **kwargs):
self.price_per_itom = self.product.price
self.total_price = int(self.number) * self.price_per_itom
super(ProductsInBasket, self).save(*args, **kwargs)
@receiver(post_save, sender=ProductsInOrder)
def product_in_order_post_save(instance,**kwargs):
order = instance.order
all_products_in_order = ProductsInOrder.objects.filter(order=order, is_active=True)
order_total_price = sum(item.total_price for item in all_products_in_order)
# if order.discount:
# order.total_price = order_total_price * (order.discount_value / Decimal('100'))
if order.points_quant:
order.total_price = order_total_price - order.points_quant
else:
order.total_price = order_total_price
order.save(force_update=True)