mirror of
https://github.com/inventree/InvenTree.git
synced 2025-07-01 03:00:54 +00:00
Stock installed items (#5030)
* Cleanup * Add "installed_items" count to StockItem serializer - Add queryset annotation - Add API filter for list endpoint * js code * More js updates * Load installed items on demand * Make option configurable
This commit is contained in:
@ -510,6 +510,15 @@ class StockFilter(rest_filters.FilterSet):
|
||||
else:
|
||||
return queryset.filter(belongs_to=None)
|
||||
|
||||
has_installed_items = rest_filters.BooleanFilter(label='Has installed items', method='filter_has_installed')
|
||||
|
||||
def filter_has_installed(self, queryset, name, value):
|
||||
"""Filter stock items by "belongs_to" field being empty."""
|
||||
if str2bool(value):
|
||||
return queryset.filter(installed_items__gt=0)
|
||||
else:
|
||||
return queryset.filter(installed_items=0)
|
||||
|
||||
sent_to_customer = rest_filters.BooleanFilter(label='Sent to customer', method='filter_sent_to_customer')
|
||||
|
||||
def filter_sent_to_customer(self, queryset, name, value):
|
||||
|
@ -133,14 +133,12 @@ class StockItemSerializer(InvenTree.serializers.InvenTreeTagModelSerializer):
|
||||
|
||||
model = StockItem
|
||||
fields = [
|
||||
'allocated',
|
||||
'batch',
|
||||
'belongs_to',
|
||||
'build',
|
||||
'consumed_by',
|
||||
'customer',
|
||||
'delete_on_deplete',
|
||||
'expired',
|
||||
'expiry_date',
|
||||
'is_building',
|
||||
'link',
|
||||
@ -158,13 +156,11 @@ class StockItemSerializer(InvenTree.serializers.InvenTreeTagModelSerializer):
|
||||
'sales_order',
|
||||
'sales_order_reference',
|
||||
'serial',
|
||||
'stale',
|
||||
'status',
|
||||
'status_text',
|
||||
'stocktake_date',
|
||||
'supplier_part',
|
||||
'supplier_part_detail',
|
||||
'tracking_items',
|
||||
'barcode_hash',
|
||||
'updated',
|
||||
'purchase_price',
|
||||
@ -172,6 +168,13 @@ class StockItemSerializer(InvenTree.serializers.InvenTreeTagModelSerializer):
|
||||
'use_pack_size',
|
||||
'tests',
|
||||
|
||||
# Annotated fields
|
||||
'allocated',
|
||||
'expired',
|
||||
'installed_items',
|
||||
'stale',
|
||||
'tracking_items',
|
||||
|
||||
'tags',
|
||||
]
|
||||
|
||||
@ -282,6 +285,11 @@ class StockItemSerializer(InvenTree.serializers.InvenTreeTagModelSerializer):
|
||||
)
|
||||
)
|
||||
|
||||
# Annotate with the total number of "installed items"
|
||||
queryset = queryset.annotate(
|
||||
installed_items=SubqueryCount('installed_parts')
|
||||
)
|
||||
|
||||
return queryset
|
||||
|
||||
status_text = serializers.CharField(source='get_status_display', read_only=True)
|
||||
@ -295,10 +303,11 @@ class StockItemSerializer(InvenTree.serializers.InvenTreeTagModelSerializer):
|
||||
quantity = InvenTreeDecimalField()
|
||||
|
||||
# Annotated fields
|
||||
tracking_items = serializers.IntegerField(read_only=True, required=False)
|
||||
allocated = serializers.FloatField(required=False)
|
||||
expired = serializers.BooleanField(required=False, read_only=True)
|
||||
installed_items = serializers.IntegerField(read_only=True, required=False)
|
||||
stale = serializers.BooleanField(required=False, read_only=True)
|
||||
tracking_items = serializers.IntegerField(read_only=True, required=False)
|
||||
|
||||
purchase_price = InvenTree.serializers.InvenTreeMoneySerializer(
|
||||
label=_('Purchase Price'),
|
||||
|
Reference in New Issue
Block a user