def create(self, request): """ Add an item to the basket """ variant_id = request.data.get("variant_id", None) if variant_id is not None: variant = ProductVariant.objects.get(id=variant_id) quantity = int(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() serializer = BasketItemSerializer(self.get_queryset(request), many=True) response = Response(data=serializer.data, status=status.HTTP_201_CREATED) else: response = Response({"message": "Missing 'variant_id'"}, status=status.HTTP_400_BAD_REQUEST) return response
def get_rates_cache_key(self, **kwargs): from longclaw.basket.serializers import BasketItemSerializer settings = kwargs['settings'] origin = settings.shipping_origin destination = kwargs['destination'] basket_id = kwargs['basket_id'] items = BasketItem.objects.filter(basket_id=basket_id) serialized_items = BasketItemSerializer(items, many=True) serialized_origin = AddressSerializer(origin) or None serialized_destination = AddressSerializer(destination) or None data = { "items": serialized_items.data, "origin": serialized_origin.data, "destination": serialized_destination.data, } raw_key = json.dumps( data, sort_keys=True, indent=4, separators=(',', ': '), cls=DjangoJSONEncoder, ) hashed_key = hashlib.sha1(force_bytes(raw_key)).hexdigest() return force_text(hashed_key)
def bulk_update(self, request): """Put multiple items in the basket, removing anything that already exists """ # Delete everything in the basket bid = utils.destroy_basket(request) for item_data in request.data: item = BasketItem(basket_id=bid, **item_data) item.save() serializer = BasketItemSerializer(self.get_queryset(request), many=True) response = Response(data=serializer.data, status=status.HTTP_200_OK) return response
def destroy(self, request, variant_id=None): """ Remove an item from the basket """ variant = ProductVariant.objects.get(id=variant_id) quantity = int(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: pass serializer = BasketItemSerializer(self.get_queryset(request), many=True) return Response(data=serializer.data, status=status.HTTP_200_OK)