PEP fixes

This commit is contained in:
Oliver 2021-10-05 00:45:49 +11:00
parent 40f1ccf9f8
commit dd4db6442e
7 changed files with 17 additions and 129 deletions

View File

@ -7,13 +7,10 @@ from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _
from django.db import transaction
from django.conf.urls import url, include
from django.core.exceptions import ValidationError as DjangoValidationError
from rest_framework import filters, generics, serializers, status
from rest_framework import filters, generics
from rest_framework.serializers import ValidationError
from rest_framework.response import Response
from django_filters.rest_framework import DjangoFilterBackend
from django_filters import rest_framework as rest_filters
@ -195,7 +192,7 @@ class BuildAllocate(generics.CreateAPIView):
- Items to allocate are specified as a list called "items" with the following options:
- bom_item: pk value of a given BomItem object (must match the part associated with this build)
- stock_item: pk value of a given StockItem object
- quantity: quantity to allocate
- quantity: quantity to allocate
- output: StockItem (build order output) to allocate stock against (optional)
"""

View File

@ -585,86 +585,6 @@ class Build(MPTTModel):
self.status = BuildStatus.CANCELLED
self.save()
def getAutoAllocations(self):
"""
Return a list of StockItem objects which will be allocated
using the 'AutoAllocate' function.
For each item in the BOM for the attached Part,
the following tests must *all* evaluate to True,
for the part to be auto-allocated:
- The sub_item in the BOM line must *not* be trackable
- There is only a single stock item available (which has not already been allocated to this build)
- The stock item has an availability greater than zero
Returns:
A list object containing the StockItem objects to be allocated (and the quantities).
Each item in the list is a dict as follows:
{
'stock_item': stock_item,
'quantity': stock_quantity,
}
"""
allocations = []
"""
Iterate through each item in the BOM
"""
for bom_item in self.bom_items:
part = bom_item.sub_part
# If the part is "trackable" it cannot be auto-allocated
if part.trackable:
continue
# Skip any parts which are already fully allocated
if self.isPartFullyAllocated(part, None):
continue
# How many parts are required to complete the output?
required = self.unallocatedQuantity(part, None)
# Grab a list of stock items which are available
stock_items = self.availableStockItems(part, None)
# Ensure that the available stock items are in the correct location
if self.take_from is not None:
# Filter for stock that is located downstream of the designated location
stock_items = stock_items.filter(location__in=[loc for loc in self.take_from.getUniqueChildren()])
# Only one StockItem to choose from? Default to that one!
if stock_items.count() == 1:
stock_item = stock_items[0]
# Double check that we have not already allocated this stock-item against this build
build_items = BuildItem.objects.filter(
build=self,
stock_item=stock_item,
)
if len(build_items) > 0:
continue
# How many items are actually available?
if stock_item.quantity > 0:
# Only take as many as are available
if stock_item.quantity < required:
required = stock_item.quantity
allocation = {
'stock_item': stock_item,
'quantity': required,
}
allocations.append(allocation)
return allocations
@transaction.atomic
def unallocateOutput(self, output, part=None):
"""
@ -804,37 +724,6 @@ class Build(MPTTModel):
# Remove the build output from the database
output.delete()
@transaction.atomic
def autoAllocate(self):
"""
Run auto-allocation routine to allocate StockItems to this Build.
Args:
output: If specified, only auto-allocate against the given built output
Returns a list of dict objects with keys like:
{
'stock_item': item,
'quantity': quantity,
}
See: getAutoAllocations()
"""
allocations = self.getAutoAllocations()
for item in allocations:
# Create a new allocation
build_item = BuildItem(
build=self,
stock_item=item['stock_item'],
quantity=item['quantity'],
install_into=None
)
build_item.save()
@transaction.atomic
def subtractUntrackedStock(self, user):
"""

View File

@ -23,7 +23,7 @@ import InvenTree.helpers
from stock.models import StockItem
from stock.serializers import StockItemSerializerBrief, LocationSerializer
from part.models import Part, BomItem
from part.models import BomItem
from part.serializers import PartSerializer, PartBriefSerializer
from users.serializers import OwnerSerializer
@ -197,7 +197,7 @@ class BuildAllocationItemSerializer(serializers.Serializer):
quantity = data['quantity']
output = data.get('output', None)
build = self.context['build']
# build = self.context['build']
# TODO: Check that the "stock item" is valid for the referenced "sub_part"
# Note: Because of allow_variants options, it may not be a direct match!
@ -224,7 +224,7 @@ class BuildAllocationItemSerializer(serializers.Serializer):
raise ValidationError({
'output': _('Build output cannot be specified for allocation of untracked parts')
})
})
return data
@ -271,7 +271,7 @@ class BuildAllocationSerializer(serializers.Serializer):
output = item.get('output', None)
# Create a new BuildItem to allocate stock
build_item = BuildItem.objects.create(
BuildItem.objects.create(
build=build,
bom_item=bom_item,
stock_item=stock_item,

View File

@ -418,10 +418,14 @@ function reloadTable() {
{% if build.active %}
$("#btn-auto-allocate").on('click', function() {
launchModalForm(
"{% url 'build-auto-allocate' build.id %}",
allocateStockToBuild(
{{ build.pk }},
{{ build.part.pk }},
{
success: reloadTable,
success: function(data) {
$('#allocation-table-untracked').bootstrapTable('refresh');
}
}
);
});

View File

@ -76,7 +76,6 @@ class BuildAllocationTest(BuildAPITest):
# No items yet allocated to this build
self.assertEqual(self.build.allocated_stock.count(), 0)
def test_get(self):
"""
A GET request to the endpoint should return an error
@ -120,7 +119,7 @@ class BuildAllocationTest(BuildAPITest):
def test_missing(self):
"""
Test with missing data
"""
"""
# Missing quantity
data = self.post(
@ -200,7 +199,7 @@ class BuildAllocationTest(BuildAPITest):
This should result in creation of a new BuildItem object
"""
data = self.post(
self.post(
self.url,
{
"items": [
@ -212,7 +211,7 @@ class BuildAllocationTest(BuildAPITest):
]
},
expected_code=201
).data
)
# A new BuildItem should have been created
self.assertEqual(self.n + 1, BuildItem.objects.count())

View File

@ -567,7 +567,6 @@ class BuildDelete(AjaxDeleteView):
ajax_form_title = _('Delete Build Order')
class BuildItemCreate(AjaxCreateView):
"""
View for allocating a StockItem to a build output.

View File

@ -276,7 +276,7 @@ class POReceiveSerializer(serializers.Serializer):
help_text=_('Select destination location for received items'),
)
def validate(self, data):
def validate(self, data):
super().validate(data)