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)