From 78ceb5edbc0a7e76d2dcccc489f1ab6eee2d84c8 Mon Sep 17 00:00:00 2001 From: agp8x Date: Sat, 16 Nov 2019 12:48:46 +0100 Subject: [PATCH 1/3] improve input: * auto-guess figure number * tabindex to exclude rarely used fields --- docker-compose.yml | 2 +- partdoc/parts/static/parts/add_sketch.js | 23 ++++++++++++++++++++++- partdoc/parts/templates/parts/add.html | 11 ++++++----- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b45a374..046c13b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ services: env_file: postgres.env volumes: - ./partdoc/:/app/ - - ./sketches/:/app/sketches/ + #- ./sketches/:/app/sketches/ working_dir: /app command: python3 ./manage.py runserver 0.0.0.0:8000 ports: diff --git a/partdoc/parts/static/parts/add_sketch.js b/partdoc/parts/static/parts/add_sketch.js index f82f9a3..173355a 100644 --- a/partdoc/parts/static/parts/add_sketch.js +++ b/partdoc/parts/static/parts/add_sketch.js @@ -12,6 +12,8 @@ function addRow(){ clone.children[0].children[0].value = fignumber; document.getElementById("table").appendChild(clone); + var tabables = $("input[tabindex|='-1']", clone); + tabables.attr("tabindex", $('#table > tr').length); var number = $("input[name|='partnumber']", clone); number.autocomplete({ @@ -19,8 +21,27 @@ function addRow(){ change: function (event, ui){setPartDesc(number, ui);}, delay: 50 }); + + var fig = $("input[name|='fignumber']", clone); + fig.focus(function() { + var prev = fig.parent().parent().prev("tr"); + if (prev.length && parseInt(fig.val())) { + var rawnumber = prev[0].children[0].children[0].value; + var prevnumber = parseInt(rawnumber.split(" ").pop()); + if (prevnumber){ + var fignumber = prevnumber + 1; + fig.val(fignumber); + console.log(fignumber); + }else{ + console.log("failed to parse int: " + rawnumber); + } + }else{ + console.log("failed to load prev"); + } + }); + $("button")[0].innerHTML = $('#table > tr').length; } function setPartDesc(target, option){ var part = $("input[name|='name']", event.target.parentNode.parentNode); part.attr("value", option.item.name); -} \ No newline at end of file +} diff --git a/partdoc/parts/templates/parts/add.html b/partdoc/parts/templates/parts/add.html index 834b553..763430f 100644 --- a/partdoc/parts/templates/parts/add.html +++ b/partdoc/parts/templates/parts/add.html @@ -13,6 +13,7 @@

add sketch to {{ product.name }}

{% csrf_token %} +

@@ -50,15 +51,15 @@
- - + + - - + +
- \ No newline at end of file + From f23d76b1014cce75be0b892da78f74268f5780e4 Mon Sep 17 00:00:00 2001 From: agp8x Date: Sat, 16 Nov 2019 12:51:57 +0100 Subject: [PATCH 2/3] repair entry count on addRowButton --- partdoc/parts/static/parts/add_sketch.js | 2 +- partdoc/parts/templates/parts/add.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/partdoc/parts/static/parts/add_sketch.js b/partdoc/parts/static/parts/add_sketch.js index 173355a..942abee 100644 --- a/partdoc/parts/static/parts/add_sketch.js +++ b/partdoc/parts/static/parts/add_sketch.js @@ -39,7 +39,7 @@ function addRow(){ console.log("failed to load prev"); } }); - $("button")[0].innerHTML = $('#table > tr').length; + $("#addRowBtn")[0].innerHTML = $('#table > tr').length; } function setPartDesc(target, option){ var part = $("input[name|='name']", event.target.parentNode.parentNode); diff --git a/partdoc/parts/templates/parts/add.html b/partdoc/parts/templates/parts/add.html index 763430f..746698d 100644 --- a/partdoc/parts/templates/parts/add.html +++ b/partdoc/parts/templates/parts/add.html @@ -16,7 +16,7 @@

- + From 03a17839bee6e0bc193a1466d33c1541e8a4683f Mon Sep 17 00:00:00 2001 From: agp8x Date: Wed, 4 Dec 2019 01:10:36 +0100 Subject: [PATCH 3/3] add parts list --- partdoc/parts/templates/parts/parts.html | 28 ++++++++++++++++++++++++ partdoc/parts/urls.py | 1 + partdoc/parts/views.py | 27 +++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 partdoc/parts/templates/parts/parts.html 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

+ +
Bild-Nr.
+ + + + {% for product in products %} + + {% endfor %} + + + +{% for part in quantities %} + + + + {% for product in part.quantities %} + + {% endfor %} + + +{% endfor %} + + + + + +
Teil-Nr.Teilbezeichnung{{product.name}}Summe
{{part.number}}{{part.name}}{{product}}{{part.sum}}
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", '')