From 228349bea615ecc45eacc22bd3cc06df5dcf45bb Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 18 Feb 2021 00:36:51 +1100 Subject: [PATCH] Add 'location_detail' filter --- InvenTree/order/api.py | 1 + InvenTree/order/serializers.py | 10 ++- InvenTree/part/templates/part/allocation.html | 10 +++ InvenTree/templates/js/order.js | 82 +++++++++++++++++++ 4 files changed, 102 insertions(+), 1 deletion(-) diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index 1b376e9a32..54a88f19be 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -442,6 +442,7 @@ class SOAllocationList(generics.ListCreateAPIView): kwargs['part_detail'] = str2bool(params.get('part_detail', False)) kwargs['item_detail'] = str2bool(params.get('item_detail', False)) kwargs['order_detail'] = str2bool(params.get('order_detail', False)) + kwargs['location_detail'] = str2bool(params.get('location_detail', False)) return self.serializer_class(*args, **kwargs) diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index d9d6143253..aa6b05fe39 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -17,7 +17,7 @@ from InvenTree.serializers import InvenTreeAttachmentSerializerField from company.serializers import CompanyBriefSerializer, SupplierPartSerializer from part.serializers import PartBriefSerializer -from stock.serializers import StockItemSerializer +from stock.serializers import StockItemSerializer, LocationSerializer from .models import PurchaseOrder, PurchaseOrderLineItem from .models import PurchaseOrderAttachment, SalesOrderAttachment @@ -237,17 +237,20 @@ class SalesOrderAllocationSerializer(InvenTreeModelSerializer): order = serializers.PrimaryKeyRelatedField(source='line.order', many=False, read_only=True) serial = serializers.CharField(source='get_serial', read_only=True) quantity = serializers.FloatField(read_only=True) + location = serializers.PrimaryKeyRelatedField(source='item.location', many=False, read_only=True) # Extra detail fields order_detail = SalesOrderSerializer(source='line.order', many=False, read_only=True) part_detail = PartBriefSerializer(source='item.part', many=False, read_only=True) item_detail = StockItemSerializer(source='item', many=False, read_only=True) + location_detail = LocationSerializer(source='item.location', many=False, read_only=True) def __init__(self, *args, **kwargs): order_detail = kwargs.pop('order_detail', False) part_detail = kwargs.pop('part_detail', False) item_detail = kwargs.pop('item_detail', False) + location_detail = kwargs.pop('location_detail', False) super().__init__(*args, **kwargs) @@ -260,6 +263,9 @@ class SalesOrderAllocationSerializer(InvenTreeModelSerializer): if not item_detail: self.fields.pop('item_detail') + if not location_detail: + self.fields.pop('location_detail') + class Meta: model = SalesOrderAllocation @@ -268,6 +274,8 @@ class SalesOrderAllocationSerializer(InvenTreeModelSerializer): 'line', 'serial', 'quantity', + 'location', + 'location_detail', 'item', 'item_detail', 'order', diff --git a/InvenTree/part/templates/part/allocation.html b/InvenTree/part/templates/part/allocation.html index e574742ad5..93acf6ec4a 100644 --- a/InvenTree/part/templates/part/allocation.html +++ b/InvenTree/part/templates/part/allocation.html @@ -9,6 +9,10 @@

{% trans "Part Stock Allocations" %}

+
+ +
+ @@ -35,6 +39,12 @@ {% block js_ready %} + loadSalesOrderAllocationTable("#sales-order-table", { + params: { + part: {{ part.id }}, + } + }); + $("#build-table").inventreeTable({ columns: [ { diff --git a/InvenTree/templates/js/order.js b/InvenTree/templates/js/order.js index 53063cd709..fcaf54ef63 100644 --- a/InvenTree/templates/js/order.js +++ b/InvenTree/templates/js/order.js @@ -304,3 +304,85 @@ function loadSalesOrderTable(table, options) { ], }); } + + +function loadSalesOrderAllocationTable(table, options={}) { + /** + * Load a table with SalesOrderAllocation items + */ + + options.params = options.params || {}; + + options.params['location_detail'] = true; + options.params['part_detail'] = true; + options.params['item_detail'] = true; + options.params['order_detail'] = true; + + var filters = loadTableFilters("salesorderallocation"); + + for (var key in options.params) { + filters[key] = options.params[key]; + } + + setupFilterList("salesorderallocation", $(table)); + + $(table).inventreeTable({ + url: '{% url "api-so-allocation-list" %}', + queryParams: filters, + name: 'salesorderallocation', + groupBy: false, + original: options.params, + formatNoMatches: function() { return '{% trans "No sales order allocations found" %}'; }, + columns: [ + { + field: 'pk', + visible: false, + switchable: false, + }, + { + field: 'order', + title: '{% trans "Order" %}', + switchable: false, + formatter: function(value, row) { + + var prefix = "{% settings_value 'SALESORDER_REFERENCE_PREFIX' %}"; + + var ref = `${prefix}${row.order_detail.reference}`; + + return renderLink(ref, `/order/sales-order/${row.order}/`); + } + }, + { + field: 'item', + title: '{% trans "Stock Item" %}', + formatter: function(value, row) { + // Render a link to the particular stock item + + var link = `/stock/item/${row.item}/`; + var text = `{% trans "Stock Item" %} ${row.item}`; + + return renderLink(text, link); + } + }, + { + field: 'location', + title: '{% trans "Location" %}', + formatter: function(value, row) { + + if (!value) { + return '{% trans "Location not specified" %}'; + } + + var link = `/stock/location/${value}`; + var text = row.location_detail.description; + + return renderLink(text, link); + } + }, + { + field: 'quantity', + title: '{% trans "Quantity" %}', + } + ] + }); +} \ No newline at end of file
{% trans "Order" %}