wagtail-longclaw/longclaw/basket/api.py

101 wiersze
3.4 KiB
Python

from django.apps import apps
from django.db import transaction
from rest_framework.decorators import api_view, permission_classes
from rest_framework import permissions, status
from rest_framework.response import Response
from longclaw.basket.models import BasketItem
from longclaw.basket.serializers import BasketItemSerializer
from longclaw.basket import utils
from longclaw.settings import PRODUCT_VARIANT_MODEL
ProductVariant = apps.get_model(*PRODUCT_VARIANT_MODEL.split('.'))
@api_view(["GET"])
@permission_classes([permissions.AllowAny])
def get_basket(request):
''' Get all basket items
'''
items, _ = utils.get_basket_items(request)
serializer = BasketItemSerializer(items, many=True)
return Response(data=serializer.data, status=status.HTTP_200_OK)
@api_view(["GET"])
@permission_classes([permissions.AllowAny])
def get_item_count(request):
'''
Get quantity of a single item in the basket
'''
bid = utils.basket_id(request)
item = ProductVariant.objects.get(id=request.GET["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)
@transaction.atomic
@api_view(["POST"])
@permission_classes([permissions.AllowAny])
def add_to_basket(request):
'''
Add an item to the basket
'''
variant = ProductVariant.objects.get(id=request.data["variant_id"])
quantity = request.data.get("quantity", 1)
items, bid = utils.get_basket_items(request)
# 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()
items, _ = utils.get_basket_items(request)
serializer = BasketItemSerializer(items, many=True)
return Response(data=serializer.data,
status=status.HTTP_201_CREATED)
@transaction.atomic
@api_view(["POST"])
@permission_classes([permissions.AllowAny])
def remove_from_basket(request):
'''
Remove an item from the basket
'''
print(request.data["variant_id"])
variant = ProductVariant.objects.get(id=request.data["variant_id"])
quantity = request.data.get("quantity", 1)
try:
item = BasketItem.objects.get(basket_id=utils.basket_id(request), variant=variant)
except BasketItem.DoesNotExist:
return Response(data={"message": "Item does not exist in cart"},
status=status.HTTP_400_BAD_REQUEST)
if quantity >= item.quantity:
item.delete()
else:
item.decrease_quantity(quantity)
items, _ = utils.get_basket_items(request)
serializer = BasketItemSerializer(items, many=True)
return Response(data=serializer.data,
status=status.HTTP_201_CREATED)
@api_view(["GET"])
@permission_classes([permissions.AllowAny])
def basket_total_items(request):
'''
Get total number of items in the basket
'''
items, _ = utils.get_basket_items(request)
n_total = 0
for item in items:
n_total += item.quantity
return Response(data={"quantity": n_total}, status=status.HTTP_200_OK)