github.com/ismailbayram/bigpicture@v0.0.0-20231225173155-e4b21f5efcff/internal/browser/pyproject/baskets/models.py (about) 1 from decimal import Decimal 2 from enumfields.fields import EnumField 3 4 from django.db import models 5 from django.core.exceptions import ObjectDoesNotExist 6 7 from base.models import StarterModel 8 from baskets.enums import BasketStatus, PromotionType 9 from baskets.manager import CampaignManager 10 from products.enums import Currency 11 12 13 class Basket(StarterModel): 14 customer_profile = models.ForeignKey('users.CustomerProfile', on_delete=models.PROTECT) 15 status = EnumField(enum=BasketStatus) 16 car = models.ForeignKey('cars.Car', on_delete=models.PROTECT) 17 currency = EnumField(enum=Currency, default=Currency.TRY) 18 19 def __init__(self, *args, **kwargs): 20 self.warning_messages = [] 21 self.campaign_messages = [] 22 super().__init__(*args, **kwargs) 23 24 def __str__(self): 25 return f'{self.status.value}' 26 27 def get_total_amount(self): 28 total_amount = Decimal('0.00') 29 for bi in self.basketitem_set.all(): 30 total_amount += bi.get_price() * bi.quantity 31 return total_amount 32 33 def get_total_quantity(self): 34 total_quantity = 0 35 for bi in self.basketitem_set.all(): 36 total_quantity += bi.quantity 37 return total_quantity 38 39 def get_net_amount(self): 40 total = self.get_total_amount() 41 for di in self.discountitem_set.all(): 42 total -= di.amount 43 return total 44 45 @property 46 def is_empty(self): 47 return not self.basketitem_set.exists() 48 49 50 class BasketItem(StarterModel): 51 basket = models.ForeignKey(to=Basket, on_delete=models.CASCADE) 52 product = models.ForeignKey('products.Product', on_delete=models.PROTECT) 53 quantity = models.PositiveIntegerField(default=1) 54 amount = models.DecimalField(null=True, default=None, decimal_places=2, max_digits=6) 55 56 def get_price(self): 57 if self.basket.status == BasketStatus.active: 58 return self.product.price(self.basket.car.car_type) 59 return self.amount 60 61 def __str__(self): 62 return f'{self.product.name} {self.quantity}' 63 64 def __getattribute__(self, item): 65 try: 66 return super().__getattribute__(item) 67 except ObjectDoesNotExist: 68 return None 69 70 71 class Campaign(StarterModel): 72 name = models.CharField(max_length=128) 73 message = models.CharField(max_length=256) 74 is_active = models.BooleanField(default=True) 75 priority = models.PositiveSmallIntegerField() 76 promotion_type = EnumField(enum=PromotionType, max_length=32) 77 78 objects = CampaignManager() 79 80 def __str__(self): 81 return self.name 82 83 class Meta: 84 ordering = ('priority', ) 85 86 87 class DiscountItem(StarterModel): 88 basket = models.ForeignKey(to=Basket, on_delete=models.CASCADE) 89 basket_item = models.OneToOneField(to=BasketItem, on_delete=models.CASCADE, 90 related_name='discount_item', null=True) 91 amount = models.DecimalField(decimal_places=2, max_digits=6) 92 campaign = models.ForeignKey(to=Campaign, on_delete=models.PROTECT)