Manage orders, create, list, view details and refund.
Checkout
camerastore/orders.py
@app.route("/checkout")
@login_required
def checkout():
order = Order()
order.customer = Customer.find_by_id(session['customer_id'])
order.billingAddress = create_address()
order.shippingAddress = create_address()
form = CheckoutForm(obj=order)
return render_template("orders/checkout.html", form=form)
<h2>ORDER INFORMATION </h2>
<div class="registration-grids reg">
<form id="payment-form" action="/orders/create" method="post">
<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
@app.route("/orders/create", methods=['POST'])
@login_required
def place_order():
form = CheckoutForm(request.form)
if form.validate():
order = Order(**form.data)
order.customer.id = session['customer_id']
paymentSource = request.form['token']
transaction = Order.checkout(order, paymentSource)
return redirect("/orders/{id}".format(id=transaction.order.id))
List all customer orders
camerastore/orders.py
@app.route("/orders")
@login_required
def index():
orders = Order.find_all_by_customer(customer=session['customer_id'])
return render_template("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/orders.py
@app.route("/orders/<order_id>")
@login_required
def show(order_id):
try:
order = Order.find_by_id(order_id)
return render_template("orders/show.html", order=order)
except EntityNotFoundException as e:
abort(404)
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/orders.py
@app.route("/orders/refund/<order_id>", methods=['POST'])
def refund(order_id):
transaction = Order.refund(order_id)
return redirect("/orders/{id}".format(id=transaction.order.id))