checkout/src/purchase/models.py

74 lines
1.8 KiB
Python
Raw Normal View History

2022-04-24 16:21:39 +02:00
from django.db import models
class Model(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class PaymentMethod(Model):
name = models.CharField(max_length=50, unique=True)
def __str__(self):
return self.name
def default_product_display_order():
return Product.objects.last().display_order + 1
class Product(Model):
name = models.CharField(max_length=250, unique=True)
image = models.ImageField(null=True, blank=True)
unit_price_cents = models.PositiveIntegerField()
display_order = models.PositiveIntegerField(default=default_product_display_order)
class Meta:
ordering = ["display_order", "name"]
def __str__(self):
return self.name
class Basket(Model):
STATUS_DRAFT = "DRAFT"
STATUS_COMPLETE = "COMPLETE"
_STATUS_CHOICES = [
(STATUS_DRAFT, "Draft"),
(STATUS_COMPLETE, "Complete"),
]
payment_method = models.ForeignKey(
to=PaymentMethod,
on_delete=models.PROTECT,
related_name="baskets",
null=True,
blank=True,
)
status = models.CharField(
max_length=20, choices=_STATUS_CHOICES, default=STATUS_DRAFT
)
def __str__(self):
return f"Panier #{self.id}"
@property
def price(self) -> int:
return sum(item.price for item in self.items.all())
class BasketItem(Model):
product = models.ForeignKey(
to=Product, on_delete=models.PROTECT, related_name="basket_items"
)
basket = models.ForeignKey(
to=Basket, on_delete=models.CASCADE, related_name="items"
)
quantity = models.PositiveIntegerField()
@property
def price(self) -> int:
return self.product.unit_price_cents * self.quantity