add autocompletion to part numbers
parent
ea688ac7e0
commit
f9320f9b81
|
|
@ -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)
|
||||
|
|
@ -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
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
]
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue