2019-04-27 10:35:14 +00:00
|
|
|
"""
|
2019-04-27 12:49:16 +00:00
|
|
|
JSON API for the Build app
|
2019-04-27 10:35:14 +00:00
|
|
|
"""
|
|
|
|
|
2019-04-15 22:31:43 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
|
|
from django_filters.rest_framework import DjangoFilterBackend
|
|
|
|
from rest_framework import filters
|
|
|
|
from rest_framework import generics, permissions
|
|
|
|
|
2019-04-29 12:59:42 +00:00
|
|
|
from django.conf.urls import url, include
|
2019-04-15 22:31:43 +00:00
|
|
|
|
2020-04-11 09:59:16 +00:00
|
|
|
from InvenTree.helpers import str2bool
|
|
|
|
|
2019-04-29 12:59:42 +00:00
|
|
|
from .models import Build, BuildItem
|
|
|
|
from .serializers import BuildSerializer, BuildItemSerializer
|
2019-04-15 22:31:43 +00:00
|
|
|
|
|
|
|
|
2019-04-27 10:35:14 +00:00
|
|
|
class BuildList(generics.ListCreateAPIView):
|
|
|
|
""" API endpoint for accessing a list of Build objects.
|
|
|
|
|
|
|
|
- GET: Return list of objects (with filters)
|
|
|
|
- POST: Create a new Build object
|
|
|
|
"""
|
2019-04-15 22:31:43 +00:00
|
|
|
|
|
|
|
queryset = Build.objects.all()
|
|
|
|
serializer_class = BuildSerializer
|
|
|
|
|
|
|
|
permission_classes = [
|
2019-07-08 09:20:00 +00:00
|
|
|
permissions.IsAuthenticated,
|
2019-04-15 22:31:43 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
filter_backends = [
|
|
|
|
DjangoFilterBackend,
|
|
|
|
filters.SearchFilter,
|
|
|
|
filters.OrderingFilter,
|
|
|
|
]
|
|
|
|
|
|
|
|
filter_fields = [
|
2020-04-25 03:15:45 +00:00
|
|
|
'sales_order',
|
2019-04-29 12:59:42 +00:00
|
|
|
]
|
|
|
|
|
2020-04-11 10:03:31 +00:00
|
|
|
def get_queryset(self):
|
|
|
|
"""
|
|
|
|
Override the queryset filtering,
|
|
|
|
as some of the fields don't natively play nicely with DRF
|
|
|
|
"""
|
|
|
|
|
2020-04-26 05:29:21 +00:00
|
|
|
queryset = super().get_queryset().prefetch_related('part')
|
|
|
|
|
|
|
|
return queryset
|
|
|
|
|
|
|
|
def filter_queryset(self, queryset):
|
2020-04-11 10:03:31 +00:00
|
|
|
|
|
|
|
# Filter by build status?
|
|
|
|
status = self.request.query_params.get('status', None)
|
|
|
|
|
|
|
|
if status is not None:
|
2020-04-26 05:29:21 +00:00
|
|
|
queryset = queryset.filter(status=status)
|
|
|
|
|
|
|
|
# Filter by associated part?
|
|
|
|
part = self.request.query_params.get('part', None)
|
|
|
|
|
|
|
|
if part is not None:
|
|
|
|
queryset = queryset.filter(part=part)
|
2020-04-11 10:03:31 +00:00
|
|
|
|
2020-04-26 05:29:21 +00:00
|
|
|
return queryset
|
2020-04-11 10:03:31 +00:00
|
|
|
|
2020-04-11 09:59:16 +00:00
|
|
|
def get_serializer(self, *args, **kwargs):
|
|
|
|
|
|
|
|
try:
|
|
|
|
part_detail = str2bool(self.request.GET.get('part_detail', None))
|
|
|
|
except AttributeError:
|
|
|
|
part_detail = None
|
|
|
|
|
|
|
|
kwargs['part_detail'] = part_detail
|
|
|
|
|
|
|
|
return self.serializer_class(*args, **kwargs)
|
|
|
|
|
2019-04-29 12:59:42 +00:00
|
|
|
|
2019-05-23 11:36:54 +00:00
|
|
|
class BuildDetail(generics.RetrieveUpdateAPIView):
|
|
|
|
""" API endpoint for detail view of a Build object """
|
|
|
|
|
|
|
|
queryset = Build.objects.all()
|
|
|
|
serializer_class = BuildSerializer
|
|
|
|
|
|
|
|
permission_classes = [
|
2019-07-08 09:20:00 +00:00
|
|
|
permissions.IsAuthenticated,
|
2019-05-23 11:36:54 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
|
2019-04-29 12:59:42 +00:00
|
|
|
class BuildItemList(generics.ListCreateAPIView):
|
|
|
|
""" API endpoint for accessing a list of BuildItem objects
|
|
|
|
|
|
|
|
- GET: Return list of objects
|
|
|
|
- POST: Create a new BuildItem object
|
|
|
|
"""
|
|
|
|
|
|
|
|
serializer_class = BuildItemSerializer
|
|
|
|
|
2019-04-29 13:45:05 +00:00
|
|
|
def get_queryset(self):
|
|
|
|
""" Override the queryset method,
|
|
|
|
to allow filtering by stock_item.part
|
|
|
|
"""
|
|
|
|
|
|
|
|
query = BuildItem.objects.all()
|
|
|
|
|
2019-05-26 22:07:38 +00:00
|
|
|
query = query.select_related('stock_item')
|
|
|
|
query = query.prefetch_related('stock_item__part')
|
|
|
|
query = query.prefetch_related('stock_item__part__category')
|
|
|
|
|
2020-04-25 11:13:38 +00:00
|
|
|
return query
|
|
|
|
|
|
|
|
def filter_queryset(self, queryset):
|
|
|
|
queryset = super().filter_queryset(queryset)
|
|
|
|
|
|
|
|
# Does the user wish to filter by part?
|
|
|
|
part_pk = self.request.query_params.get('part', None)
|
|
|
|
|
2019-04-29 13:45:05 +00:00
|
|
|
if part_pk:
|
2020-04-25 11:13:38 +00:00
|
|
|
queryset = queryset.filter(stock_item__part=part_pk)
|
2019-04-29 13:45:05 +00:00
|
|
|
|
2020-04-25 11:13:38 +00:00
|
|
|
return queryset
|
2019-04-29 13:45:05 +00:00
|
|
|
|
2019-04-29 12:59:42 +00:00
|
|
|
permission_classes = [
|
2019-07-08 09:20:00 +00:00
|
|
|
permissions.IsAuthenticated,
|
2019-04-29 12:59:42 +00:00
|
|
|
]
|
|
|
|
|
2019-04-29 13:45:05 +00:00
|
|
|
filter_backends = [
|
|
|
|
DjangoFilterBackend,
|
|
|
|
]
|
|
|
|
|
2019-04-29 12:59:42 +00:00
|
|
|
filter_fields = [
|
|
|
|
'build',
|
|
|
|
'stock_item'
|
2019-04-15 22:31:43 +00:00
|
|
|
]
|
|
|
|
|
2019-04-16 12:32:43 +00:00
|
|
|
|
2019-04-29 12:59:42 +00:00
|
|
|
build_item_api_urls = [
|
|
|
|
url('^.*$', BuildItemList.as_view(), name='api-build-item-list'),
|
|
|
|
]
|
|
|
|
|
2019-04-15 22:31:43 +00:00
|
|
|
build_api_urls = [
|
2020-04-25 11:13:38 +00:00
|
|
|
url(r'^item/', include(build_item_api_urls)),
|
2019-04-29 12:59:42 +00:00
|
|
|
|
2019-05-23 11:36:54 +00:00
|
|
|
url(r'^(?P<pk>\d+)/', BuildDetail.as_view(), name='api-build-detail'),
|
|
|
|
|
2019-04-29 12:59:42 +00:00
|
|
|
url(r'^.*$', BuildList.as_view(), name='api-build-list'),
|
2019-04-16 12:32:43 +00:00
|
|
|
]
|