예제 #1
0
def checkout_home(request):
    cart_obj, cart_created = Cart.objects.new_or_get(request)
    order_obj = None
    shipping_address_qs = None
    billing_address_qs = None
    if cart_created or cart_obj.products.count() == 0:
        return redirect('cart:home')
    billing_profile, billing_profile_created = BillingProfile.objects.new_or_get(
        request)
    billing_address_id = request.session.get('billing_address_id')
    shipping_address_id = request.session.get('shipping_address_id')

    if billing_profile is not None:
        address_qs = Address.objects.filter(billing_profile=billing_profile)
        shipping_address_qs = address_qs.filter(address_type="shipping")
        billing_address_qs = address_qs.filter(address_type="billing")
        order_obj, order_obj_created = Order.objects.new_or_get(
            cart_obj, billing_profile)
        if billing_address_id is not None and shipping_address_id is not None:
            order_obj.shipping_address = Address.objects.get(
                id=shipping_address_id)
            order_obj.billing_address = Address.objects.get(
                id=billing_address_id)
            order_obj.save()
            del request.session['billing_address_id']
            del request.session['shipping_address_id']
        if request.method == "POST":
            is_done = order_obj.check_order()
            if is_done:
                del request.session['cart_id']
                request.session['cart_count'] = 0
                order_obj.complete_order()
                cart_obj.active = False
                cart_obj.save()
                return redirect("cart:success")
    context = {
        "object": order_obj,
        "obj_count": cart_obj.products.count(),
        "billing_profile": billing_profile,
        "form_login": LoginForm(),
        "form_registration": RegistrationForm(),
        "form_guest": GestForm(),
        "shipping_address": AddressForm(prefix="shipping"),
        "billing_address": AddressForm(prefix="billing"),
        "saved_shipping_address": shipping_address_qs,
        "saved_billing_address": billing_address_qs,
    }
    return render(request, "cart/checkout.html", context)
예제 #2
0
def address_update(request):
    if request.method == 'POST':
        # Is this a shipping or billing address????
        address_type = request.POST.get('address_type')
        address_id = request.POST.get('address')
        print('address', address_id)

        address = Address.objects.get(id=address_id)

        billing_profile, bill_created = BillingProfile.objects.new_or_get(
            request)
        cart_obj, cart_created = Cart.objects.new_or_get(request)
        order_obj, order_created = Order.objects.new_or_get(
            billing_profile=billing_profile, cart_obj=cart_obj)

        form = AddressForm(request.POST)
        if form.is_valid():

            # Now we have to associate to the order
            if address_type == 'shipping':
                # How do we get the order?
                order_obj.shipping_address = address
                order_obj.save()
            if address_type == 'billing':
                order_obj.billing_address = address
                order_obj.save()
            return redirect('carts:cart_checkout')
    else:
        return redirect('carts:cart_checkout')
예제 #3
0
def checkout_home(request):
    cart_obj, cart_created = Cart.objects.new_or_get(request)
    order_obj = None
    if cart_created or cart_obj.products.count() == 0:
        return redirect("cart:home")

    login_form = LoginForm()
    guest_form = GuestForm()
    address_form = AddressForm()
    billing_address_id = request.session.get("billing_address_id", None)
    shipping_address_id = request.session.get("shipping_address_id", None)
    billing_profile, billing_profile_created = BillingProfile.objects.new_or_get(
        request)
    if billing_profile is not None:
        order_obj, order_obj_created = Order.objects.new_or_get(
            billing_profile, cart_obj)
        if shipping_address_id:
            order_obj.shipping_address = Address.objects.get(
                id=shipping_address_id)
            del request.session["shipping_address_id"]
        if billing_address_id:
            order_obj.billing_address = Address.objects.get(
                id=billing_address_id)
            del request.session["billing_address_id"]
        if billing_address_id or shipping_address_id:
            order_obj.save()

    context = {
        "object": order_obj,
        "billing_profile": billing_profile,
        "login_form": login_form,
        "guest_form": guest_form,
        "address_form": address_form,
    }
    return render(request, "carts/checkout.html", context)
예제 #4
0
파일: views.py 프로젝트: linusidom/bootcamp
def cart_checkout(request):
    order_obj = None
    old_addresses = None
    credit_card = None
    loginForm = LoginForm()
    guestForm = GuestForm()
    addressForm = AddressForm()
    # print('AddressForm', addressForm)
    cart_obj, cart_created = Cart.objects.new_or_get(request)
    billing_profile, bill_created = BillingProfile.objects.new_or_get(request)
    cards = Card.objects.filter(billing_profile=billing_profile, default=True)
    if cards.exists():
        credit_card = cards.last()

    # print('BillingProfile ',billing_profile)
    if billing_profile is not None:
        order_obj, order_created = Order.objects.new_or_get(
            billing_profile=billing_profile, cart_obj=cart_obj)

    if order_obj is not None:
        old_addresses = Address.objects.filter(billing_profile=billing_profile)

    context = {
        'order_obj': order_obj,
        'loginForm': loginForm,
        'guestForm': guestForm,
        'addressForm': addressForm,
        'billing_profile': billing_profile,
        'old_addresses': old_addresses,
        'credit_card': credit_card,
    }
    return render(request, 'carts/cart_checkout.html', context)
예제 #5
0
def checkout_address_create_view(request):
    form = AddressForm(request.POST or None)
    context = {"form": form}
    next_ = request.GET.get("next")
    next_post = request.POST.get("next")
    redirect_path = next_ or next_post or None
    if form.is_valid():
        print(request.POST)
        instance = form.save(commit=False)
        billing_profile, billing_profile_created = BillingProfile.objects.new_or_get(
            request)
        if billing_profile is not None:
            address_type = request.POST.get("address_type", 'shipping')
            instance.billing_profile = billing_profile
            instance.address_type = request.POST.get('address_type',
                                                     'shipping')
            instance.save()

            request.session[address_type + "_address_id"] = instance.id
            print(request.session[address_type + "_address_id"])
        else:
            # TODO put a real error here that the address didn't save
            print("Error trying to save address")
            return redirect("cart:checkout")

        if is_safe_url(redirect_path, request.get_host()):
            return redirect(redirect_path)
        else:
            return redirect("cart:checkout")
    return redirect("cart:checkout")
예제 #6
0
def checkout_home(request):
    context = {}
    if request.user.is_authenticated:
        # checkout will be after cart view, ie when cart is created
        cart_obj, cart_created = Cart.objects.get_or_create_cart(request)
        if cart_obj.products.count() == 0:
            # cart is empty redirect to cart view
            return redirect("carts:cart")
        billing_profile, billing_profile_created = BillingProfile.objects.get_or_create(
            user=request.user, email=request.user.email)

        if billing_profile is not None:
            order_obj, order_obj_created = Order.objects.get_or_create_order(
                billing_profile, cart_obj
            )
        num_cart_items = order_obj.cart.products.count()
        shipping_address_form = AddressForm()
        addresses = Address.objects.filter(billing_profile=billing_profile)

        context = {
            'object': order_obj,
            'num_cart_items': num_cart_items,
            'addresses': addresses,
            'billing_profile': billing_profile,
            'shipping_address_form': shipping_address_form,
        }
    return render(request, "carts/checkout.html", context)
예제 #7
0
def checkout_home(request):
    cart_obj, cart_created = Cart.objects.new_or_get(request)
    order_obj = None
    items = None
    if cart_created:
        redirect('cart')

    address_form = AddressForm()

    billing_address_id = request.session.get('billing_address_id', None)
    shipping_address_id = request.session.get('shipping_address_id', None)

    billing_profile, billing_profile_created = BillingProfile.objects.new_or_get(
        request)
    address_qs = None
    has_card = None

    if billing_profile is not None:
        address_qs = Address.objects.filter(billing_profile=billing_profile)
        order_obj, order_obj_created = Order.objects.new_or_get(
            billing_profile, cart_obj)
        items = Item.objects.filter(cart=cart_obj)
        if shipping_address_id:
            order_obj.shipping_address = Address.objects.get(
                id=shipping_address_id)
            del request.session['shipping_address_id']
        if billing_address_id:
            order_obj.billing_address = Address.objects.get(
                id=billing_address_id)
            del request.session['billing_address_id']
        if shipping_address_id or billing_address_id:
            order_obj.save()
        has_card = billing_profile.has_card()

    if request.method == 'POST':
        is_prepared = order_obj.check_done()
        if is_prepared:
            did_charge, charge_msg = billing_profile.charge(order_obj)
            if did_charge:
                order_obj.mark_paid()
                Item.objects.all().delete()
                Cart.objects.all().delete()
                return redirect('success')
            else:
                print(charge_msg)
                return redirect('checkout')

    context = {
        'object': order_obj,
        'items': items,
        'billing_profile': billing_profile,
        'address_form': address_form,
        'addresses': address_qs,
        'has_card': has_card,
        'publish_key': STRIPE_PUB_KEY
    }

    return render(request, 'cart/checkout.html', context)