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) brand = models.ForeignKey(Brand)
number = models.CharField(max_length=32, unique=True, blank=True, null=True) 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): def __str__(self):
na = self.part.name if self.part else "--(part)--" na = self.part.name if self.part else "--(part)--"
return str(self.number) +": "+ na + " @ " + self.brand.name return str(self.number) +": "+ na + " @ " + self.brand.name
@ -101,4 +104,5 @@ class ProductUsage(PartModel):
internal_note = models.CharField(max_length=2, blank=True) internal_note = models.CharField(max_length=2, blank=True)
def __str__(self): 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.className ="entry";
clone.children[0].children[0].value = document.getElementsByClassName("entry").length + 1 clone.children[0].children[0].value = document.getElementsByClassName("entry").length + 1
document.getElementById("table").appendChild(clone); 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 %} {% load static %}
<script type="text/javascript" src="{% static 'parts/add_sketch.js' %}"> </script> <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> <h1>add sketch to {{product.name}}</h1>
<button type="button" onclick="addRow()">add row</button> <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'^product/(?P<product_id>[0-9]+)/$', views.product, name="detail"),
url(r'^sketch/(?P<sketch_id>[0-9]+)/$', views.sketch, name="sketch"), 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'^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.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.urls import reverse
from django.db import transaction from django.db import transaction
@ -23,6 +24,24 @@ def sketch(request, sketch_id):
context = {'sketch': sketch} context = {'sketch': sketch}
return render(request, 'parts/sketch.html', context) 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 @transaction.atomic
def sketch_add(request, product_id): def sketch_add(request, product_id):
product = get_object_or_404(Product, pk=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) version, _ = Version.objects.get_or_create(product=product, name=first_version)
prod.used_since = version prod.used_since = version
replaced = request.POST.getlist('replaced_by')[i] 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] note = request.POST.getlist('notes')[i]
if len(note): if len(note):
prod.note = 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] internal = request.POST.getlist('internal')[i]
if len(internal): if len(internal):
prod.internal = internal prod.internal = internal