You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.9 KiB
103 lines
2.9 KiB
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 = ProductVariation.objects.get(
|
|
pk=j['product'])
|
|
item = CartItem(
|
|
variation, j['count'], j['id'])
|
|
self.items.append(item)
|
|
self.total += int(item.subtotal)
|
|
self.weight += variation.weight
|
|
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
|
|
|