Ejemplo n.º 1
0
def create_order_with_token(request):
    """
    Create an order using an existing transaction ID.
    This is useful for capturing the payment outside of
    longclaw - e.g. using paypals' express checkout or
    similar
    """
    # Get the request data
    try:
        address = request.data['address']
        shipping_option = request.data.get('shipping_option', None)
        email = request.data['email']
        transaction_id = request.data['transaction_id']
    except KeyError:
        return Response(
            data={"message": "Missing parameters from request data"},
            status=status.HTTP_400_BAD_REQUEST)

    # Create the order
    order = create_order(
        email,
        request,
        addresses=address,
        shipping_option=shipping_option,
    )

    order.payment_date = timezone.now()
    order.transaction_id = transaction_id
    order.save()
    # Once the order has been successfully taken, we can empty the basket
    destroy_basket(request)

    return Response(data={"order_id": order.id},
                    status=status.HTTP_201_CREATED)
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
def deletecart(request):
    if request.POST['empty'] == 'Y':
        destroy_basket(request)
        return HttpResponse(200)
    remove_from_basket(request)
    return HttpResponse(200)
Ejemplo n.º 4
0
def create_order(email,
                 request,
                 addresses=None,
                 shipping_address=None,
                 billing_address=None,
                 shipping_option=None,
                 capture_payment=False):
    """
    Create an order from a basket and customer infomation
    """
    basket_items, _ = get_basket_items(request)
    if addresses:
        # Longclaw < 0.2 used 'shipping_name', longclaw > 0.2 uses a consistent
        # prefix (shipping_address_xxxx)
        try:
            shipping_name = addresses['shipping_name']
        except KeyError:
            shipping_name = addresses['shipping_address_name']

        shipping_country = addresses['shipping_address_country']
        if not shipping_country:
            shipping_country = None
        shipping_address, _ = Address.objects.get_or_create(
            name=shipping_name,
            line_1=addresses['shipping_address_line1'],
            city=addresses['shipping_address_city'],
            postcode=addresses['shipping_address_zip'],
            country=shipping_country)
        shipping_address.save()
        try:
            billing_name = addresses['billing_name']
        except KeyError:
            billing_name = addresses['billing_address_name']
        billing_country = addresses['shipping_address_country']
        if not billing_country:
            billing_country = None
        billing_address, _ = Address.objects.get_or_create(
            name=billing_name,
            line_1=addresses['billing_address_line1'],
            city=addresses['billing_address_city'],
            postcode=addresses['billing_address_zip'],
            country=billing_country)
        billing_address.save()
    else:
        shipping_country = shipping_address.country

    ip_address = get_real_ip(request)
    if shipping_country and shipping_option:
        site_settings = Configuration.for_site(request.site)
        shipping_rate = get_shipping_cost(site_settings,
                                          shipping_address.country.pk,
                                          shipping_option)['rate']
    else:
        shipping_rate = Decimal(0)

    order = Order(email=email,
                  ip_address=ip_address,
                  shipping_address=shipping_address,
                  billing_address=billing_address,
                  shipping_rate=shipping_rate)
    order.save()

    # Create the order items & compute total
    total = 0
    for item in basket_items:
        total += item.total()
        order_item = OrderItem(product=item.variant,
                               quantity=item.quantity,
                               order=order)
        order_item.save()

    if capture_payment:
        desc = 'Payment from {} for order id #{}'.format(email, order.id)
        try:
            transaction_id = GATEWAY.create_payment(request,
                                                    total + shipping_rate,
                                                    description=desc)
            order.payment_date = timezone.now()
            order.transaction_id = transaction_id
            # Once the order has been successfully taken, we can empty the basket
            destroy_basket(request)
        except PaymentError:
            order.status = order.FAILURE

        order.save()

    return order