From faf8b9f2f0a6d2c3ff62bb5f5f0c2f37ea611a9b Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 8 Sep 2019 22:37:27 +1000 Subject: [PATCH] Form / view for downloading stocktake info --- InvenTree/stock/forms.py | 31 +++++++++++++++++ InvenTree/stock/templates/stock/location.html | 19 +++++++++++ InvenTree/stock/urls.py | 1 + InvenTree/stock/views.py | 33 +++++++++++++++++++ 4 files changed, 84 insertions(+) diff --git a/InvenTree/stock/forms.py b/InvenTree/stock/forms.py index 6ad25ff279..fe9de3cac2 100644 --- a/InvenTree/stock/forms.py +++ b/InvenTree/stock/forms.py @@ -96,6 +96,37 @@ class SerializeStockForm(forms.ModelForm): ] +class ExportOptionsForm(HelperForm): + """ Form for selecting stock export options """ + + file_format = forms.ChoiceField(label=_('File Format'), help_text=_('Select output file format')) + + include_sublocations = forms.BooleanField(required=False, initial=True, help_text=_("Include stock items in sub locations")) + + class Meta: + model = StockLocation + fields = [ + 'file_format', + 'include_sublocations', + ] + + def get_format_choices(self): + """ File format choices """ + + choices = [ + ('csv', 'CSV'), + ('xls', 'XLS'), + ('xlsx', 'XLSX'), + ] + + return choices + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.fields['file_format'].choices = self.get_format_choices() + + class AdjustStockForm(forms.ModelForm): """ Form for performing simple stock adjustments. diff --git a/InvenTree/stock/templates/stock/location.html b/InvenTree/stock/templates/stock/location.html index 604b91e758..cad986c097 100644 --- a/InvenTree/stock/templates/stock/location.html +++ b/InvenTree/stock/templates/stock/location.html @@ -70,6 +70,25 @@ sessionStorage.removeItem('inventree-show-part-locations'); }); + $("#location-export").click(function() { + launchModalForm("{% url 'stock-export-options' %}", + { + success: function(response) { + var url = "{% url 'stock-export' %}"; + + url += "?format=" + response.format; + url += "&cascade=" + response.cascade; + + {% if location %} + url += "&location={{ location.id }}"; + {% endif %} + + location.href = url; + } + } + ); + }); + $('#location-create').click(function () { launchModalForm("{% url 'stock-location-create' %}", { diff --git a/InvenTree/stock/urls.py b/InvenTree/stock/urls.py index 19dbecd88a..fa849211f3 100644 --- a/InvenTree/stock/urls.py +++ b/InvenTree/stock/urls.py @@ -51,6 +51,7 @@ stock_urls = [ url(r'^adjust/?', views.StockAdjust.as_view(), name='stock-adjust'), + url(r'^export-options/?', views.StockExportOptions.as_view(), name='stock-export-options'), url(r'^export/?', views.StockExport.as_view(), name='stock-export'), # Individual stock items diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index 46d33e534e..132a04954a 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -31,6 +31,7 @@ from .forms import EditStockItemForm from .forms import AdjustStockForm from .forms import TrackingEntryForm from .forms import SerializeStockForm +from .forms import ExportOptionsForm class StockIndex(ListView): @@ -119,6 +120,38 @@ class StockLocationQRCode(QRCodeView): return None +class StockExportOptions(AjaxView): + """ Form for selecting StockExport options """ + + model = StockLocation + ajax_form_title = 'Stock Export Options' + form_class = ExportOptionsForm + + def post(self, request, *args, **kwargs): + + self.request = request + + fmt = request.POST.get('file_format', 'csv').lower() + cascade = str2bool(request.POST.get('include_sublocations', True)) + + # Format a URL to redirect to + url = reverse('stock-export') + + url += '?format=' + fmt + url += '&cascade=' + str(cascade) + + data = { + 'form_valid': True, + 'format': fmt, + 'cascade': cascade + } + + return self.renderJsonResponse(self.request, self.form_class(), data=data) + + def get(self, request, *args, **kwargs): + return self.renderJsonResponse(request, self.form_class()) + + class StockExport(AjaxView): """ Export stock data from a particular location. Returns a file containing stock information for that location.