mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Update BOM API to allow filtering by "uses"
This commit is contained in:
parent
56ebe1596c
commit
1f997d07b6
@ -12,11 +12,16 @@ import common.models
|
|||||||
INVENTREE_SW_VERSION = "0.6.0 dev"
|
INVENTREE_SW_VERSION = "0.6.0 dev"
|
||||||
|
|
||||||
# InvenTree API version
|
# InvenTree API version
|
||||||
INVENTREE_API_VERSION = 17
|
INVENTREE_API_VERSION = 18
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Increment this API version number whenever there is a significant change to the API that any clients need to know about
|
Increment this API version number whenever there is a significant change to the API that any clients need to know about
|
||||||
|
|
||||||
|
v18 -> 2021-11-15
|
||||||
|
- Adds the ability to filter BomItem API by "uses" field
|
||||||
|
- This returns a list of all BomItems which "use" the specified part
|
||||||
|
- Includes inherited BomItem objects
|
||||||
|
|
||||||
v17 -> 2021-11-09
|
v17 -> 2021-11-09
|
||||||
- Adds API endpoints for GLOBAL and USER settings objects
|
- Adds API endpoints for GLOBAL and USER settings objects
|
||||||
- Ref: https://github.com/inventree/InvenTree/pull/2275
|
- Ref: https://github.com/inventree/InvenTree/pull/2275
|
||||||
|
@ -832,18 +832,6 @@ class PartList(generics.ListCreateAPIView):
|
|||||||
|
|
||||||
queryset = super().filter_queryset(queryset)
|
queryset = super().filter_queryset(queryset)
|
||||||
|
|
||||||
# Filter by "uses" query - Limit to parts which use the provided part
|
|
||||||
uses = params.get('uses', None)
|
|
||||||
|
|
||||||
if uses:
|
|
||||||
try:
|
|
||||||
uses = Part.objects.get(pk=uses)
|
|
||||||
|
|
||||||
queryset = queryset.filter(uses.get_used_in_filter())
|
|
||||||
|
|
||||||
except (ValueError, Part.DoesNotExist):
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Exclude specific part ID values?
|
# Exclude specific part ID values?
|
||||||
exclude_id = []
|
exclude_id = []
|
||||||
|
|
||||||
@ -1211,6 +1199,54 @@ class BomList(generics.ListCreateAPIView):
|
|||||||
except (ValueError, Part.DoesNotExist):
|
except (ValueError, Part.DoesNotExist):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
"""
|
||||||
|
Filter by 'uses'?
|
||||||
|
|
||||||
|
Here we pass a part ID and return BOM items for any assemblies which "use" (or "require") that part.
|
||||||
|
|
||||||
|
There are multiple ways that an assembly can "use" a sub-part:
|
||||||
|
|
||||||
|
A) Directly specifying the sub_part in a BomItem field
|
||||||
|
B) Specifing a "template" part with inherited=True
|
||||||
|
C) Allowing variant parts to be substituted
|
||||||
|
D) Allowing direct substitute parts to be specified
|
||||||
|
|
||||||
|
- BOM items which are "inherited" by parts which are variants of the master BomItem
|
||||||
|
"""
|
||||||
|
uses = params.get('uses', None)
|
||||||
|
|
||||||
|
if uses is not None:
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Extract the part we are interested in
|
||||||
|
uses_part = Part.objects.get(pk=uses)
|
||||||
|
|
||||||
|
# Construct the database query in multiple parts
|
||||||
|
|
||||||
|
# A) Direct specification of sub_part
|
||||||
|
q_A = Q(sub_part=uses_part)
|
||||||
|
|
||||||
|
# B) BomItem is inherited and points to a "parent" of this part
|
||||||
|
parents = uses_part.get_ancestors(include_self=False)
|
||||||
|
|
||||||
|
q_B = Q(
|
||||||
|
inherited=True,
|
||||||
|
sub_part__in=parents
|
||||||
|
)
|
||||||
|
|
||||||
|
# C) Substitution of variant parts
|
||||||
|
# TODO
|
||||||
|
|
||||||
|
# D) Specification of individual substitutes
|
||||||
|
# TODO
|
||||||
|
|
||||||
|
q = q_A | q_B
|
||||||
|
|
||||||
|
queryset = queryset.filter(q)
|
||||||
|
|
||||||
|
except (ValueError, Part.DoesNotExist):
|
||||||
|
pass
|
||||||
|
|
||||||
if self.include_pricing():
|
if self.include_pricing():
|
||||||
queryset = self.annotate_pricing(queryset)
|
queryset = self.annotate_pricing(queryset)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user