diff --git a/InvenTree/order/templates/order/order_select_parts.html b/InvenTree/order/templates/order/order_wizard/select_parts.html similarity index 83% rename from InvenTree/order/templates/order/order_select_parts.html rename to InvenTree/order/templates/order/order_wizard/select_parts.html index 4191010df5..0e77fe4796 100644 --- a/InvenTree/order/templates/order/order_select_parts.html +++ b/InvenTree/order/templates/order/order_wizard/select_parts.html @@ -34,19 +34,22 @@
- {% for supplier in part.supplier_parts.all %} - + {% endfor %}
+ {% if not part.order_supplier %} +
Select a supplier for {{ part.name }} + {% endif %}
- +
diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index e836e49b9e..079ac51756 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -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- : The ID of the selected supplier + - quantity- : 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