Add 'location_detail' filter

This commit is contained in:
Oliver Walters 2021-02-18 00:36:51 +11:00
parent 77df82c46d
commit 228349bea6
4 changed files with 102 additions and 1 deletions

View File

@ -442,6 +442,7 @@ class SOAllocationList(generics.ListCreateAPIView):
kwargs['part_detail'] = str2bool(params.get('part_detail', False)) kwargs['part_detail'] = str2bool(params.get('part_detail', False))
kwargs['item_detail'] = str2bool(params.get('item_detail', False)) kwargs['item_detail'] = str2bool(params.get('item_detail', False))
kwargs['order_detail'] = str2bool(params.get('order_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) return self.serializer_class(*args, **kwargs)

View File

@ -17,7 +17,7 @@ from InvenTree.serializers import InvenTreeAttachmentSerializerField
from company.serializers import CompanyBriefSerializer, SupplierPartSerializer from company.serializers import CompanyBriefSerializer, SupplierPartSerializer
from part.serializers import PartBriefSerializer from part.serializers import PartBriefSerializer
from stock.serializers import StockItemSerializer from stock.serializers import StockItemSerializer, LocationSerializer
from .models import PurchaseOrder, PurchaseOrderLineItem from .models import PurchaseOrder, PurchaseOrderLineItem
from .models import PurchaseOrderAttachment, SalesOrderAttachment from .models import PurchaseOrderAttachment, SalesOrderAttachment
@ -237,17 +237,20 @@ class SalesOrderAllocationSerializer(InvenTreeModelSerializer):
order = serializers.PrimaryKeyRelatedField(source='line.order', many=False, read_only=True) order = serializers.PrimaryKeyRelatedField(source='line.order', many=False, read_only=True)
serial = serializers.CharField(source='get_serial', read_only=True) serial = serializers.CharField(source='get_serial', read_only=True)
quantity = serializers.FloatField(read_only=True) quantity = serializers.FloatField(read_only=True)
location = serializers.PrimaryKeyRelatedField(source='item.location', many=False, read_only=True)
# Extra detail fields # Extra detail fields
order_detail = SalesOrderSerializer(source='line.order', many=False, read_only=True) order_detail = SalesOrderSerializer(source='line.order', many=False, read_only=True)
part_detail = PartBriefSerializer(source='item.part', 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) 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): def __init__(self, *args, **kwargs):
order_detail = kwargs.pop('order_detail', False) order_detail = kwargs.pop('order_detail', False)
part_detail = kwargs.pop('part_detail', False) part_detail = kwargs.pop('part_detail', False)
item_detail = kwargs.pop('item_detail', False) item_detail = kwargs.pop('item_detail', False)
location_detail = kwargs.pop('location_detail', False)
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
@ -260,6 +263,9 @@ class SalesOrderAllocationSerializer(InvenTreeModelSerializer):
if not item_detail: if not item_detail:
self.fields.pop('item_detail') self.fields.pop('item_detail')
if not location_detail:
self.fields.pop('location_detail')
class Meta: class Meta:
model = SalesOrderAllocation model = SalesOrderAllocation
@ -268,6 +274,8 @@ class SalesOrderAllocationSerializer(InvenTreeModelSerializer):
'line', 'line',
'serial', 'serial',
'quantity', 'quantity',
'location',
'location_detail',
'item', 'item',
'item_detail', 'item_detail',
'order', 'order',

View File

@ -9,6 +9,10 @@
<h4>{% trans "Part Stock Allocations" %}</h4> <h4>{% trans "Part Stock Allocations" %}</h4>
<table class='table table-striped table-condensed' id='build-order-table'></table>
<table class='table table-striped table-condensed' id='sales-order-table'></table>
<table class='table table-striped table-condensed' id='build-table'> <table class='table table-striped table-condensed' id='build-table'>
<tr> <tr>
<th>{% trans "Order" %}</th> <th>{% trans "Order" %}</th>
@ -35,6 +39,12 @@
{% block js_ready %} {% block js_ready %}
loadSalesOrderAllocationTable("#sales-order-table", {
params: {
part: {{ part.id }},
}
});
$("#build-table").inventreeTable({ $("#build-table").inventreeTable({
columns: [ columns: [
{ {

View File

@ -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" %}',
}
]
});
}