InvenTree/InvenTree/part/api.py

286 lines
6.7 KiB
Python
Raw Normal View History

2019-04-27 12:18:07 +00:00
"""
Provides a JSON API for the Part app
"""
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
2018-04-23 11:18:35 +00:00
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters
2019-04-13 23:25:46 +00:00
from rest_framework import generics, permissions
from django.db.models import Q
2018-05-04 13:54:57 +00:00
from django.conf.urls import url, include
from django.shortcuts import get_object_or_404
2018-05-02 13:42:57 +00:00
from .models import Part, PartCategory, BomItem
from .models import SupplierPart, SupplierPriceBreak
2018-05-02 13:42:57 +00:00
from .serializers import PartSerializer, BomItemSerializer
from .serializers import SupplierPartSerializer, SupplierPriceBreakSerializer
2018-05-04 13:54:57 +00:00
from .serializers import CategorySerializer
from InvenTree.views import TreeSerializer
2019-04-13 23:25:46 +00:00
class PartCategoryTree(TreeSerializer):
title = "Parts"
model = PartCategory
2018-05-04 13:54:57 +00:00
class CategoryList(generics.ListCreateAPIView):
2019-04-27 12:18:07 +00:00
""" API endpoint for accessing a list of PartCategory objects.
- GET: Return a list of PartCategory objects
- POST: Create a new PartCategory object
"""
2018-05-04 13:54:57 +00:00
queryset = PartCategory.objects.all()
serializer_class = CategorySerializer
permission_classes = [
permissions.IsAuthenticatedOrReadOnly,
]
filter_backends = [
DjangoFilterBackend,
2019-04-13 23:25:46 +00:00
# filters.SearchFilter,
2018-05-04 13:54:57 +00:00
filters.OrderingFilter,
]
filter_fields = [
'parent',
]
ordering_fields = [
'name',
]
ordering = 'name'
search_fields = [
'name',
'description',
]
class CategoryDetail(generics.RetrieveUpdateDestroyAPIView):
2019-04-27 12:18:07 +00:00
""" API endpoint for detail view of a single PartCategory object """
serializer_class = CategorySerializer
queryset = PartCategory.objects.all()
class PartDetail(generics.RetrieveUpdateDestroyAPIView):
2019-04-27 12:18:07 +00:00
""" API endpoint for detail view of a single Part object """
queryset = Part.objects.all()
serializer_class = PartSerializer
permission_classes = [
permissions.IsAuthenticatedOrReadOnly,
]
2019-04-13 23:25:46 +00:00
class PartList(generics.ListCreateAPIView):
2019-04-27 12:18:07 +00:00
""" API endpoint for accessing a list of Part objects
- GET: Return list of objects
- POST: Create a new Part object
"""
serializer_class = PartSerializer
2018-04-15 15:02:17 +00:00
def get_queryset(self):
# Does the user wish to filter by category?
cat_id = self.request.query_params.get('category', None)
2019-04-15 12:39:28 +00:00
# Start with all objects
parts_list = Part.objects.all()
if cat_id:
category = get_object_or_404(PartCategory, pk=cat_id)
# Filter by the supplied category
flt = Q(category=cat_id)
if self.request.query_params.get('include_child_categories', None):
childs = category.getUniqueChildren()
for child in childs:
2019-04-14 02:30:06 +00:00
# Ignore the top-level category (already filtered)
if str(child) == str(cat_id):
2019-04-14 02:30:06 +00:00
continue
flt |= Q(category=child)
2019-04-15 12:39:28 +00:00
parts_list = parts_list.filter(flt)
2019-04-14 02:30:06 +00:00
2019-04-15 12:39:28 +00:00
return parts_list
permission_classes = [
permissions.IsAuthenticatedOrReadOnly,
]
filter_backends = [
DjangoFilterBackend,
filters.SearchFilter,
filters.OrderingFilter,
]
filter_fields = [
'buildable',
'consumable',
'trackable',
'purchaseable',
'salable',
]
ordering_fields = [
'name',
]
ordering = 'name'
2018-04-23 11:18:35 +00:00
search_fields = [
2019-04-16 22:19:40 +00:00
'$name',
2018-04-23 11:18:35 +00:00
'description',
]
class BomList(generics.ListCreateAPIView):
2019-04-27 12:18:07 +00:00
""" API endpoing for accessing a list of BomItem objects
- GET: Return list of BomItem objects
- POST: Create a new BomItem object
"""
2018-05-02 13:42:57 +00:00
queryset = BomItem.objects.all()
serializer_class = BomItemSerializer
permission_classes = [
permissions.IsAuthenticatedOrReadOnly,
]
filter_backends = [
DjangoFilterBackend,
filters.SearchFilter,
filters.OrderingFilter,
]
filter_fields = [
'part',
'sub_part'
]
class BomDetail(generics.RetrieveUpdateDestroyAPIView):
2019-04-27 12:18:07 +00:00
""" API endpoint for detail view of a single BomItem object """
queryset = BomItem.objects.all()
serializer_class = BomItemSerializer
permission_classes = [
permissions.IsAuthenticatedOrReadOnly,
]
class SupplierPartList(generics.ListCreateAPIView):
2019-04-27 12:18:07 +00:00
""" API endpoint for list view of SupplierPart object
- GET: Return list of SupplierPart objects
- POST: Create a new SupplierPart object
"""
queryset = SupplierPart.objects.all()
serializer_class = SupplierPartSerializer
permission_classes = [
permissions.IsAuthenticatedOrReadOnly,
]
filter_backends = [
DjangoFilterBackend,
filters.SearchFilter,
filters.OrderingFilter,
]
filter_fields = [
'part',
'supplier'
]
2018-05-04 13:54:57 +00:00
2019-04-25 13:56:03 +00:00
class SupplierPartDetail(generics.RetrieveUpdateDestroyAPIView):
2019-04-27 12:18:07 +00:00
""" API endpoint for detail view of SupplierPart object
- GET: Retrieve detail view
- PATCH: Update object
- DELETE: Delete objec
"""
2019-04-25 13:56:03 +00:00
queryset = SupplierPart.objects.all()
serializer_class = SupplierPartSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
read_only_fields = [
]
class SupplierPriceBreakList(generics.ListCreateAPIView):
2019-04-27 15:09:48 +00:00
""" API endpoint for list view of SupplierPriceBreak object
2019-04-27 12:18:07 +00:00
- GET: Retrieve list of SupplierPriceBreak objects
- POST: Create a new SupplierPriceBreak object
"""
queryset = SupplierPriceBreak.objects.all()
serializer_class = SupplierPriceBreakSerializer
permission_classes = [
permissions.IsAuthenticatedOrReadOnly,
]
filter_backends = [
DjangoFilterBackend,
]
filter_fields = [
'part',
]
2019-04-13 23:25:46 +00:00
cat_api_urls = [
url(r'^(?P<pk>\d+)/?', CategoryDetail.as_view(), name='api-part-category-detail'),
2018-05-04 13:54:57 +00:00
url(r'^$', CategoryList.as_view(), name='api-part-category-list'),
]
2019-04-25 13:56:03 +00:00
supplier_part_api_urls = [
url(r'^(?P<pk>\d+)/?', SupplierPartDetail.as_view(), name='api-supplier-part-detail'),
# Catch anything else
url(r'^.*$', SupplierPartList.as_view(), name='api-part-supplier-list'),
]
part_api_urls = [
url(r'^tree/?', PartCategoryTree.as_view(), name='api-part-tree'),
2018-05-04 13:54:57 +00:00
url(r'^category/', include(cat_api_urls)),
url(r'^supplier/', include(supplier_part_api_urls)),
2018-05-04 13:54:57 +00:00
url(r'^price-break/?', SupplierPriceBreakList.as_view(), name='api-part-supplier-price'),
url(r'^(?P<pk>\d+)/', PartDetail.as_view(), name='api-part-detail'),
url(r'^.*$', PartList.as_view(), name='api-part-list'),
]
bom_api_urls = [
# BOM Item Detail
2019-04-27 04:50:49 +00:00
url('^(?P<pk>\d+)/', BomDetail.as_view(), name='api-bom-detail'),
# Catch-all
url(r'^.*$', BomList.as_view(), name='api-bom-list'),
]