From 7d21c4ef1c61f867baede7777b20e7560380cf0d Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 2 May 2018 23:42:57 +1000 Subject: [PATCH] BOM now uses DRF / ajax --- InvenTree/part/api.py | 26 ++++++++- InvenTree/part/serializers.py | 23 +++++++- InvenTree/part/templates/part/bom.html | 77 ++++++++++++++++---------- InvenTree/static/script/tables.js | 8 +++ 4 files changed, 103 insertions(+), 31 deletions(-) diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index 7e6660f737..1083caf3a6 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -7,8 +7,8 @@ from rest_framework import generics, permissions from django.conf.urls import url -from .models import Part, PartCategory -from .serializers import PartSerializer +from .models import Part, PartCategory, BomItem +from .serializers import PartSerializer, BomItemSerializer from InvenTree.views import TreeSerializer @@ -49,9 +49,31 @@ class PartList(generics.ListCreateAPIView): ] +class BomList(generics.ListAPIView): + + queryset = BomItem.objects.all() + serializer_class = BomItemSerializer + + permission_classes = [ + permissions.IsAuthenticatedOrReadOnly, + ] + + filter_backends = [ + DjangoFilterBackend, + filters.SearchFilter, + filters.OrderingFilter, + ] + + filter_fields = [ + 'part', + 'sub_part' + ] + + part_api_urls = [ url(r'^tree/?', PartCategoryTree.as_view(), name='api-part-tree'), + url(r'^bom/?', BomList.as_view(), name='api-bom-list'), url(r'^.*$', PartList.as_view(), name='api-part-list'), ] diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 5a8c78c211..5812c40d99 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from .models import Part, PartCategory +from .models import Part, PartCategory, BomItem class CategoryBriefSerializer(serializers.ModelSerializer): @@ -12,6 +12,7 @@ class CategoryBriefSerializer(serializers.ModelSerializer): fields = [ 'pk', 'name', + 'description', 'pathstring', 'url', ] @@ -27,6 +28,7 @@ class PartBriefSerializer(serializers.ModelSerializer): 'pk', 'url', 'name', + 'description', ] @@ -35,6 +37,7 @@ class PartSerializer(serializers.ModelSerializer): Used when displaying all details of a single component. """ + url = serializers.CharField(source='get_absolute_url', read_only=True) category = CategoryBriefSerializer(many=False, read_only=True) class Meta: @@ -55,3 +58,21 @@ class PartSerializer(serializers.ModelSerializer): 'trackable', 'salable', ] + + +class BomItemSerializer(serializers.ModelSerializer): + + url = serializers.CharField(source='get_absolute_url', read_only=True) + + part = PartBriefSerializer(many=False, read_only=True) + sub_part = PartBriefSerializer(many=False, read_only=True) + + class Meta: + model = BomItem + fields = [ + 'pk', + 'url', + 'part', + 'sub_part', + 'quantity' + ] \ No newline at end of file diff --git a/InvenTree/part/templates/part/bom.html b/InvenTree/part/templates/part/bom.html index 3b08de3f08..ba4b80e408 100644 --- a/InvenTree/part/templates/part/bom.html +++ b/InvenTree/part/templates/part/bom.html @@ -11,30 +11,7 @@

Bill of Materials

- - - - - - - - - - -{% for bom_item in part.bom_items.all %} -{% with sub_part=bom_item.sub_part %} - - - - - - -{% endwith %} -{% endfor %} - +
PartDescriptionQuantity
{{ sub_part.name }}{{ sub_part.description }}{{ bom_item.quantity }} - - -
@@ -47,8 +24,8 @@ {% endblock %} {% block js_ready %} - - $('#bom-table').on('click', '.delete-row-button', function () { + + $('#bom-table').on('click', '.delete-button', function () { var button = $(this); launchDeleteForm("#modal-delete", @@ -58,11 +35,14 @@ }); }); - $('#bom-table').on('click', '.edit-row-button', function () { + $("#bom-table").on('click', '.edit-button', function () { var button = $(this); launchModalForm("#modal-form", - button.attr('url')); + button.attr('url'), + { + reload: true + }); }); @@ -76,4 +56,45 @@ } }); }); + + $("#bom-table").bootstrapTable({ + sortable: true, + search: true, + queryParams: function(p) { + return { + part: {{ part.id }} + } + }, + columns: [ + { + field: 'pk', + title: 'ID', + visible: false, + }, + { + field: 'sub_part', + title: 'Part', + sortable: true, + formatter: function(value, row, index, field) { + return renderLink(value.name, value.url); + } + }, + { + field: 'sub_part.description', + title: 'Description', + }, + { + field: 'quantity', + title: 'Quantity', + searchable: false, + sortable: true + }, + { + formatter: function(value, row, index, field) { + return editButton(row.url + 'edit') + ' ' + deleteButton(row.url + 'delete'); + } + } + ], + url: "{% url 'api-bom-list' %}" + }); {% endblock %} \ No newline at end of file diff --git a/InvenTree/static/script/tables.js b/InvenTree/static/script/tables.js index 755acd8511..366bdbfe22 100644 --- a/InvenTree/static/script/tables.js +++ b/InvenTree/static/script/tables.js @@ -1,3 +1,11 @@ +function editButton(url, text='Edit') { + return ""; +} + +function deleteButton(url, text='Delete') { + return ""; +} + function renderLink(text, url) { if (text && url) { return '' + text + '';