mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Better filtering of annotations for Part-list API
This commit is contained in:
parent
864a21ac85
commit
57123283f4
@ -182,8 +182,6 @@ function loadPartTable(table, url, options={}) {
|
|||||||
searchable: false,
|
searchable: false,
|
||||||
sortable: true,
|
sortable: true,
|
||||||
formatter: function(value, row, index, field) {
|
formatter: function(value, row, index, field) {
|
||||||
console.log("On order:", row.on_order);
|
|
||||||
|
|
||||||
var html = "";
|
var html = "";
|
||||||
var link = "stock";
|
var link = "stock";
|
||||||
|
|
||||||
|
@ -71,11 +71,17 @@ class StockStatus(StatusCode):
|
|||||||
LOST: _("Lost"),
|
LOST: _("Lost"),
|
||||||
}
|
}
|
||||||
|
|
||||||
# The following codes correspond to parts that are 'available'
|
# The following codes correspond to parts that are 'available' or 'in stock'
|
||||||
AVAILABLE_CODES = [
|
AVAILABLE_CODES = [
|
||||||
OK,
|
OK,
|
||||||
ATTENTION,
|
ATTENTION,
|
||||||
DAMAGED
|
DAMAGED,
|
||||||
|
]
|
||||||
|
|
||||||
|
# The following codes correspond to parts that are 'unavailable'
|
||||||
|
UNAVAILABLE_CODES = [
|
||||||
|
DESTROYED,
|
||||||
|
LOST,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ from __future__ import unicode_literals
|
|||||||
from django_filters.rest_framework import DjangoFilterBackend
|
from django_filters.rest_framework import DjangoFilterBackend
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
from django.db.models import Sum, Count
|
from django.db.models import Q, Sum, Count
|
||||||
|
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
@ -25,6 +25,7 @@ from .models import PartParameter, PartParameterTemplate
|
|||||||
|
|
||||||
from . import serializers as part_serializers
|
from . import serializers as part_serializers
|
||||||
|
|
||||||
|
from InvenTree.status_codes import OrderStatus, StockStatus
|
||||||
from InvenTree.views import TreeSerializer
|
from InvenTree.views import TreeSerializer
|
||||||
from InvenTree.helpers import str2bool
|
from InvenTree.helpers import str2bool
|
||||||
|
|
||||||
@ -153,6 +154,15 @@ class PartList(generics.ListCreateAPIView):
|
|||||||
|
|
||||||
queryset = self.filter_queryset(self.get_queryset())
|
queryset = self.filter_queryset(self.get_queryset())
|
||||||
|
|
||||||
|
# Filters for annotations
|
||||||
|
|
||||||
|
# "in_stock" count should only sum stock items which are "in stock"
|
||||||
|
stock_filter = Q(stock_items__status__in=StockStatus.AVAILABLE_CODES)
|
||||||
|
|
||||||
|
# "on_order" items should only sum orders which are currently outstanding
|
||||||
|
order_filter = Q(supplier_parts__purchase_order_line_items__order__status__in=OrderStatus.OPEN)
|
||||||
|
|
||||||
|
# Set of fields we wish to serialize
|
||||||
data = queryset.values(
|
data = queryset.values(
|
||||||
'pk',
|
'pk',
|
||||||
'category',
|
'category',
|
||||||
@ -171,12 +181,12 @@ class PartList(generics.ListCreateAPIView):
|
|||||||
'salable',
|
'salable',
|
||||||
'active',
|
'active',
|
||||||
).annotate(
|
).annotate(
|
||||||
in_stock=Sum('stock_items__quantity'),
|
# Quantity of items which are "in stock"
|
||||||
on_order=Sum('supplier_parts__purchase_order_line_items__quantity'),
|
in_stock=Sum('stock_items__quantity', filter=stock_filter),
|
||||||
|
on_order=Sum('supplier_parts__purchase_order_line_items__quantity', filter=order_filter)
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO - Annotate total being built
|
# TODO - Annotate total being built
|
||||||
# TODO - Annotate total on order
|
|
||||||
|
|
||||||
# Reduce the number of lookups we need to do for the part categories
|
# Reduce the number of lookups we need to do for the part categories
|
||||||
categories = {}
|
categories = {}
|
||||||
|
Loading…
Reference in New Issue
Block a user