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 def as_csv(self) -> str: lines_parsed = "" for line in self.saleorderline_set.all(): lines_parsed = f"{lines_parsed}::{line.id}/{line.name}" return f"""name,sold_to,total,sold_at,lines {self.name},{self.sold_to.first_name} {self.sold_to.last_name},{self.total},{self.sold_at},{lines_parsed} """ 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) def as_csv(self) -> str: return f"""name,product,quantity {self.name},{self.product.name},{self.quantity} """