from datetime import datetime from django.contrib.auth.models import User from django.db import models class BaseModel(models.Model): class Meta: abstract = True class ReadonlyMeta: readonly = [] class SaleOrder(BaseModel): class ReadonlyMeta: readonly = ["sold_to", "sold_at", "total"] name = models.CharField(max_length=200, unique=True) sold_to = models.ForeignKey(User, on_delete=models.DO_NOTHING, default=None, null=True) total = models.FloatField(max_length=200, default=0.0) sold_at = models.DateTimeField(max_length=200, null=True, default=None) @property def amount_total(self) -> float: return sum( map( lambda x: x.product.unit_price * x.quantity, self.saleorderline_set.all(), ) ) def sell(self, user: User): if not self.sold_at: self.sold_at = datetime.now() self.sold_to = user self.total = self.amount_total self.save() return self class Product(models.Model): name = models.CharField(max_length=200) unit_price = models.IntegerField(default=0) class SaleOrderLine(models.Model): name = models.CharField(max_length=200) product = models.ForeignKey(Product, on_delete=models.DO_NOTHING, null=True) order = models.ForeignKey(SaleOrder, on_delete=models.CASCADE, null=True) quantity = models.IntegerField(default=1)