Manage orders, create, list, view details and refund.

Checkout

camerastore/views/orders.py


@login_required
def checkout(request):
    cart = ShoppingCart.get()
    customer = Customer.find_by_username(request.user.username)
    form = CheckoutForm(get_form_data(customer))
    return render(request, "orders/checkout.html", {"form": form, "cart": cart})


<h2>ORDER INFORMATION </h2>
<div class="registration-grids reg">
    <form id="payment-form" action="/orders/create" method="post">
        {% csrf_token %}
        <input type="hidden" name="token" value="" />
        <div class="reg-form">
            <div>
                <h3>Personal Information</h3>

                <ul>
                    <li class="text-info">First Name: </li>
                    <li>{{ form.customer_firstName }}</li>
                </ul>
                <ul>
                    <li class="text-info">Last Name: </li>
                    <li>{{ form.customer_lastName }}</li>
                </ul>
                <ul>
                    <li class="text-info">Email: </li>
                    <li>{{ form.customer_email }}</li>
                </ul>


                <h3>Billing Address</h3>
                <ul>
                    <li class="text-info">Address Line 1: </li>
                    <li>{{ form.billingAddress_streetLine1 }}</li>
                </ul>
                <ul>
                    <li class="text-info">Address Line 2:</li>
                    <li>{{ form.billingAddress_streetLine2 }}</li>
                </ul>
                <ul>
                    <li class="text-info">City:</li>
                    <li>{{ form.billingAddress_city }}</li>
                </ul>
                <ul>
                    <li class="text-info">State:</li>
                    <li>{{ form.billingAddress_state }}</li>
                </ul>
                <ul>
                    <li class="text-info">Zip code:</li>
                    <li>{{ form.billingAddress_zipCode }}</li>
                </ul>
                <ul>
                    <li class="text-info">Country:</li>
                    <li>{{ form.billingAddress_country }}</li>
                </ul>
                <h3>Shipping Address</h3>
                <ul>
                    <li><input type="checkbox" value="" /></li>
                    <li class="text-info">Same as Billing address: </li>
                </ul>
                <div id="shipping_address_container">
                    <ul>
                        <li class="text-info">Address Line 1: </li>
                        <li>{{ form.shippingAddress_streetLine1 }}</li>
                    </ul>
                    <ul>
                        <li class="text-info">Address Line 2:</li>
                        <li>{{ form.shippingAddress_streetLine2 }}</li>
                    </ul>
                    <ul>
                        <li class="text-info">City:</li>
                        <li>{{ form.shippingAddress_city }}</li>
                    </ul>
                    <ul>
                        <li class="text-info">State:</li>
                        <li>{{ form.shippingAddress_state }}</li>
                    </ul>
                    <ul>
                        <li class="text-info">Zip code:</li>
                        <li>{{ form.shippingAddress_zipCode }}</li>
                    </ul>
                    <ul>
                        <li class="text-info">Country:</li>
                        <li>{{ form.shippingAddress_country }}</li>
                    </ul>
                </div>

            </div>
        </div>
        <div class="reg-right">
            <h3>Credit Card Information</h3>
            <ul>
                <li class="text-info">Card Holder Name: </li>
                <li><input id="card_holder_name" type="text" value="" /></li>
            </ul>
            <ul>
                <li class="text-info">Card Number: </li>
                <li><input id="card_number" type="text" value="4242424242424242" data-stripe="number"/></li>
            </ul>
            <ul>
                <li class="text-info">CVC: </li>
                <li><input id="cvc" type="text" value="123" data-stripe="cvc"/></li>
            </ul>
            <ul>
                <li class="text-info">Expiration Date: </li>
                <li>
                    Month: <input type="text" value="12" style="width: 100px;" data-stripe="exp-month"/>
                    Year: <input type="text" value="2017" style="width: 100px;" data-stripe="exp-year"/>
                </li>
            </ul>
            <p style="display: none;" id="card_error_message"></p>
            <input type="submit" value="PLACE ORDER" />
            <p class="click">By clicking this button, you are agree to my  <a href="#">Policy Terms and Conditions.</a></p>
        </div>
        <div class="clearfix"></div>
    </form>
</div>

Placing orders

camerastore/views/orders.py


@login_required
def place_order(request):
    if request.method == 'POST':
        form = CheckoutForm(request.POST)
        if form.is_valid():
            order = populate_order(form.cleaned_data, request.user.username)
            paymentSource = request.POST['token']
            transaction = Order.checkout(order, paymentSource)
            return HttpResponseRedirect("/orders/{id}".format(id=transaction.order.id))
        else:
            print form.errors
            cart = ShoppingCart.get()
            return render(request, "orders/checkout.html", {"form": form, "cart": cart})

List all customer orders

camerastore/views/orders.py


@login_required
def index(request):
    customer = Customer.find_by_username(request.user.username)
    orders = Order.find_all_by_customer(customer=customer.id)
    return render(request, "orders/index.html", {"orders": orders})

camerastore/templates/orders/index.html


<h2>MY ORDERS </h2>
{% if orders.is_empty() %}
<div>
    <h1>You do not have any orders yet!</h1>
</div>
{% else %}
<div  class="cart-gd">
    <table class="table">
        <thead>
        <tr>
            <th>Order ID</th>
            <th>Creation Date</th>
            <th>Total Price</th>
            <th>Status</th>
            <th>Action</th>
        </tr>
        </thead>
        <tbody>
        {% for o in orders %}
        <tr>
            <td>
                <a href="/orders/{{o.id}}">{{ o.id }}</a>
            </td>
            <td>{{ o.createdAt }}</td>
            <td>{{ o.total }}</td>
            <td>{{ o.status }}</td>
            <td>
                <form action="/orders/refund/{{o.id}}" method="post">
                    <input type="submit" value="Refund"/>
                </form>
            </td>
        </tr>
        {% endfor %}
        </tbody>
    </table>
</div>
{% endif %}

Display order details

camerastore/views/orders.py


@login_required
def show(request, order_id):
    try:
        order = Order.find_by_id(order_id)
        return render(request, "orders/show.html", {"order": order})
    except EntityNotFoundException as e:
        return HttpResponseNotFound()

camerastore/templates/orders/show.html


<h2>Order Details </h2>
<table class="table">
    <tbody>
    <tr>
        <td colspan="2">
            <h4 style="text-align: center;">Summery</h4>
        </td>
    </tr>
    <tr>
        <th>Order ID</th>
        <td>{{ order.id }}</td>
    </tr>
    <tr>
        <th>Creation Date</th>
        <td>{{ order.createdAt }}</td>
    </tr>
    <tr>
        <th>Total price</th>
        <td>{{ order.total }}</td>
    </tr>
    <tr>
        <th>Status</th>
        <td>{{ order.status }}</td>
    </tr>
    <tr>
        <td colspan="2">
            <h4 style="text-align: center;">Item details</h4>
        </td>
    </tr>
    <tr>
        <td colspan="2">
            <table class="table">
                <thead>
                <tr>
                    <th>Product</th>
                    <th>Quantity</th>
                    <th>Unit Price</th>
                    <th>Total</th>
                </tr>
                </thead>
                <tbody>
                {% for i in order.items %}
                <tr>
                    <td>{{ i.product.title }}</td>
                    <td>{{ i.quantity }}</td>
                    <td>{{ i.unitPrice }}</td>
                    <td>{{ i.total }}</td>
                </tr>
                {% endfor %}
                </tbody>
            </table>
        </td>
    </tr>
    </tbody>
</table>

Refund Order

camerastore/templates/index.html


<form action="/orders/refund/{{o.id}}" method="post">
    <input type="submit" value="Refund"/>
</form>

camerastore/views/orders.py


@login_required
def refund(request, order_id):
    transaction = Order.refund(order_id)
    return HttpResponseRedirect("/orders/{id}".format(id=transaction.order.id))