Skip to content

Instantly share code, notes, and snippets.

@CapnKernel
Created January 7, 2015 02:46
Show Gist options
  • Select an option

  • Save CapnKernel/ef34543d529e7b91eb4f to your computer and use it in GitHub Desktop.

Select an option

Save CapnKernel/ef34543d529e7b91eb4f to your computer and use it in GitHub Desktop.
A look at some code behind hackvana's /my facility
{% extends "my/base.html" %}
{% load url from future %}
{% load vinaigrette %}
{% load i18n %}
{% block header %}My order: {{ order.hash }}'s arrived!{% endblock %}
{% block content %}
<h2>My order: {{ order.hash }}</h2>
{% if in_shipped_state %}
<p>Your order's arrived! Nice shiny PCBs!</p>
<p>Would you like to mark this order as "Arrived" in the Hackvana system?</p>
<form method="POST">
{% csrf_token %}
<input type="submit" value="Arrived!" />
</form>
{% else %}
<p>It would be nice to mark this order has arrived, but for that,
the order needs to be in the shipped state. At the moment, the
state is '{{ order.status|untranslate:'name' }}'.</p>
<button onclick="document.location='{% url 'my.orders.order' order.hash %}';">{% trans "Back" %}</button>
{% endif %}
{% endblock %}
{% extends "my/base.html" %}
{% load url from future %}
{% load vinaigrette %}
{% load i18n %}
{% block header %}Order notes: {{ order.hash }}{% endblock %}
{% block content %}
<h2>Order notes: {{ order.hash }}</h2>
<p>Describe this order. You might use a code from your company's accounting system, or a project name.</p>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save" />
</form>
{% endblock %}
{% extends "my/base.html" %}
{% load url from future %}
{% load i18n %}
{% load vinaigrette %}
{% block header %}My order: {{ order.hash }}{% endblock %}
{% block content %}
<h2>My order: {{ order.hash }}</h2>
<h3>My reference</h3>
{% if order.customer_reference %}
<p>{{ order.customer_reference }} <button onclick="document.location='{% url 'my.orders.order_notes' order.hash %}';">{% trans "Edit" %}</button></p>
{% else %}
<p>Unset. <button onclick="document.location='{% url 'my.orders.order_notes' order.hash %}';">{% trans "Set" %}</button></p>
{% endif %}
<h3>Summary</h3>
<table border="1" cellpadding="4">
<tr>
<th>Date</th>
<th>Paid by</th>
<th>Status</th>
<th>Tracking #</th>
</tr>
<tr>
<td>{{ order.date_purchased|date:"DATE_FORMAT" }}</td>
<td>{{ order.payment_module_code }}</td>
<td>{{ order.status|untranslate:'name' }}</td>
{% if order.combo_info %}
<td>Shipped with order {{ order.combo_info.hash }}</td>
{% else %}
<td>{{ order.shipping_method }}: <a href="{{ order.delivery_url }}">{{ order.tracking_no }}</a></td>
{% endif %}
</tr>
</table>
{% comment %}<h3>Combo</h3>{% endcomment %}
<h3>Current items in order</h3>
{% if items %}
<table border="1">
<tr>
<th>Name</th>
<th>Model</th>
<th>Status</th>
</tr>
{% for item in items %}
<tr>
<td>{{ item.name }}</td>
<td>{{ item.model }}</td>
<td>{% if item.product.virtual %}Non-product item{% else %}{{ item.status.name }}{% if order.status.name == 'Shipped' or order.status.name == 'Arrived' %} (order has shipped){% endif %}{% endif %}</td>
</tr>
{% endfor %}
</table>
<p>{{ items|length}} item{{ items|length|pluralize }}.</p>
<h4>Item status explanations</h4>
<ul>
{% for is_ in is_set %}
<li><b>{{ is_|untranslate:'name' }}</b>: {{ is_.explanation }}</li>
{% endfor %}
{% if has_some_virtuals %}
<li><b>Non-product item</b>: A non-free variation of the basic product, usually a service.</li>
{% endif %}
</ul>
{% else %}
<p>No items.</p>
{% endif %}
<p><button onclick="document.location='{% url 'my.orders.orders' %}';">{% trans "Back" %}</button></p>
{% endblock %}
{% extends "my/base.html" %}
{% load url from future %}
{% load vinaigrette %}
{% block header %}My orders{% endblock %}
{% block content %}
<h2>My orders</h2>
{% if orders %}
<table border="1" cellpadding="4">
<tr>
<th>Code</th>
<th>Date</th>
<th>Paid by</th>
<th>Status</th>
<th>Tracking #</th>
</tr>
{% for o in orders %}
<tr>
<td><a href="{% url 'my.orders.order' o.hash %}">{{ o.hash }}{% if o.customer_reference %} ({{ o.customer_reference }}){% endif %}</a></td>
<td>{{ o.date_purchased|date:"DATE_FORMAT" }}</td>
<td>
{{ o.payment_module_code }}
{% if o.payment_confirmed %}
(paid)
{% else %}
{% if o.payment_claimed %}
(unconfirmed)
{% else %}
(unpaid)
{% endif %}
{% endif %}
</td>
{% if o.combo_info %}
<td colspan="2">Shipped with order <a href="{% url 'my.orders.order' o.combo_info.hash %}">{{ o.combo_info.hash }}</a></td>
{% else %}
{% if o.status.name == 'Shipped' %}
<td><a href="{% url 'my.orders.order_arrived' o.hash %}" title="Mark as arrived" alt="Mark as arrived">{{ o.status|untranslate:'name' }}</a></td>
{% else %}
<td>{{ o.status|untranslate:'name' }}</td>
{% endif %}
<td>{{ o.shipping_method }}: <a href="{{ o.delivery_url }}">{{ o.tracking_no }}</a></td>
{% endif %}
</tr>
{% endfor %}
</table>
<p>{{ orders|length}} order{{ orders|length|pluralize }}.</p>
<h3>Order status explanations</h3>
<ul>
{% for os in os_set %}
<li><b>{{ os|untranslate:'name' }}</b>: {{ os.explanation }}</li>
{% endfor %}
</ul>
{% else %}
<p>There aren't any orders for you.</p>
{% endif %}
{% endblock %}
# -*- coding: utf-8 -*-
from django import forms
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect, Http404
from django.core.urlresolvers import reverse
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods
from groups import group_required
from zencart.models import Order, OrderStatus
from zencart.models import Item, ItemStatus
from zencart.models import Customer
def get_customer(request): # vet: nologin
return = get_object_or_404(Customer, nick=request.user.username)
def get_order(request, id): # vet: nologin
order = get_object_or_404(Order, hash=id)
c = get_customer(request)
if order.customer != c and request.user.username != 'mjd':
raise Http404
return order
@login_required
@require_http_methods(("GET",))
def orders(request):
c = get_customer(request)
orders = Order.objects.for_customer(c)
status_names = set(order.status.name for order in orders)
os_set = OrderStatus.objects.filter(name__in=status_names)
return render(request, 'my/orders.html', {'orders': orders, 'os_set': os_set})
@login_required
@require_http_methods(("GET",))
def order(request, id):
order = get_order(request, id)
items = order.item_set.all()
status_names = set(item.status.name for item in items if not item.product.virtual)
is_set = ItemStatus.objects.filter(name__in=status_names)
has_some_virtuals = items.filter(product__virtual=True).count() > 0
return render(request, 'my/order.html', {'order': order, 'items': items, 'is_set': is_set, 'has_some_virtuals': has_some_virtuals})
@login_required
def order_arrived(request, id):
order = get_order(request, id)
in_shipped_state = order.status.name == 'Shipped'
# GET: Show "so your stuff arrived" page
# POST: Set order to arrived.
if request.method == 'POST':
if not in_shipped_state:
messages.error(request, "Order %s was not in the 'Shipped' state, so its status can't be set to Arrived." % order.hash)
else:
order.status = OrderStatus.objects.get(name='Arrived')
order.save()
messages.success(request, "This order has been marked as arrived.")
return HttpResponseRedirect(reverse('my.orders.order', args={order.hash}))
return render(request, 'my/order-arrived.html', {'order': order, 'in_shipped_state': in_shipped_state})
class OrderNotesForm(forms.ModelForm):
class Meta:
model = Order
fields = ('customer_reference',)
@login_required
def order_notes(request, id):
order = get_order(request, id)
# GET: Show "change reference" form
# POST: Accept, validate and save reference info, redirect to order().
if request.method == 'POST':
form = OrderNotesForm(request.POST, instance=order)
if form.is_valid():
form.save()
messages.success(request, "Order %s has been changed." % order.hash)
return HttpResponseRedirect(reverse('my.orders.order', args={order.hash}))
else:
print "order_notes: form not valid"
else:
form = OrderNotesForm(instance=order)
return render(request, 'my/order-notes.html', {'order': order, 'form': form})
from django.conf.urls import patterns, url
urlpatterns += patterns('my.orders',
url(r'^orders/(?P<id>[ABCDEFHJKMNPQRSTUVWXYZ123456789]{5})/notes$', 'order_notes'),
url(r'^orders/(?P<id>[ABCDEFHJKMNPQRSTUVWXYZ123456789]{5})/arrived$', 'order_arrived'),
url(r'^orders/(?P<id>[ABCDEFHJKMNPQRSTUVWXYZ123456789]{5})$', 'order'),
url(r'^orders$', 'orders'),
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment