Refactor various functions for assessing build allocation

This commit is contained in:
Oliver Walters 2021-04-20 13:54:19 +10:00
parent 05e2b62305
commit 4420557863
3 changed files with 34 additions and 18 deletions

View File

@ -790,12 +790,13 @@ class Build(MPTTModel):
# List the allocated BuildItem objects for the given output
allocated_items = output.items_to_install.all()
# Ensure that only "trackable" parts are installed in the particular build output
allocated_items = allocated_items.filter(part__trackable=True)
for build_item in allocated_items:
# TODO: This is VERY SLOW as each deletion from the database takes ~1 second to complete
# TODO: Use celery / redis to offload the actual object deletion...
# REF: https://www.botreetechnologies.com/blog/implementing-celery-using-django-for-background-task-processing
# REF: https://code.tutsplus.com/tutorials/using-celery-with-django-for-background-task-processing--cms-28732
# TODO: Use the background worker process to handle this task!
# Complete the allocation of stock for that item
build_item.complete_allocation(user)
@ -899,7 +900,13 @@ class Build(MPTTModel):
Returns True if the particular build output is fully allocated.
"""
for bom_item in self.bom_items:
# If output is not specified, we are talking about "untracked" items
if output is None:
bom_items = self.untracked_bom_items
else:
bom_items = self.tracked_bom_items
for bom_item in bom_items:
part = bom_item.sub_part
if not self.isPartFullyAllocated(part, output):
@ -915,7 +922,13 @@ class Build(MPTTModel):
allocated = []
for bom_item in self.bom_items:
# If output is not specified, we are talking about "untracked" items
if output is None:
bom_items = self.untracked_bom_items
else:
bom_items = self.tracked_bom_items
for bom_item in bom_items:
part = bom_item.sub_part
if self.isPartFullyAllocated(part, output):
@ -930,17 +943,15 @@ class Build(MPTTModel):
unallocated = []
for bom_item in self.bom_items:
# If output is not specified, we are talking about "untracked" items
if output is None:
bom_items = self.untracked_bom_items
else:
bom_items = self.tracked_bom_items
for bom_item in bom_items:
part = bom_item.sub_part
# Ignore "trackable" when output is specified
if output and not part.trackable:
continue
# Ignore "untrackable" parts when output is not specified
if not output and part.trackable:
continue
if not self.isPartFullyAllocated(part, output):
unallocated.append(part)

View File

@ -4,9 +4,10 @@
{% block pre_form_content %}
{% if fully_allocated %}
<div class='alert alert-block alert-info'>
<h4>{% trans "Stock allocation is complete" %}</h4>
{% if not build.has_tracked_bom_items %}
{% elif fully_allocated %}
<div class='alert alert-block alert-success'>
{% trans "Stock allocation is complete for this output" %}
</div>
{% else %}
<div class='alert alert-block alert-danger'>
@ -41,7 +42,11 @@
</div>
<div class='panel-content'>
{% include "hover_image.html" with image=build.part.image hover=True %}
{% if output.serialized %}
{{ output.part.full_name }} - {% trans "Serial Number" %} {{ output.serial }}
{% else %}
{% decimal output.quantity %} x {{ output.part.full_name }}
{% endif %}
</div>
</div>

View File

@ -419,7 +419,7 @@ class BuildOutputComplete(AjaxUpdateView):
View to mark a particular build output as Complete.
- Notifies the user of which parts will be removed from stock.
- Removes allocated items from stock
- Assignes (tracked) allocated items from stock to the build output
- Deletes pending BuildItem objects
"""