Better filtering of annotations for Part-list API

This commit is contained in:
Oliver Walters 2020-03-26 17:08:01 +11:00
parent 864a21ac85
commit 57123283f4
3 changed files with 23 additions and 9 deletions

View File

@ -182,8 +182,6 @@ function loadPartTable(table, url, options={}) {
searchable: false,
sortable: true,
formatter: function(value, row, index, field) {
console.log("On order:", row.on_order);
var html = "";
var link = "stock";

View File

@ -71,11 +71,17 @@ class StockStatus(StatusCode):
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 = [
OK,
ATTENTION,
DAMAGED
DAMAGED,
]
# The following codes correspond to parts that are 'unavailable'
UNAVAILABLE_CODES = [
DESTROYED,
LOST,
]

View File

@ -8,7 +8,7 @@ from __future__ import unicode_literals
from django_filters.rest_framework import DjangoFilterBackend
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.response import Response
@ -25,6 +25,7 @@ from .models import PartParameter, PartParameterTemplate
from . import serializers as part_serializers
from InvenTree.status_codes import OrderStatus, StockStatus
from InvenTree.views import TreeSerializer
from InvenTree.helpers import str2bool
@ -153,6 +154,15 @@ class PartList(generics.ListCreateAPIView):
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(
'pk',
'category',
@ -171,12 +181,12 @@ class PartList(generics.ListCreateAPIView):
'salable',
'active',
).annotate(
in_stock=Sum('stock_items__quantity'),
on_order=Sum('supplier_parts__purchase_order_line_items__quantity'),
# Quantity of items which are "in stock"
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 on order
# Reduce the number of lookups we need to do for the part categories
categories = {}