Very first attempt at a staff-facing report (items sold)
This commit is contained in:
parent
3225a353e0
commit
00476498a8
3 changed files with 116 additions and 0 deletions
|
@ -345,3 +345,16 @@ class VoucherForm(forms.Form):
|
|||
help_text="If you have a voucher code, enter it here",
|
||||
required=False,
|
||||
)
|
||||
|
||||
|
||||
# Staff-facing forms.
|
||||
|
||||
class ProductAndCategoryForm(forms.Form):
|
||||
product = forms.ModelMultipleChoiceField(
|
||||
queryset=inventory.Product.objects.all(),
|
||||
required=False,
|
||||
)
|
||||
category = forms.ModelMultipleChoiceField(
|
||||
queryset=inventory.Category.objects.all(),
|
||||
required=False,
|
||||
)
|
||||
|
|
101
registrasion/staff_views.py
Normal file
101
registrasion/staff_views.py
Normal file
|
@ -0,0 +1,101 @@
|
|||
import forms
|
||||
|
||||
from django.db.models import Q
|
||||
from django.shortcuts import render
|
||||
from functools import wraps
|
||||
|
||||
from models import commerce
|
||||
|
||||
|
||||
'''
|
||||
|
||||
All reports must be viewable by staff only (permissions?)
|
||||
|
||||
Reports can have:
|
||||
|
||||
A form
|
||||
* Reports are all *gettable* - you can save a URL and get back to the same
|
||||
report
|
||||
* Fetching a report *cannot* break the underlying data.
|
||||
A table
|
||||
* Headings
|
||||
* Data lines
|
||||
* Formats are pluggable
|
||||
|
||||
'''
|
||||
|
||||
|
||||
class Report(object):
|
||||
|
||||
def __init__(self, form, headings, data):
|
||||
self._form = form
|
||||
self._headings = headings
|
||||
self._data = data
|
||||
|
||||
@property
|
||||
def form(self):
|
||||
''' Returns the form. '''
|
||||
return self._form
|
||||
|
||||
@property
|
||||
def headings(self):
|
||||
''' Returns the headings for the table. '''
|
||||
return self._headings
|
||||
|
||||
@property
|
||||
def data(self):
|
||||
''' Returns the data rows for the table. '''
|
||||
return self._data
|
||||
|
||||
|
||||
def report(view):
|
||||
''' Decorator that converts a report view function into something that
|
||||
displays a Report.
|
||||
|
||||
'''
|
||||
print "hello"
|
||||
|
||||
@wraps(view)
|
||||
def inner_view(request, *a, **k):
|
||||
print "lol"
|
||||
report = view(request, *a, **k)
|
||||
|
||||
ctx = {
|
||||
"form": report.form,
|
||||
"report": report,
|
||||
}
|
||||
|
||||
return render(request, "registrasion/report.html", ctx)
|
||||
|
||||
return inner_view
|
||||
|
||||
|
||||
@report
|
||||
def items_sold(request):
|
||||
''' Summarises the items sold and discounts granted for a given set of
|
||||
products, or products from categories. '''
|
||||
|
||||
print "beep"
|
||||
|
||||
form = forms.ProductAndCategoryForm(request.GET)
|
||||
|
||||
data = None
|
||||
headings = None
|
||||
|
||||
if form.is_valid() and form.has_changed():
|
||||
products = form.cleaned_data["product"]
|
||||
categories = form.cleaned_data["category"]
|
||||
|
||||
# TODO augment the form to allow us to filter by invoice status.
|
||||
line_items = commerce.LineItem.objects.filter(
|
||||
Q(product=products) | Q(product__category=categories),
|
||||
invoice__status=commerce.Invoice.STATUS_PAID,
|
||||
).select_related("invoice")
|
||||
|
||||
headings = ["invoice_id", "description", "quantity", "price"]
|
||||
|
||||
data = []
|
||||
for line in line_items:
|
||||
data.append([line.invoice.id, line.description, line.quantity, line.price])
|
||||
|
||||
return Report(form, headings, data)
|
|
@ -1,4 +1,5 @@
|
|||
import views
|
||||
import staff_views
|
||||
|
||||
from django.conf.urls import url, patterns
|
||||
|
||||
|
@ -30,4 +31,5 @@ urlpatterns = [
|
|||
url(r"^register$", guided_registration, name="guided_registration"),
|
||||
url(r"^register/([0-9]+)$", guided_registration,
|
||||
name="guided_registration"),
|
||||
url(r"^report$", staff_views.items_sold, name="items_sold"), # TODO: rm
|
||||
]
|
||||
|
|
Loading…
Reference in a new issue