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
]