Adds skeleton for new API endpoint for completing a build order

This commit is contained in:
Oliver Walters 2022-01-07 10:50:29 +11:00
parent 8597ae89b6
commit 960784644f
3 changed files with 57 additions and 17 deletions

View File

@ -18,8 +18,7 @@ from InvenTree.filters import InvenTreeOrderingFilter
from InvenTree.status_codes import BuildStatus from InvenTree.status_codes import BuildStatus
from .models import Build, BuildItem, BuildOrderAttachment from .models import Build, BuildItem, BuildOrderAttachment
from .serializers import BuildAttachmentSerializer, BuildCompleteSerializer, BuildSerializer, BuildItemSerializer import build.serializers
from .serializers import BuildAllocationSerializer, BuildUnallocationSerializer
from users.models import Owner from users.models import Owner
@ -80,7 +79,7 @@ class BuildList(generics.ListCreateAPIView):
""" """
queryset = Build.objects.all() queryset = Build.objects.all()
serializer_class = BuildSerializer serializer_class = build.serializers.BuildSerializer
filterset_class = BuildFilter filterset_class = BuildFilter
filter_backends = [ filter_backends = [
@ -119,7 +118,7 @@ class BuildList(generics.ListCreateAPIView):
queryset = super().get_queryset().select_related('part') queryset = super().get_queryset().select_related('part')
queryset = BuildSerializer.annotate_queryset(queryset) queryset = build.serializers.BuildSerializer.annotate_queryset(queryset)
return queryset return queryset
@ -203,7 +202,7 @@ class BuildDetail(generics.RetrieveUpdateAPIView):
""" API endpoint for detail view of a Build object """ """ API endpoint for detail view of a Build object """
queryset = Build.objects.all() queryset = Build.objects.all()
serializer_class = BuildSerializer serializer_class = build.serializers.BuildSerializer
class BuildUnallocate(generics.CreateAPIView): class BuildUnallocate(generics.CreateAPIView):
@ -217,7 +216,7 @@ class BuildUnallocate(generics.CreateAPIView):
queryset = Build.objects.none() queryset = Build.objects.none()
serializer_class = BuildUnallocationSerializer serializer_class = build.serializers.BuildUnallocationSerializer
def get_serializer_context(self): def get_serializer_context(self):
@ -233,14 +232,14 @@ class BuildUnallocate(generics.CreateAPIView):
return ctx return ctx
class BuildComplete(generics.CreateAPIView): class BuildOutputComplete(generics.CreateAPIView):
""" """
API endpoint for completing build outputs API endpoint for completing build outputs
""" """
queryset = Build.objects.none() queryset = Build.objects.none()
serializer_class = BuildCompleteSerializer serializer_class = build.serializers.BuildOutputCompleteSerializer
def get_serializer_context(self): def get_serializer_context(self):
ctx = super().get_serializer_context() ctx = super().get_serializer_context()
@ -255,6 +254,27 @@ class BuildComplete(generics.CreateAPIView):
return ctx return ctx
class BuildFinish(generics.CreateAPIView):
"""
API endpoint for marking a build as finished (completed)
"""
queryset = Build.objects.none()
serializer_class = build.serializers.BuildCompleteSerializer
def get_serializer_context(self):
ctx = super().get_serializer_context()
ctx['request'] = self.request
try:
ctx['build'] = Build.objects.get(pk=self.kwargs.get('pk', None))
except:
pass
return ctx
class BuildAllocate(generics.CreateAPIView): class BuildAllocate(generics.CreateAPIView):
""" """
API endpoint to allocate stock items to a build order API endpoint to allocate stock items to a build order
@ -269,7 +289,7 @@ class BuildAllocate(generics.CreateAPIView):
queryset = Build.objects.none() queryset = Build.objects.none()
serializer_class = BuildAllocationSerializer serializer_class = build.serializers.BuildAllocationSerializer
def get_serializer_context(self): def get_serializer_context(self):
""" """
@ -294,7 +314,7 @@ class BuildItemDetail(generics.RetrieveUpdateDestroyAPIView):
""" """
queryset = BuildItem.objects.all() queryset = BuildItem.objects.all()
serializer_class = BuildItemSerializer serializer_class = build.serializers.BuildItemSerializer
class BuildItemList(generics.ListCreateAPIView): class BuildItemList(generics.ListCreateAPIView):
@ -304,7 +324,7 @@ class BuildItemList(generics.ListCreateAPIView):
- POST: Create a new BuildItem object - POST: Create a new BuildItem object
""" """
serializer_class = BuildItemSerializer serializer_class = build.serializers.BuildItemSerializer
def get_serializer(self, *args, **kwargs): def get_serializer(self, *args, **kwargs):
@ -373,7 +393,7 @@ class BuildAttachmentList(generics.ListCreateAPIView, AttachmentMixin):
""" """
queryset = BuildOrderAttachment.objects.all() queryset = BuildOrderAttachment.objects.all()
serializer_class = BuildAttachmentSerializer serializer_class = build.serializers.BuildAttachmentSerializer
filter_backends = [ filter_backends = [
DjangoFilterBackend, DjangoFilterBackend,
@ -390,7 +410,7 @@ class BuildAttachmentDetail(generics.RetrieveUpdateDestroyAPIView, AttachmentMix
""" """
queryset = BuildOrderAttachment.objects.all() queryset = BuildOrderAttachment.objects.all()
serializer_class = BuildAttachmentSerializer serializer_class = build.serializers.BuildAttachmentSerializer
build_api_urls = [ build_api_urls = [
@ -410,7 +430,8 @@ build_api_urls = [
# Build Detail # Build Detail
url(r'^(?P<pk>\d+)/', include([ url(r'^(?P<pk>\d+)/', include([
url(r'^allocate/', BuildAllocate.as_view(), name='api-build-allocate'), url(r'^allocate/', BuildAllocate.as_view(), name='api-build-allocate'),
url(r'^complete/', BuildComplete.as_view(), name='api-build-complete'), url(r'^complete/', BuildOutputComplete.as_view(), name='api-build-output-complete'),
url(r'^finish/', BuildFinish.as_view(), name='api-build-finish'),
url(r'^unallocate/', BuildUnallocate.as_view(), name='api-build-unallocate'), url(r'^unallocate/', BuildUnallocate.as_view(), name='api-build-unallocate'),
url(r'^.*$', BuildDetail.as_view(), name='api-build-detail'), url(r'^.*$', BuildDetail.as_view(), name='api-build-detail'),
])), ])),

View File

@ -165,7 +165,7 @@ class BuildOutputSerializer(serializers.Serializer):
] ]
class BuildCompleteSerializer(serializers.Serializer): class BuildOutputCompleteSerializer(serializers.Serializer):
""" """
DRF serializer for completing one or more build outputs DRF serializer for completing one or more build outputs
""" """
@ -240,6 +240,25 @@ class BuildCompleteSerializer(serializers.Serializer):
) )
class BuildCompleteSerializer(serializers.Serializer):
"""
DRF serializer for marking a BuildOrder as complete
"""
accept_unallocated = serializers.BooleanField(
label=_('Accept Unallocated'),
help_text=_('Accept that stock items have not been fully allocated to this build order'),
)
accept_incomplete = serializers.BooleanField(
label=_('Accept Incomplete'),
help_text=_('Accept that the required number of build outputs have not been completed'),
)
def save(self):
pass
class BuildUnallocationSerializer(serializers.Serializer): class BuildUnallocationSerializer(serializers.Serializer):
""" """
DRF serializer for unallocating stock from a BuildOrder DRF serializer for unallocating stock from a BuildOrder

View File

@ -49,7 +49,7 @@ class BuildCompleteTest(BuildAPITest):
self.build = Build.objects.get(pk=1) self.build = Build.objects.get(pk=1)
self.url = reverse('api-build-complete', kwargs={'pk': self.build.pk}) self.url = reverse('api-build-output-complete', kwargs={'pk': self.build.pk})
def test_invalid(self): def test_invalid(self):
""" """
@ -58,7 +58,7 @@ class BuildCompleteTest(BuildAPITest):
# Test with an invalid build ID # Test with an invalid build ID
self.post( self.post(
reverse('api-build-complete', kwargs={'pk': 99999}), reverse('api-build-output-complete', kwargs={'pk': 99999}),
{}, {},
expected_code=400 expected_code=400
) )