Created
January 7, 2015 02:46
-
-
Save CapnKernel/ef34543d529e7b91eb4f to your computer and use it in GitHub Desktop.
A look at some code behind hackvana's /my facility
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {% 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 %} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {% 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 %} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {% 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 %} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {% 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 %} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # -*- 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}) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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