diff --git a/InvenTree/build/templates/build/allocate_edit.html b/InvenTree/build/templates/build/allocate_edit.html
index d5978afa1d..ca6990ee00 100644
--- a/InvenTree/build/templates/build/allocate_edit.html
+++ b/InvenTree/build/templates/build/allocate_edit.html
@@ -1,12 +1,14 @@
+{% load i18n %}
+{% load inventree_extras %}
-
Allocate Stock to Build
+
{% trans "Allocate Stock to Build" %}
-
-
+
+
@@ -14,16 +16,16 @@
-
Part
+ {% trans "Part" %}
-
Available
+ {% trans "Available" %}
-
Required
+ {% trans "Required" %}
-
Allocated
+ {% trans "Allocated" %}
diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po
index 3101879ebc..4a7c95a862 100644
--- a/InvenTree/locale/de/LC_MESSAGES/django.po
+++ b/InvenTree/locale/de/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-11-18 22:51+0000\n"
+"POT-Creation-Date: 2019-11-18 22:58+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -102,7 +102,8 @@ msgstr ""
msgid "Destroyed"
msgstr ""
-#: InvenTree/status_codes.py:83 build/templates/build/allocate_view.html:21
+#: InvenTree/status_codes.py:83 build/templates/build/allocate_edit.html:28
+#: build/templates/build/allocate_view.html:21
msgid "Allocated"
msgstr ""
@@ -149,6 +150,33 @@ msgstr ""
msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
msgstr ""
+#: build/templates/build/allocate_edit.html:5
+msgid "Allocate Stock to Build"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:10
+msgid "Auto Allocate"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:11
+msgid "Unallocate"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:19
+#: build/templates/build/allocate_view.html:17
+msgid "Part"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:22
+#: build/templates/build/allocate_view.html:19
+msgid "Available"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:25
+#: build/templates/build/allocate_view.html:20
+msgid "Required"
+msgstr ""
+
#: build/templates/build/allocate_view.html:4
msgid "Required Parts"
msgstr ""
@@ -161,28 +189,16 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/allocate_view.html:17
-msgid "Part"
-msgstr ""
-
#: build/templates/build/allocate_view.html:18
#: part/templates/part/detail.html:32
msgid "Description"
msgstr ""
-#: build/templates/build/allocate_view.html:19
-msgid "Available"
-msgstr ""
-
-#: build/templates/build/allocate_view.html:20
-msgid "Required"
-msgstr ""
-
#: build/templates/build/allocate_view.html:22
msgid "On Order"
msgstr ""
-#: build/views.py:289 stock/views.py:862
+#: build/views.py:289 stock/views.py:863
#, python-brace-format
msgid "The following serial numbers already exist: ({sn})"
msgstr ""
@@ -954,6 +970,26 @@ msgstr ""
msgid "Stock Item"
msgstr ""
+#: stock/views.py:96
+msgid "Edit Stock Location"
+msgstr ""
+
+#: stock/views.py:120
+msgid "Stock Location QR code"
+msgstr ""
+
+#: stock/views.py:135
+msgid "Stock Export Options"
+msgstr ""
+
+#: stock/views.py:243
+msgid "Stock Item QR Code"
+msgstr ""
+
+#: stock/views.py:266
+msgid "Adjust Stock"
+msgstr ""
+
#: stock/views.py:375
msgid "Move Stock Items"
msgstr ""
@@ -1020,10 +1056,54 @@ msgstr ""
msgid "Deleted {n} stock items"
msgstr ""
-#: stock/views.py:841
+#: stock/views.py:588
+msgid "Edit Stock Item"
+msgstr ""
+
+#: stock/views.py:624
+msgid "Create new Stock Location"
+msgstr ""
+
+#: stock/views.py:645
+msgid "Serialize Stock"
+msgstr ""
+
+#: stock/views.py:725
+msgid "Create new Stock Item"
+msgstr ""
+
+#: stock/views.py:789
+msgid "Copy Stock Item"
+msgstr ""
+
+#: stock/views.py:839
+msgid "Invalid quantity"
+msgstr ""
+
+#: stock/views.py:842
msgid "Invalid part selection"
msgstr ""
-#: stock/views.py:903
+#: stock/views.py:904
msgid "Created new stock item"
msgstr ""
+
+#: stock/views.py:921
+msgid "Delete Stock Location"
+msgstr ""
+
+#: stock/views.py:934
+msgid "Delete Stock Item"
+msgstr ""
+
+#: stock/views.py:945
+msgid "Delete Stock Tracking Entry"
+msgstr ""
+
+#: stock/views.py:962
+msgid "Edit Stock Tracking Entry"
+msgstr ""
+
+#: stock/views.py:971
+msgid "Add Stock Tracking Entry"
+msgstr ""
diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po
index 3101879ebc..4a7c95a862 100644
--- a/InvenTree/locale/en/LC_MESSAGES/django.po
+++ b/InvenTree/locale/en/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-11-18 22:51+0000\n"
+"POT-Creation-Date: 2019-11-18 22:58+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -102,7 +102,8 @@ msgstr ""
msgid "Destroyed"
msgstr ""
-#: InvenTree/status_codes.py:83 build/templates/build/allocate_view.html:21
+#: InvenTree/status_codes.py:83 build/templates/build/allocate_edit.html:28
+#: build/templates/build/allocate_view.html:21
msgid "Allocated"
msgstr ""
@@ -149,6 +150,33 @@ msgstr ""
msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
msgstr ""
+#: build/templates/build/allocate_edit.html:5
+msgid "Allocate Stock to Build"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:10
+msgid "Auto Allocate"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:11
+msgid "Unallocate"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:19
+#: build/templates/build/allocate_view.html:17
+msgid "Part"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:22
+#: build/templates/build/allocate_view.html:19
+msgid "Available"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:25
+#: build/templates/build/allocate_view.html:20
+msgid "Required"
+msgstr ""
+
#: build/templates/build/allocate_view.html:4
msgid "Required Parts"
msgstr ""
@@ -161,28 +189,16 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/allocate_view.html:17
-msgid "Part"
-msgstr ""
-
#: build/templates/build/allocate_view.html:18
#: part/templates/part/detail.html:32
msgid "Description"
msgstr ""
-#: build/templates/build/allocate_view.html:19
-msgid "Available"
-msgstr ""
-
-#: build/templates/build/allocate_view.html:20
-msgid "Required"
-msgstr ""
-
#: build/templates/build/allocate_view.html:22
msgid "On Order"
msgstr ""
-#: build/views.py:289 stock/views.py:862
+#: build/views.py:289 stock/views.py:863
#, python-brace-format
msgid "The following serial numbers already exist: ({sn})"
msgstr ""
@@ -954,6 +970,26 @@ msgstr ""
msgid "Stock Item"
msgstr ""
+#: stock/views.py:96
+msgid "Edit Stock Location"
+msgstr ""
+
+#: stock/views.py:120
+msgid "Stock Location QR code"
+msgstr ""
+
+#: stock/views.py:135
+msgid "Stock Export Options"
+msgstr ""
+
+#: stock/views.py:243
+msgid "Stock Item QR Code"
+msgstr ""
+
+#: stock/views.py:266
+msgid "Adjust Stock"
+msgstr ""
+
#: stock/views.py:375
msgid "Move Stock Items"
msgstr ""
@@ -1020,10 +1056,54 @@ msgstr ""
msgid "Deleted {n} stock items"
msgstr ""
-#: stock/views.py:841
+#: stock/views.py:588
+msgid "Edit Stock Item"
+msgstr ""
+
+#: stock/views.py:624
+msgid "Create new Stock Location"
+msgstr ""
+
+#: stock/views.py:645
+msgid "Serialize Stock"
+msgstr ""
+
+#: stock/views.py:725
+msgid "Create new Stock Item"
+msgstr ""
+
+#: stock/views.py:789
+msgid "Copy Stock Item"
+msgstr ""
+
+#: stock/views.py:839
+msgid "Invalid quantity"
+msgstr ""
+
+#: stock/views.py:842
msgid "Invalid part selection"
msgstr ""
-#: stock/views.py:903
+#: stock/views.py:904
msgid "Created new stock item"
msgstr ""
+
+#: stock/views.py:921
+msgid "Delete Stock Location"
+msgstr ""
+
+#: stock/views.py:934
+msgid "Delete Stock Item"
+msgstr ""
+
+#: stock/views.py:945
+msgid "Delete Stock Tracking Entry"
+msgstr ""
+
+#: stock/views.py:962
+msgid "Edit Stock Tracking Entry"
+msgstr ""
+
+#: stock/views.py:971
+msgid "Add Stock Tracking Entry"
+msgstr ""
diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po
index 3101879ebc..4a7c95a862 100644
--- a/InvenTree/locale/es/LC_MESSAGES/django.po
+++ b/InvenTree/locale/es/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-11-18 22:51+0000\n"
+"POT-Creation-Date: 2019-11-18 22:58+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -102,7 +102,8 @@ msgstr ""
msgid "Destroyed"
msgstr ""
-#: InvenTree/status_codes.py:83 build/templates/build/allocate_view.html:21
+#: InvenTree/status_codes.py:83 build/templates/build/allocate_edit.html:28
+#: build/templates/build/allocate_view.html:21
msgid "Allocated"
msgstr ""
@@ -149,6 +150,33 @@ msgstr ""
msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
msgstr ""
+#: build/templates/build/allocate_edit.html:5
+msgid "Allocate Stock to Build"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:10
+msgid "Auto Allocate"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:11
+msgid "Unallocate"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:19
+#: build/templates/build/allocate_view.html:17
+msgid "Part"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:22
+#: build/templates/build/allocate_view.html:19
+msgid "Available"
+msgstr ""
+
+#: build/templates/build/allocate_edit.html:25
+#: build/templates/build/allocate_view.html:20
+msgid "Required"
+msgstr ""
+
#: build/templates/build/allocate_view.html:4
msgid "Required Parts"
msgstr ""
@@ -161,28 +189,16 @@ msgstr ""
msgid "Order Parts"
msgstr ""
-#: build/templates/build/allocate_view.html:17
-msgid "Part"
-msgstr ""
-
#: build/templates/build/allocate_view.html:18
#: part/templates/part/detail.html:32
msgid "Description"
msgstr ""
-#: build/templates/build/allocate_view.html:19
-msgid "Available"
-msgstr ""
-
-#: build/templates/build/allocate_view.html:20
-msgid "Required"
-msgstr ""
-
#: build/templates/build/allocate_view.html:22
msgid "On Order"
msgstr ""
-#: build/views.py:289 stock/views.py:862
+#: build/views.py:289 stock/views.py:863
#, python-brace-format
msgid "The following serial numbers already exist: ({sn})"
msgstr ""
@@ -954,6 +970,26 @@ msgstr ""
msgid "Stock Item"
msgstr ""
+#: stock/views.py:96
+msgid "Edit Stock Location"
+msgstr ""
+
+#: stock/views.py:120
+msgid "Stock Location QR code"
+msgstr ""
+
+#: stock/views.py:135
+msgid "Stock Export Options"
+msgstr ""
+
+#: stock/views.py:243
+msgid "Stock Item QR Code"
+msgstr ""
+
+#: stock/views.py:266
+msgid "Adjust Stock"
+msgstr ""
+
#: stock/views.py:375
msgid "Move Stock Items"
msgstr ""
@@ -1020,10 +1056,54 @@ msgstr ""
msgid "Deleted {n} stock items"
msgstr ""
-#: stock/views.py:841
+#: stock/views.py:588
+msgid "Edit Stock Item"
+msgstr ""
+
+#: stock/views.py:624
+msgid "Create new Stock Location"
+msgstr ""
+
+#: stock/views.py:645
+msgid "Serialize Stock"
+msgstr ""
+
+#: stock/views.py:725
+msgid "Create new Stock Item"
+msgstr ""
+
+#: stock/views.py:789
+msgid "Copy Stock Item"
+msgstr ""
+
+#: stock/views.py:839
+msgid "Invalid quantity"
+msgstr ""
+
+#: stock/views.py:842
msgid "Invalid part selection"
msgstr ""
-#: stock/views.py:903
+#: stock/views.py:904
msgid "Created new stock item"
msgstr ""
+
+#: stock/views.py:921
+msgid "Delete Stock Location"
+msgstr ""
+
+#: stock/views.py:934
+msgid "Delete Stock Item"
+msgstr ""
+
+#: stock/views.py:945
+msgid "Delete Stock Tracking Entry"
+msgstr ""
+
+#: stock/views.py:962
+msgid "Edit Stock Tracking Entry"
+msgstr ""
+
+#: stock/views.py:971
+msgid "Add Stock Tracking Entry"
+msgstr ""
diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py
index 5dfe530a8c..9a325300fc 100644
--- a/InvenTree/stock/views.py
+++ b/InvenTree/stock/views.py
@@ -21,7 +21,7 @@ from InvenTree.views import QRCodeView
from InvenTree.helpers import str2bool, DownloadFile, GetExportFormats
from InvenTree.helpers import ExtractSerialNumbers
-from decimal import Decimal
+from decimal import Decimal, InvalidOperation
from datetime import datetime
from company.models import Company
@@ -93,7 +93,7 @@ class StockLocationEdit(AjaxUpdateView):
form_class = EditStockLocationForm
context_object_name = 'location'
ajax_template_name = 'modal_form.html'
- ajax_form_title = 'Edit Stock Location'
+ ajax_form_title = _('Edit Stock Location')
def get_form(self):
""" Customize form data for StockLocation editing.
@@ -117,7 +117,7 @@ class StockLocationEdit(AjaxUpdateView):
class StockLocationQRCode(QRCodeView):
""" View for displaying a QR code for a StockLocation object """
- ajax_form_title = "Stock Location QR code"
+ ajax_form_title = _("Stock Location QR code")
def get_qr_data(self):
""" Generate QR code data for the StockLocation """
@@ -132,7 +132,7 @@ class StockExportOptions(AjaxView):
""" Form for selecting StockExport options """
model = StockLocation
- ajax_form_title = 'Stock Export Options'
+ ajax_form_title = _('Stock Export Options')
form_class = ExportOptionsForm
def post(self, request, *args, **kwargs):
@@ -240,7 +240,7 @@ class StockExport(AjaxView):
class StockItemQRCode(QRCodeView):
""" View for displaying a QR code for a StockItem object """
- ajax_form_title = "Stock Item QR Code"
+ ajax_form_title = _("Stock Item QR Code")
def get_qr_data(self):
""" Generate QR code data for the StockItem """
@@ -263,7 +263,7 @@ class StockAdjust(AjaxView, FormMixin):
"""
ajax_template_name = 'stock/stock_adjust.html'
- ajax_form_title = 'Adjust Stock'
+ ajax_form_title = _('Adjust Stock')
form_class = AdjustStockForm
stock_items = []
@@ -585,7 +585,7 @@ class StockItemEdit(AjaxUpdateView):
form_class = EditStockItemForm
context_object_name = 'item'
ajax_template_name = 'modal_form.html'
- ajax_form_title = 'Edit Stock Item'
+ ajax_form_title = _('Edit Stock Item')
def get_form(self):
""" Get form for StockItem editing.
@@ -621,7 +621,7 @@ class StockLocationCreate(AjaxCreateView):
form_class = EditStockLocationForm
context_object_name = 'location'
ajax_template_name = 'modal_form.html'
- ajax_form_title = 'Create new Stock Location'
+ ajax_form_title = _('Create new Stock Location')
def get_initial(self):
initials = super(StockLocationCreate, self).get_initial().copy()
@@ -642,7 +642,7 @@ class StockItemSerialize(AjaxUpdateView):
model = StockItem
ajax_template_name = 'stock/item_serialize.html'
- ajax_form_title = 'Serialize Stock'
+ ajax_form_title = _('Serialize Stock')
form_class = SerializeStockForm
def get_initial(self):
@@ -722,7 +722,7 @@ class StockItemCreate(AjaxCreateView):
form_class = CreateStockItemForm
context_object_name = 'item'
ajax_template_name = 'modal_form.html'
- ajax_form_title = 'Create new Stock Item'
+ ajax_form_title = _('Create new Stock Item')
def get_form(self):
""" Get form for StockItem creation.
@@ -786,7 +786,7 @@ class StockItemCreate(AjaxCreateView):
try:
original = StockItem.objects.get(pk=item_to_copy)
initials = model_to_dict(original)
- self.ajax_form_title = "Copy Stock Item"
+ self.ajax_form_title = _("Copy Stock Item")
except StockItem.DoesNotExist:
initials = super(StockItemCreate, self).get_initial().copy()
@@ -831,11 +831,12 @@ class StockItemCreate(AjaxCreateView):
part_id = form['part'].value()
try:
part = Part.objects.get(id=part_id)
- quantity = int(form['quantity'].value())
- except (Part.DoesNotExist, ValueError):
+ quantity = Decimal(form['quantity'].value())
+ except (Part.DoesNotExist, ValueError, InvalidOperation):
part = None
quantity = 1
valid = False
+ form.errors['quantity'] = [_('Invalid quantity')]
if part is None:
form.errors['part'] = [_('Invalid part selection')]
@@ -917,7 +918,7 @@ class StockLocationDelete(AjaxDeleteView):
success_url = '/stock'
ajax_template_name = 'stock/location_delete.html'
context_object_name = 'location'
- ajax_form_title = 'Delete Stock Location'
+ ajax_form_title = _('Delete Stock Location')
class StockItemDelete(AjaxDeleteView):
@@ -930,7 +931,7 @@ class StockItemDelete(AjaxDeleteView):
success_url = '/stock/'
ajax_template_name = 'stock/item_delete.html'
context_object_name = 'item'
- ajax_form_title = 'Delete Stock Item'
+ ajax_form_title = _('Delete Stock Item')
class StockItemTrackingDelete(AjaxDeleteView):
@@ -941,7 +942,7 @@ class StockItemTrackingDelete(AjaxDeleteView):
model = StockItemTracking
ajax_template_name = 'stock/tracking_delete.html'
- ajax_form_title = 'Delete Stock Tracking Entry'
+ ajax_form_title = _('Delete Stock Tracking Entry')
class StockTrackingIndex(ListView):
@@ -958,7 +959,7 @@ class StockItemTrackingEdit(AjaxUpdateView):
""" View for editing a StockItemTracking object """
model = StockItemTracking
- ajax_form_title = 'Edit Stock Tracking Entry'
+ ajax_form_title = _('Edit Stock Tracking Entry')
form_class = TrackingEntryForm
@@ -967,7 +968,7 @@ class StockItemTrackingCreate(AjaxCreateView):
"""
model = StockItemTracking
- ajax_form_title = "Add Stock Tracking Entry"
+ ajax_form_title = _("Add Stock Tracking Entry")
form_class = TrackingEntryForm
def post(self, request, *args, **kwargs):