diff --git a/partdoc/parts/templates/parts/parts.html b/partdoc/parts/templates/parts/parts.html
new file mode 100644
index 0000000..75c1310
--- /dev/null
+++ b/partdoc/parts/templates/parts/parts.html
@@ -0,0 +1,28 @@
+
parts
+
+
+
+ | Teil-Nr. |
+ Teilbezeichnung |
+ {% for product in products %}
+ {{product.name}} |
+ {% endfor %}
+ Summe |
+
+
+{% for part in quantities %}
+
+ | {{part.number}} |
+ {{part.name}} |
+ {% for product in part.quantities %}
+ {{product}} |
+ {% endfor %}
+ {{part.sum}} |
+
+{% endfor %}
+
+
+ | Summe: |
+ {{len}} |
+ Teile |
+
diff --git a/partdoc/parts/urls.py b/partdoc/parts/urls.py
index b2ebf38..91dadcf 100644
--- a/partdoc/parts/urls.py
+++ b/partdoc/parts/urls.py
@@ -7,6 +7,7 @@ urlpatterns = [
path('', views.index, name="index"),
path('product//', views.product, name="detail"),
path('sketch//', views.sketch, name="sketch"),
+ path('parts', views.parts, name="parts"),
path('add//sketch/', views.sketch_add, name="continue_sketch"),
path('add//sketch', views.sketch_add, name="new_sketch"),
path('search/part/', views.part_search, name="part_search"),
diff --git a/partdoc/parts/views.py b/partdoc/parts/views.py
index cc523af..bb5074e 100644
--- a/partdoc/parts/views.py
+++ b/partdoc/parts/views.py
@@ -3,6 +3,7 @@ from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse
from django.db import transaction
+from django.db.models import Sum
from .models import *
@@ -28,6 +29,32 @@ def sketch(request, sketch_id):
return render(request, 'parts/sketch.html', context)
+def parts(request):
+ products = Product.objects.order_by('name')
+ parts = BrandedPart.objects.order_by('number')
+ quantities = []
+ for part in parts: # FIXME!
+ qtys = part.usage_set.values('productusage__product__name').annotate(Sum('productusage__quantity')).order_by('productusage__product__name')
+ #prod_qtys = {}
+ prod_qtys = []
+ for obj in qtys:
+ # FIXME: make sure there are n(==products) entries
+ #prod_qtys['productusage__product__name'] = obj['productusage__quantity__sum']
+ qty = obj['productusage__quantity__sum']
+ if not qty:
+ qty = 0
+ prod_qtys.append(qty)
+ quantities.append({
+ "name": part.get_name(),
+ "number": part.number,
+ "quantities": prod_qtys,
+ "sum": sum(prod_qtys),
+ })
+
+ context = {'products': products, 'parts': parts, 'quantities': quantities, 'len': len(quantities)}
+ return render(request, 'parts/parts.html', context)
+
+
def part_search(request):
if "term" in request.GET:
term = request.GET.get("term", '')