diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index cc61748372..680389272a 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -263,6 +263,7 @@ INSTALLED_APPS = [ 'djmoney.contrib.exchange', # django-money exchange rates 'error_report', # Error reporting in the admin interface 'django_q', + 'formtools', # Form wizard tools ] MIDDLEWARE = CONFIG.get('middleware', [ diff --git a/InvenTree/common/forms.py b/InvenTree/common/forms.py index 84e44f3a31..0ca98ad76a 100644 --- a/InvenTree/common/forms.py +++ b/InvenTree/common/forms.py @@ -5,6 +5,8 @@ Django forms for interacting with common objects # -*- coding: utf-8 -*- from __future__ import unicode_literals +from django import forms + from InvenTree.forms import HelperForm from .models import InvenTreeSetting @@ -21,3 +23,18 @@ class SettingEditForm(HelperForm): fields = [ 'value' ] + + +class UploadFile(forms.Form): + ''' Step 1 ''' + first_name = forms.CharField(max_length=100) + + +class MatchField(forms.Form): + ''' Step 2 ''' + last_name = forms.CharField(max_length=100) + + +class MatchPart(forms.Form): + ''' Step 3 ''' + age = forms.IntegerField() diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index 31d11e30cc..f25760990e 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -8,6 +8,8 @@ from __future__ import unicode_literals from django.utils.translation import ugettext_lazy as _ from django.forms import CheckboxInput, Select +from formtools.wizard.views import SessionWizardView + from InvenTree.views import AjaxUpdateView from InvenTree.helpers import str2bool @@ -101,3 +103,12 @@ class SettingEdit(AjaxUpdateView): if not str2bool(value, test=True) and not str2bool(value, test=False): form.add_error('value', _('Supplied value must be a boolean')) + + +class FileUploadWizardView(SessionWizardView): + # file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT, 'file_uploads')) + form_list = [ + forms.UploadFile, + forms.MatchField, + forms.MatchPart, + ] diff --git a/InvenTree/order/templates/order/po_navbar.html b/InvenTree/order/templates/order/po_navbar.html index eac24d47b3..d49af69c84 100644 --- a/InvenTree/order/templates/order/po_navbar.html +++ b/InvenTree/order/templates/order/po_navbar.html @@ -14,6 +14,12 @@ {% trans "Details" %} +
Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}
+ + +{% endblock %} + +{% block js_ready %} +{{ block.super }} + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/order/urls.py b/InvenTree/order/urls.py index 97903d81c1..9e25c2e870 100644 --- a/InvenTree/order/urls.py +++ b/InvenTree/order/urls.py @@ -17,6 +17,7 @@ purchase_order_detail_urls = [ url(r'^receive/', views.PurchaseOrderReceive.as_view(), name='po-receive'), url(r'^complete/', views.PurchaseOrderComplete.as_view(), name='po-complete'), + url(r'^upload/', views.PurchaseOrderUpload.as_view(), name='po-upload'), url(r'^export/', views.PurchaseOrderExport.as_view(), name='po-export'), url(r'^notes/', views.PurchaseOrderNotes.as_view(), name='po-notes'), diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index 284a24fcf5..d221f7bc02 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -9,6 +9,7 @@ from django.db import transaction from django.shortcuts import get_object_or_404 from django.core.exceptions import ValidationError from django.urls import reverse +from django.http import HttpResponseRedirect from django.utils.translation import ugettext_lazy as _ from django.views.generic import DetailView, ListView, UpdateView from django.views.generic.edit import FormMixin @@ -27,6 +28,7 @@ from stock.models import StockItem, StockLocation from part.models import Part from common.models import InvenTreeSetting +from common.views import FileUploadWizardView from . import forms as order_forms @@ -564,6 +566,24 @@ class SalesOrderShip(AjaxUpdateView): return self.renderJsonResponse(request, form, data, context) +class PurchaseOrderUpload(FileUploadWizardView): + ''' Upload File Wizard View ''' + + template_name = "order/po_upload.html" + + def get_context_data(self, form, **kwargs): + context = super().get_context_data(form=form, **kwargs) + + order = get_object_or_404(PurchaseOrder, pk=self.kwargs['pk']) + + context.update({'order': order}) + + return context + + def done(self, form_list, **kwargs): + return HttpResponseRedirect(reverse('po-detail', kwargs={'pk': self.kwargs['pk']})) + + class PurchaseOrderExport(AjaxView): """ File download for a purchase order diff --git a/requirements.txt b/requirements.txt index 3291574084..beaa30c4fe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -32,5 +32,6 @@ python-barcode[images]==0.13.1 # Barcode generator qrcode[pil]==6.1 # QR code generator django-q==1.3.4 # Background task scheduling gunicorn>=20.0.4 # Gunicorn web server +django-formtools==2.3 # Form wizard tools inventree # Install the latest version of the InvenTree API python library