mirror of
https://github.com/inventree/InvenTree.git
synced 2025-05-04 22:38:49 +00:00
There shouldn't be any blank lines after the function docstring. Remove the blank lines to fix this issue. Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com>
36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
"""Custom query filters for the Stock models"""
|
|
|
|
from django.db.models import F, Func, IntegerField, OuterRef, Q, Subquery
|
|
from django.db.models.functions import Coalesce
|
|
|
|
import stock.models
|
|
|
|
|
|
def annotate_location_items(filter: Q = None):
|
|
"""Construct a queryset annotation which returns the number of stock items in a particular location.
|
|
|
|
- Includes items in subcategories also
|
|
- Requires subquery to perform annotation
|
|
"""
|
|
# Construct a subquery to provide all items in this location and any sublocations
|
|
subquery = stock.models.StockItem.objects.exclude(location=None).filter(
|
|
location__tree_id=OuterRef('tree_id'),
|
|
location__lft__gte=OuterRef('lft'),
|
|
location__rght__lte=OuterRef('rght'),
|
|
location__level__gte=OuterRef('level'),
|
|
)
|
|
|
|
# Optionally apply extra filter to returned results
|
|
if filter is not None:
|
|
subquery = subquery.filter(filter)
|
|
|
|
return Coalesce(
|
|
Subquery(
|
|
subquery.annotate(
|
|
total=Func(F('pk'), function='COUNT', output_field=IntegerField())
|
|
).values('total')
|
|
),
|
|
0,
|
|
output_field=IntegerField()
|
|
)
|