add autocompletion to part numbers

master
agp8x 2017-10-29 21:57:44 +01:00
parent ea688ac7e0
commit f9320f9b81
8 changed files with 69 additions and 5 deletions

View File

@ -69,6 +69,9 @@ class BrandedPart(PartModel):
brand = models.ForeignKey(Brand)
number = models.CharField(max_length=32, unique=True, blank=True, null=True)
def get_name(self):
return self.part.name if self.part else "--None--"
def __str__(self):
na = self.part.name if self.part else "--(part)--"
return str(self.number) +": "+ na + " @ " + self.brand.name
@ -101,4 +104,5 @@ class ProductUsage(PartModel):
internal_note = models.CharField(max_length=2, blank=True)
def __str__(self):
return "ProductUsage: " + self.product.name + " @ " + str(self.quantity) + "; "+ str(self.usage.part.number)
no = self.usage.part.number if self.usage else "--(part.number)--"
return "ProductUsage: " + self.product.name + " @ " + str(self.quantity) + "; "+ str(no)

View File

@ -5,4 +5,15 @@ function addRow(){
clone.className ="entry";
clone.children[0].children[0].value = document.getElementsByClassName("entry").length + 1
document.getElementById("table").appendChild(clone);
var number = $("input[name|='partnumber']", clone);
number.autocomplete({
source: "/parts/search/part/",
change: function (event, ui){setPartDesc(number, ui);},
delay: 50
});
}
function setPartDesc(target, option){
var part = $("input[name|='name']", event.target.parentNode.parentNode);
part.attr("value", option.item.name);
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,9 @@
{% load static %}
<script type="text/javascript" src="{% static 'parts/add_sketch.js' %}"> </script>
<script type="text/javascript" src="{% static 'parts/jquery-3.2.1.min.js' %}"> </script>
<script src="{% static 'parts/jquery-ui-1.12.1/jquery-ui.min.js' %}" type="text/javascript"></script>
<link rel="stylesheet" href="{% static 'parts/jquery-ui-1.12.1/jquery-ui.min.css' %}" type="text/css" media="all" />
<h1>add sketch to {{product.name}}</h1>
<button type="button" onclick="addRow()">add row</button>

View File

@ -8,4 +8,5 @@ urlpatterns = [
url(r'^product/(?P<product_id>[0-9]+)/$', views.product, name="detail"),
url(r'^sketch/(?P<sketch_id>[0-9]+)/$', views.sketch, name="sketch"),
url(r'^add/(?P<product_id>[0-9]+)/sketch', views.sketch_add, name="new_sketch"),
url(r'^search/part/$', views.part_search, name="part_search"),
]

View File

@ -1,5 +1,6 @@
import json
from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse
from django.db import transaction
@ -23,6 +24,24 @@ def sketch(request, sketch_id):
context = {'sketch': sketch}
return render(request, 'parts/sketch.html', context)
def part_search(request):
if "term" in request.GET:
term = request.GET.get("term", '')
parts = BrandedPart.objects.filter(number__startswith=term)
return HttpResponse(
json.dumps(
[
{
'id':part.id,
'label':part.number + " - " + part.get_name(),
'value':part.number,
'name':part.get_name()
}
for part in parts],
indent=1)
)
return HttpResponse("404")
@transaction.atomic
def sketch_add(request, product_id):
product = get_object_or_404(Product, pk=product_id)
@ -71,12 +90,13 @@ def sketch_add(request, product_id):
version, _ = Version.objects.get_or_create(product=product, name=first_version)
prod.used_since = version
replaced = request.POST.getlist('replaced_by')[i]
if len(replaced):
replacement, _ = ProductUsage.objects.get_or_create(product=product, usage__part__number=replaced)
prod.replaced_by = replacement
note = request.POST.getlist('notes')[i]
if len(note):
prod.note = note
if len(replaced):
#replacement, _ = ProductUsage.objects.get_or_create(product=product, usage__part__number=replaced)
#prod.replaced_by = replacement
prod.note+= "{REP:"+str(replaced)+"}"
internal = request.POST.getlist('internal')[i]
if len(internal):
prod.internal = internal