From cdde0f8c433d344c0725af5fe090f6ed99891e23 Mon Sep 17 00:00:00 2001
From: Oliver Walters <oliver.henry.walters@gmail.com>
Date: Sun, 16 Aug 2020 11:12:21 +1000
Subject: [PATCH] Add URL endpoint for downloading PDF labels

---
 InvenTree/stock/urls.py  |  1 +
 InvenTree/stock/views.py | 39 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 40 insertions(+)

diff --git a/InvenTree/stock/urls.py b/InvenTree/stock/urls.py
index b48795b86e..c886f8ccaa 100644
--- a/InvenTree/stock/urls.py
+++ b/InvenTree/stock/urls.py
@@ -59,6 +59,7 @@ stock_urls = [
     url(r'^item/new/?', views.StockItemCreate.as_view(), name='stock-item-create'),
 
     url(r'^item/test-report-download/', views.StockItemTestReportDownload.as_view(), name='stock-item-test-report-download'),
+    url(r'^item/print-stock-labels/', views.StockItemPrintLabels.as_view(), name='stock-item-print-labels'),
 
     # URLs for StockItem attachments
     url(r'^item/attachment/', include([
diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py
index 56a3abaaad..5a5cba9126 100644
--- a/InvenTree/stock/views.py
+++ b/InvenTree/stock/views.py
@@ -28,6 +28,7 @@ from datetime import datetime
 from company.models import Company, SupplierPart
 from part.models import Part
 from report.models import TestReport
+from label.models import StockItemLabel
 from .models import StockItem, StockLocation, StockItemTracking, StockItemAttachment, StockItemTestResult
 
 from .admin import StockItemResource
@@ -295,6 +296,44 @@ class StockItemReturnToStock(AjaxUpdateView):
         return self.renderJsonResponse(request, self.get_form(), data)
 
 
+class StockItemPrintLabels(AjaxView):
+    """
+    View for printing labels and returning a PDF
+
+    Requires the following arguments to be passed as URL params:
+
+    items: List of valid StockItem pk values
+    label: Valid pk of a StockItemLabel template
+    """
+
+    def get(self, request, *args, **kwargs):
+
+        label = request.GET.get('label', None)
+
+        try:
+            label = StockItemLabel.objects.get(pk=label)
+        except (ValueError, StockItemLabel.DoesNotExist):
+            raise ValidationError({'label': 'Invalid label ID'})
+
+        item_pks = request.GET.getlist('items[]')
+
+        items = []
+
+        for pk in item_pks:
+            try:
+                item = StockItem.objects.get(pk=pk)
+                items.append(item)
+            except (ValueError, StockItem.DoesNotExist):
+                pass
+
+        if len(items) == 0:
+            raise ValidationError({'items': 'Must provide valid stockitems'})
+
+        pdf = label.render(items).getbuffer()
+
+        return DownloadFile(pdf, 'stock_labels.pdf', content_type='application/pdf')
+
+
 class StockItemDeleteTestData(AjaxUpdateView):
     """
     View for deleting all test data