mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Add 'location_detail' filter
This commit is contained in:
parent
77df82c46d
commit
228349bea6
@ -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)
|
||||||
|
|
||||||
|
@ -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',
|
||||||
|
@ -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: [
|
||||||
{
|
{
|
||||||
|
@ -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" %}',
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user