github.com/ismailbayram/bigpicture@v0.0.0-20231225173155-e4b21f5efcff/internal/browser/pyproject/baskets/strategies.py (about) 1 from baskets.models import DiscountItem, BasketItem 2 from reservations.enums import ReservationStatus 3 4 5 class BasePromotionStrategy: 6 def __init__(self, campaign, basket): 7 self.basket = basket 8 self.campaign = campaign 9 self.remaining = 0 10 11 def check(self): 12 raise NotImplementedError() 13 14 def get_discount_amount(self, basket_item): 15 raise NotImplementedError() 16 17 def apply(self): 18 raise NotImplementedError() 19 20 21 class OneFreeInNineStrategy(BasePromotionStrategy): 22 def check(self): 23 res_count = self.basket.customer_profile.reservation_set.filter(status=ReservationStatus.completed).count() 24 if res_count != 0 and res_count % 9 == 0: 25 return True 26 self.remaining = 9 - (res_count % 9) 27 return False 28 29 def get_discount_amount(self, basket_item): 30 product = basket_item.product 31 return product.price(basket_item.basket.car.car_type) 32 33 def apply(self): 34 try: 35 basket_item = self.basket.basketitem_set.get(product__is_primary=True) 36 if basket_item.discount_item: 37 return 38 except BasketItem.DoesNotExist: 39 return 40 DiscountItem.objects.create(campaign=self.campaign, basket=self.basket, basket_item=basket_item, 41 amount=self.get_discount_amount(basket_item))