2017-04-02 09:14:20 +00:00
|
|
|
from rest_framework.decorators import detail_route, list_route
|
|
|
|
from rest_framework import permissions, status, viewsets
|
2017-02-03 10:04:57 +00:00
|
|
|
from rest_framework.response import Response
|
2017-02-17 09:03:21 +00:00
|
|
|
from longclaw.longclawbasket.models import BasketItem
|
|
|
|
from longclaw.longclawbasket.serializers import BasketItemSerializer
|
|
|
|
from longclaw.longclawbasket import utils
|
2017-04-02 09:14:20 +00:00
|
|
|
from longclaw.utils import ProductVariant
|
2017-02-03 10:04:57 +00:00
|
|
|
|
2017-04-02 09:14:20 +00:00
|
|
|
class BasketViewSet(viewsets.ModelViewSet):
|
|
|
|
"""
|
|
|
|
Viewset for interacting with a sessions 'basket' -
|
|
|
|
``ProductVariants`` which have been marked for checkout.BaseException
|
|
|
|
"""
|
|
|
|
serializer_class = BasketItemSerializer
|
|
|
|
permission_classes = (permissions.AllowAny, )
|
2017-02-03 10:04:57 +00:00
|
|
|
|
2017-04-02 09:39:08 +00:00
|
|
|
def get_queryset(self, request=None):
|
2017-04-02 09:41:32 +00:00
|
|
|
items, _ = utils.get_basket_items(request or self.request)
|
2017-04-02 09:14:20 +00:00
|
|
|
return items
|
2017-02-03 10:04:57 +00:00
|
|
|
|
2017-04-02 09:14:20 +00:00
|
|
|
def create(self, request):
|
|
|
|
"""
|
|
|
|
Add an item to the basket
|
|
|
|
"""
|
|
|
|
variant_id = request.data.get("variant_id", None)
|
2017-02-03 10:04:57 +00:00
|
|
|
|
2017-04-02 09:14:20 +00:00
|
|
|
if variant_id is not None:
|
|
|
|
variant = ProductVariant.objects.get(id=variant_id)
|
2017-02-03 10:04:57 +00:00
|
|
|
|
2017-04-02 09:14:20 +00:00
|
|
|
quantity = request.data.get("quantity", 1)
|
|
|
|
items, bid = utils.get_basket_items(request)
|
2017-02-03 10:04:57 +00:00
|
|
|
|
2017-04-02 09:14:20 +00:00
|
|
|
# Check if the variant is already in the basket
|
|
|
|
in_basket = False
|
|
|
|
for item in items:
|
|
|
|
if item.variant.id == variant.id:
|
|
|
|
item.increase_quantity(quantity)
|
|
|
|
in_basket = True
|
|
|
|
break
|
|
|
|
if not in_basket:
|
|
|
|
item = BasketItem(variant=variant, quantity=quantity, basket_id=bid)
|
|
|
|
item.save()
|
2017-02-03 10:04:57 +00:00
|
|
|
|
2017-04-02 09:39:08 +00:00
|
|
|
serializer = BasketItemSerializer(self.get_queryset(request), many=True)
|
2017-04-02 09:14:20 +00:00
|
|
|
response = Response(data=serializer.data,
|
|
|
|
status=status.HTTP_201_CREATED)
|
2017-02-03 10:04:57 +00:00
|
|
|
|
2017-04-02 09:14:20 +00:00
|
|
|
else:
|
|
|
|
response = Response(
|
|
|
|
{"message": "Missing 'variant_id'"},
|
|
|
|
status=status.HTTP_400_BAD_REQUEST)
|
2017-02-03 10:04:57 +00:00
|
|
|
|
2017-04-02 09:14:20 +00:00
|
|
|
return response
|
2017-02-03 10:04:57 +00:00
|
|
|
|
2017-04-02 09:14:20 +00:00
|
|
|
def destroy(self, request, variant_id=None):
|
|
|
|
'''
|
|
|
|
Remove an item from the basket
|
|
|
|
'''
|
|
|
|
variant = ProductVariant.objects.get(id=variant_id)
|
|
|
|
quantity = request.data.get("quantity", 1)
|
|
|
|
try:
|
|
|
|
item = BasketItem.objects.get(
|
|
|
|
basket_id=utils.basket_id(request), variant=variant)
|
|
|
|
item.decrease_quantity(quantity)
|
|
|
|
except BasketItem.DoesNotExist:
|
2017-04-02 10:58:49 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
serializer = BasketItemSerializer(self.get_queryset(request), many=True)
|
|
|
|
return Response(data=serializer.data,
|
|
|
|
status=status.HTTP_200_OK)
|
2017-04-02 09:14:20 +00:00
|
|
|
|
|
|
|
@list_route(methods=['get'])
|
|
|
|
def total_items(self, request):
|
|
|
|
'''
|
|
|
|
Get total number of items in the basket
|
|
|
|
'''
|
|
|
|
n_total = 0
|
2017-04-02 09:39:08 +00:00
|
|
|
for item in self.get_queryset(request):
|
2017-04-02 09:14:20 +00:00
|
|
|
n_total += item.quantity
|
|
|
|
|
|
|
|
return Response(data={"quantity": n_total}, status=status.HTTP_200_OK)
|
|
|
|
|
|
|
|
@detail_route(methods=['get'])
|
|
|
|
def item_count(self, request, variant_id=None):
|
|
|
|
'''
|
|
|
|
Get quantity of a single item in the basket
|
|
|
|
'''
|
|
|
|
bid = utils.basket_id(request)
|
|
|
|
item = ProductVariant.objects.get(id=variant_id)
|
|
|
|
try:
|
|
|
|
count = BasketItem.objects.get(basket_id=bid, variant=item).quantity
|
|
|
|
except BasketItem.DoesNotExist:
|
|
|
|
count = 0
|
|
|
|
return Response(data={"quantity": count}, status=status.HTTP_200_OK)
|