Handle list of parts sent back to the order-parts form

- Eliminate parts which are zero quantity
- Display an error message when no supplier is selected
This commit is contained in:
Oliver Walters 2019-06-13 19:10:31 +10:00
parent c9b946655c
commit 15432fd6b7
2 changed files with 81 additions and 7 deletions

View File

@ -34,19 +34,22 @@
<td>
<div class='control-group'>
<div class='controls'>
<select class='select' id='id_supplier_part_{{ part.id }}' name="part_select_{{ part.id }}">
<select class='select' id='id_supplier_part_{{ part.id }}' name="supplier-{{ part.id }}">
<option value=''>---------</option>
{% for supplier in part.supplier_parts.all %}
<option value="{{ supplier.id }}"{% if part.get_default_supplier and part.get_default_supplier.id == supplier.id %} selected="selected"{% endif %}>{{ supplier }}</option>
<option value="{{ supplier.id }}"{% if part.order_supplier == supplier.id %} selected="selected"{% endif %}>{{ supplier }}</option>
{% endfor %}
</select>
</div>
{% if not part.order_supplier %}
<br><span class='help-inline'>Select a supplier for <i>{{ part.name }}</i></span>
{% endif %}
</div>
</td>
<td>
<div class='control-group'>
<div class='controls'>
<input class='numberinput' type='number' min='0' value='{{ part.quantity_to_order }}' name='part_quantity_{{ part.id }}'/>
<input class='numberinput' type='number' min='0' value='{{ part.order_quantity }}' name='quantity-{{ part.id }}'/>
</div>
</div>
</td>

View File

@ -151,7 +151,7 @@ class OrderParts(AjaxView):
"""
ajax_form_title = "Order Parts"
ajax_template_name = 'order/order_select_parts.html'
ajax_template_name = 'order/order_wizard/select_parts.html'
# List of Parts we wish to order
parts = []
@ -160,7 +160,7 @@ class OrderParts(AjaxView):
ctx = {}
ctx['parts'] = self.get_parts()
ctx['parts'] = sorted(self.parts, key=lambda part: part.order_quantity, reverse=True)
return ctx
@ -228,13 +228,20 @@ class OrderParts(AjaxView):
for id in part_ids:
try:
part = Part.objects.get(id=id)
# Pre-fill the 'order quantity' value
part.order_quantity = part.quantity_to_order
default_supplier = part.get_default_supplier()
if default_supplier:
part.order_supplier = default_supplier.id
else:
part.order_supplier = None
except Part.DoesNotExist:
continue
self.parts.append(part)
return sorted(self.parts, key=lambda part: part.quantity_to_order, reverse=True)
def get(self, request, *args, **kwargs):
self.request = request
@ -246,6 +253,12 @@ class OrderParts(AjaxView):
def post(self, request, *args, **kwargs):
self.request = request
form_step = request.POST.get('form_step')
if form_step == 'select_parts':
return self.handlePartSelection()
elif form_step == 'assign_orders':
return self.handleOrderAssignment()
data = {
'form_valid': False,
@ -253,6 +266,64 @@ class OrderParts(AjaxView):
return self.renderJsonResponse(request, data=data)
def handlePartSelection(self):
""" Handle the POST action for part selection.
- Validates each part / quantity / supplier / etc
Part selection form contains the following fields for each part:
- supplier-<pk> : The ID of the selected supplier
- quantity-<pk> : The quantity to add to the order
"""
self.parts = []
for item in self.request.POST:
if item.startswith('supplier-'):
pk = item.replace('supplier-', '')
# Check that the part actually exists
try:
part = Part.objects.get(id=pk)
except (Part.DoesNotExist, ValueError):
continue
supplier_part_id = self.request.POST[item]
quantity = self.request.POST.get('quantity-' + str(pk), 0)
# Ensure a valid supplier has been passed
try:
supplier_part = SupplierPart.objects.get(id=supplier_part_id)
except (SupplierPart.DoesNotExist, ValueError):
supplier_part = None
print('Error getting supplier part for ID', supplier_part_id)
# Ensure a valid quantity is passed
try:
q = int(quantity)
# Ignore any parts for which the selected quantity is zero
if q <= 0:
continue
except ValueError:
quantity = part.quantity_to_order
part.order_supplier = supplier_part.id if supplier_part else None
part.order_quantity = quantity
self.parts.append(part)
print(part.name, part.order_supplier, part.order_quantity)
data = {
'form_valid': False,
}
return self.renderJsonResponse(self.request, data=data)
class POLineItemCreate(AjaxCreateView):
""" AJAX view for creating a new PurchaseOrderLineItem object