From 9a8e4d25d23803889228dcd65966a9d994edb18f Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 22 Jul 2019 13:45:09 +1000 Subject: [PATCH] Input serial numbers when creating a new build --- InvenTree/build/forms.py | 3 +++ InvenTree/build/views.py | 38 ++++++++++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/InvenTree/build/forms.py b/InvenTree/build/forms.py index 01024230f4..101903e1e8 100644 --- a/InvenTree/build/forms.py +++ b/InvenTree/build/forms.py @@ -48,11 +48,14 @@ class CompleteBuildForm(HelperForm): help_text='Location of completed parts', ) + serial_numbers = forms.CharField(label='Serial numbers', help_text='Enter unique serial numbers') + confirm = forms.BooleanField(required=False, help_text='Confirm build submission') class Meta: model = Build fields = [ + 'serial_numbers', 'location', 'confirm' ] diff --git a/InvenTree/build/views.py b/InvenTree/build/views.py index 0e7d73d294..9919b35a39 100644 --- a/InvenTree/build/views.py +++ b/InvenTree/build/views.py @@ -5,6 +5,8 @@ Django views for interacting with Build objects # -*- coding: utf-8 -*- from __future__ import unicode_literals +from django.utils.translation import ugettext as _ +from django.core.exceptions import ValidationError from django.views.generic import DetailView, ListView from django.forms import HiddenInput @@ -14,7 +16,7 @@ from . import forms from stock.models import StockLocation, StockItem from InvenTree.views import AjaxUpdateView, AjaxCreateView, AjaxDeleteView -from InvenTree.helpers import str2bool +from InvenTree.helpers import str2bool, ExtractSerialNumbers from InvenTree.status_codes import BuildStatus @@ -182,6 +184,20 @@ class BuildComplete(AjaxUpdateView): ajax_form_title = "Complete Build" ajax_template_name = "build/complete.html" + def get_form(self): + """ Get the form object. + + If the part is trackable, include a field for serial numbers. + """ + build = self.get_object() + + form = super().get_form() + + if not build.part.trackable: + form.fields.pop('serial_numbers') + + return form + def get_initial(self): """ Get initial form data for the CompleteBuild form @@ -206,10 +222,11 @@ class BuildComplete(AjaxUpdateView): - Build information is required """ - build = self.get_object() + build = Build.objects.get(id=self.kwargs['pk']) + context = {} + # Build object - context = super(BuildComplete, self).get_context_data(**kwargs).copy() context['build'] = build # Items to be removed from stock @@ -246,6 +263,19 @@ class BuildComplete(AjaxUpdateView): except StockLocation.DoesNotExist: form.errors['location'] = ['Invalid location selected'] + valid = False + + serials = request.POST.get('serial_numbers', '') + + try: + serials = ExtractSerialNumbers(serials, build.quantity) + + print(serials) + + except ValidationError as e: + form.errors['serial_numbers'] = e.messages + valid = False + if valid: build.completeBuild(location, request.user) @@ -253,7 +283,7 @@ class BuildComplete(AjaxUpdateView): 'form_valid': valid, } - return self.renderJsonResponse(request, form, data) + return self.renderJsonResponse(request, form, data, context=self.get_context_data()) def get_data(self): """ Provide feedback data back to the form """