mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
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:
parent
c9b946655c
commit
15432fd6b7
@ -34,19 +34,22 @@
|
|||||||
<td>
|
<td>
|
||||||
<div class='control-group'>
|
<div class='control-group'>
|
||||||
<div class='controls'>
|
<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>
|
<option value=''>---------</option>
|
||||||
{% for supplier in part.supplier_parts.all %}
|
{% 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 %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
{% if not part.order_supplier %}
|
||||||
|
<br><span class='help-inline'>Select a supplier for <i>{{ part.name }}</i></span>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class='control-group'>
|
<div class='control-group'>
|
||||||
<div class='controls'>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
@ -151,7 +151,7 @@ class OrderParts(AjaxView):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
ajax_form_title = "Order Parts"
|
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
|
# List of Parts we wish to order
|
||||||
parts = []
|
parts = []
|
||||||
@ -160,7 +160,7 @@ class OrderParts(AjaxView):
|
|||||||
|
|
||||||
ctx = {}
|
ctx = {}
|
||||||
|
|
||||||
ctx['parts'] = self.get_parts()
|
ctx['parts'] = sorted(self.parts, key=lambda part: part.order_quantity, reverse=True)
|
||||||
|
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
@ -228,13 +228,20 @@ class OrderParts(AjaxView):
|
|||||||
for id in part_ids:
|
for id in part_ids:
|
||||||
try:
|
try:
|
||||||
part = Part.objects.get(id=id)
|
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:
|
except Part.DoesNotExist:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
self.parts.append(part)
|
self.parts.append(part)
|
||||||
|
|
||||||
return sorted(self.parts, key=lambda part: part.quantity_to_order, reverse=True)
|
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
|
|
||||||
self.request = request
|
self.request = request
|
||||||
@ -246,6 +253,12 @@ class OrderParts(AjaxView):
|
|||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
|
|
||||||
self.request = request
|
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 = {
|
data = {
|
||||||
'form_valid': False,
|
'form_valid': False,
|
||||||
@ -253,6 +266,64 @@ class OrderParts(AjaxView):
|
|||||||
|
|
||||||
return self.renderJsonResponse(request, data=data)
|
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):
|
class POLineItemCreate(AjaxCreateView):
|
||||||
""" AJAX view for creating a new PurchaseOrderLineItem object
|
""" AJAX view for creating a new PurchaseOrderLineItem object
|
||||||
|
Loading…
Reference in New Issue
Block a user