from store.models import ProductVariation import uuid class CartItem(object): subtotal = 0 def __init__(self, item_variant, count, id=None): self.item = item_variant self.price = int(item_variant.get_price()) self.count = int(count) self.subtotal = self.get_price() * self.count if not id: self.id = str(uuid.uuid4()) else: self.id = id def get_price(self): return self.price class Cart(object): items = [] json_items = [] total = 0 weight = 0.1 items_format = {'items': [], 'total': 0} def __init__(self, request): self.items = [] self.request = request self.total = 0 try: self.json_items = request.session['store_cart'] if not self.json_items: self.json_items = self.items_format except: self.json_items = self.items_format self.deserialize_items() def deserialize_items(self): for j in self.json_items['items']: variation = None try: variation = ProductVariation.objects.get( pk=j['product']) except ProductVariation.DoesNotExist: pass if variation: item = CartItem( variation, j['count'], j['id']) self.items.append(item) self.total += int(item.subtotal) self.weight += variation.weight * j['count'] return self def serialize_items(self): cart = {} cart['total'] = self.total cart['items'] = [] for j in self.items: cart['items'].append( {'product': j.item.pk, 'count': j.count, 'id': j.id}) self.json_items = cart self.request.session['store_cart'] = self.json_items return self def add_item(self, item): self.items.append(item) self.total += item.subtotal self.serialize_items() return self def remove_item(self, item_id): for i in self.items: if i.id == item_id: self.items.remove(i) self.total -= i.subtotal self.serialize_items() return self def update_items(self): for item in self.items: if item.id in self.request.POST: try: request_count = int(self.request.POST.get(item.id)) except: request_count = 1 if request_count <= 0: request_count = 1 if request_count > item.item.in_stock: request_count = item.item.in_stock if item.count != request_count: self.total -= item.subtotal item.count = request_count item.subtotal = item.get_price() * item.count self.total += item.subtotal self.serialize_items() def clear(self): self.items = [] self.json_items = [] self.total = 0 self.request.session['store_cart'] = None