diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index f9d3399eae..54719ef17e 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -97,6 +97,10 @@ class Build(models.Model): notes = MarkdownxField(blank=True, help_text=_('Extra build notes')) + @property + def output_count(self): + return self.build_outputs.count() + @transaction.atomic def cancelBuild(self, user): """ Mark the Build as CANCELLED @@ -235,7 +239,7 @@ class Build(models.Model): now=str(datetime.now().date()) ) - if self.part.trackable: + if self.part.trackable and serial_numbers: # Add new serial numbers for serial in serial_numbers: item = StockItem.objects.create( diff --git a/InvenTree/build/templates/build/build_base.html b/InvenTree/build/templates/build/build_base.html index 3ab3fc05c0..d1842cd384 100644 --- a/InvenTree/build/templates/build/build_base.html +++ b/InvenTree/build/templates/build/build_base.html @@ -90,6 +90,10 @@ InvenTree | Build - {{ build }} {% endblock %} +{% block js_load %} + +{% endblock %} + {% block js_ready %} $("#build-edit").click(function () { diff --git a/InvenTree/build/templates/build/build_output.html b/InvenTree/build/templates/build/build_output.html new file mode 100644 index 0000000000..f35672bf79 --- /dev/null +++ b/InvenTree/build/templates/build/build_output.html @@ -0,0 +1,32 @@ +{% extends "build/build_base.html" %} +{% load static %} +{% load i18n %} + +{% block details %} + +{% include "build/tabs.html" with tab='output' %} + +

{% trans "Build Outputs" %}

+
+ +{% include "stock_table.html" %} + +{% endblock %} + +{% block js_ready %} +{{ block.super }} + +loadStockTable($("#stock-table"), { + params: { + location_detail: true, + part_details: true, + build: {{ build.id }}, + }, + groupByField: 'location', + buttons: [ + '#stock-options', + ], + url: "{% url 'api-stock-list' %}", +}); + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/build/templates/build/tabs.html b/InvenTree/build/templates/build/tabs.html index e9f63cc05b..552bac7408 100644 --- a/InvenTree/build/templates/build/tabs.html +++ b/InvenTree/build/templates/build/tabs.html @@ -4,6 +4,9 @@ {% trans "Details" %} + + {% trans "Outputs" %}{% if build.output_count > 0%}{{ build.output_count }}{% endif %} + {% trans "Notes" %}{% if build.notes %} {% endif %} diff --git a/InvenTree/build/urls.py b/InvenTree/build/urls.py index 6fa7a3c304..5d23c55a2d 100644 --- a/InvenTree/build/urls.py +++ b/InvenTree/build/urls.py @@ -26,6 +26,9 @@ build_detail_urls = [ url(r'^unallocate/', views.BuildUnallocate.as_view(), name='build-unallocate'), url(r'^notes/', views.BuildNotes.as_view(), name='build-notes'), + + url(r'^output/', views.BuildDetail.as_view(template_name='build/build_output.html'), name='build-output'), + url(r'^.*$', views.BuildDetail.as_view(), name='build-detail'), ] diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 8cd349c213..45d5b02dd4 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -260,6 +260,8 @@ class StockList(generics.ListCreateAPIView): - ancestor: Filter by an 'ancestor' StockItem """ + queryset = StockItem.objects.all() + def get_serializer(self, *args, **kwargs): try: @@ -334,7 +336,9 @@ class StockList(generics.ListCreateAPIView): """ # Start with all objects - stock_list = StockItem.objects.filter(customer=None, belongs_to=None) + stock_list = super(StockList, self).get_queryset() + + stock_list = stock_list.filter(customer=None, belongs_to=None) # Does the client wish to filter by the Part ID? part_id = self.request.query_params.get('part', None) @@ -426,6 +430,7 @@ class StockList(generics.ListCreateAPIView): 'supplier_part', 'customer', 'belongs_to', + 'build', # 'status' TODO - There are some issues filtering based on an enumeration field ]