diff --git a/InvenTree/build/templates/build/tabs.html b/InvenTree/build/templates/build/tabs.html
index 2c45cd2361..8bdb2a3013 100644
--- a/InvenTree/build/templates/build/tabs.html
+++ b/InvenTree/build/templates/build/tabs.html
@@ -4,16 +4,29 @@
{% trans "Details" %}
+ {% if build.active %}
- {% trans "Allocate Parts" %}
+
+ {% trans "Incomplete" %}
+ {{ build.incomplete_outputs.count }}
+
+ {% endif %}
- {% trans "Build Outputs" %}{% if build.output_count > 0%}{{ build.output_count }}{% endif %}
+
+ {% trans "Build Outputs" %}
+ {{ build.output_count }}
+
- {% trans "Notes" %}{% if build.notes %} {% endif %}
+
+ {% trans "Notes" %}
+ {% if build.notes %} {% endif %}
+
- {% trans "Attachments" %}
+
+ {% trans "Attachments" %}
+
\ No newline at end of file
diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po
index 8a486733dc..07c948212b 100644
--- a/InvenTree/locale/de/LC_MESSAGES/django.po
+++ b/InvenTree/locale/de/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-03 10:02+0000\n"
+"POT-Creation-Date: 2020-11-05 08:57+0000\n"
"PO-Revision-Date: 2020-05-03 11:32+0200\n"
"Last-Translator: Christian Schlüter \n"
"Language-Team: C \n"
@@ -447,7 +447,7 @@ msgstr "Bestellung, die diesem Bau zugwiesen ist"
#: order/templates/order/order_wizard/select_parts.html:30
#: order/templates/order/purchase_order_detail.html:148
#: order/templates/order/receive_parts.html:19 part/models.py:293
-#: part/templates/part/part_app_base.html:7
+#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:26
#: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133
#: templates/js/barcode.js:336 templates/js/bom.js:147 templates/js/bom.js:484
#: templates/js/build.js:647 templates/js/company.js:138
@@ -540,10 +540,10 @@ msgstr "Externer Link"
msgid "Link to external URL"
msgstr "Link zu einer externen URL"
-#: build/models.py:181 build/templates/build/tabs.html:14 company/models.py:314
+#: build/models.py:181 build/templates/build/tabs.html:23 company/models.py:314
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18
#: order/templates/order/purchase_order_detail.html:203
-#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:70
+#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:73
#: stock/forms.py:306 stock/forms.py:338 stock/forms.py:366 stock/models.py:455
#: stock/models.py:1428 stock/templates/stock/tabs.html:26
#: templates/js/barcode.js:391 templates/js/bom.js:250
@@ -555,76 +555,76 @@ msgstr "Notizen"
msgid "Extra build notes"
msgstr "Notizen für den Bau"
-#: build/models.py:543
+#: build/models.py:551
#, fuzzy
#| msgid "No action specified"
msgid "No build output specified"
msgstr "Keine Aktion angegeben"
-#: build/models.py:546
+#: build/models.py:554
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:549
+#: build/models.py:557
#, fuzzy
#| msgid "Quantity does not match serial numbers"
msgid "Build output does not match Build Order"
msgstr "Anzahl stimmt nicht mit den Seriennummern überein"
-#: build/models.py:620
+#: build/models.py:632
#, fuzzy
#| msgid "Complete Build"
msgid "Completed build output"
msgstr "Bau fertigstellen"
-#: build/models.py:858
+#: build/models.py:870
msgid "BuildItem must be unique for build, stock_item and install_into"
msgstr ""
-#: build/models.py:880
+#: build/models.py:892
#, fuzzy
#| msgid "Allocate Stock to Build"
msgid "Build item must specify a build output"
msgstr "Lagerbestand dem Bau zuweisen"
-#: build/models.py:885
+#: build/models.py:897
#, python-brace-format
msgid "Selected stock item not found in BOM for part '{p}'"
msgstr "Ausgewähltes Lagerobjekt nicht in BOM für Teil '{p}' gefunden"
-#: build/models.py:889
+#: build/models.py:901
#, python-brace-format
msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
msgstr ""
"zugewiesene Anzahl ({n}) darf nicht die verfügbare ({q}) Anzahl überschreiten"
-#: build/models.py:896 order/models.py:603
+#: build/models.py:908 order/models.py:603
msgid "StockItem is over-allocated"
msgstr "Zu viele Lagerobjekte zugewiesen"
-#: build/models.py:900 order/models.py:606
+#: build/models.py:912 order/models.py:606
msgid "Allocation quantity must be greater than zero"
msgstr "Anzahl muss größer null sein"
-#: build/models.py:904
+#: build/models.py:916
msgid "Quantity must be 1 for serialized stock"
msgstr "Anzahl muss 1 für Objekte mit Seriennummer sein"
-#: build/models.py:944
+#: build/models.py:956
msgid "Build to allocate parts"
msgstr "Bau starten um Teile zuzuweisen"
-#: build/models.py:951
+#: build/models.py:963
#, fuzzy
#| msgid "Remove stock"
msgid "Source stock item"
msgstr "Bestand entfernen"
-#: build/models.py:964
+#: build/models.py:976
msgid "Stock quantity to allocate to build"
msgstr "Lagerobjekt-Anzahl dem Bau zuweisen"
-#: build/models.py:972
+#: build/models.py:984
#, fuzzy
#| msgid "Destination stock location"
msgid "Destination stock item"
@@ -642,59 +642,59 @@ msgstr "Bau fertigstellen"
msgid "Build order has been completed"
msgstr "Bau-Zuweisung ist vollständig"
-#: build/templates/build/allocate.html:24
+#: build/templates/build/allocate.html:25
#, fuzzy
#| msgid "Created new build"
msgid "Create new build output"
msgstr "Neuen Bau angelegt"
-#: build/templates/build/allocate.html:25
+#: build/templates/build/allocate.html:26
#, fuzzy
#| msgid "Create New Part"
msgid "Create New Output"
msgstr "Neues Teil anlegen"
-#: build/templates/build/allocate.html:28
+#: build/templates/build/allocate.html:29
#, fuzzy
#| msgid "Order part"
msgid "Order required parts"
msgstr "Teil bestellen"
-#: build/templates/build/allocate.html:29
+#: build/templates/build/allocate.html:30
#: company/templates/company/detail_part.html:28 order/views.py:801
#: part/templates/part/category.html:125
msgid "Order Parts"
msgstr "Teile bestellen"
-#: build/templates/build/allocate.html:32 templates/js/build.js:574
+#: build/templates/build/allocate.html:33 templates/js/build.js:574
#, fuzzy
#| msgid "Unallocate Stock"
msgid "Unallocate stock"
msgstr "Zuweisung aufheben"
-#: build/templates/build/allocate.html:33 build/views.py:341 build/views.py:778
+#: build/templates/build/allocate.html:34 build/views.py:341 build/views.py:778
msgid "Unallocate Stock"
msgstr "Zuweisung aufheben"
-#: build/templates/build/allocate.html:46
+#: build/templates/build/allocate.html:48
#, fuzzy
#| msgid "Created new build"
msgid "Create a new build output"
msgstr "Neuen Bau angelegt"
-#: build/templates/build/allocate.html:47
+#: build/templates/build/allocate.html:49
#, fuzzy
#| msgid "Complete Build"
msgid "No incomplete build outputs remain."
msgstr "Bau fertigstellen"
-#: build/templates/build/allocate.html:48
+#: build/templates/build/allocate.html:50
msgid "Create a new build output using the button above"
msgstr ""
-#: build/templates/build/attachments.html:11 build/templates/build/tabs.html:17
+#: build/templates/build/attachments.html:11 build/templates/build/tabs.html:29
#: order/templates/order/po_tabs.html:11 order/templates/order/so_tabs.html:16
-#: part/templates/part/tabs.html:67 stock/templates/stock/tabs.html:32
+#: part/templates/part/tabs.html:70 stock/templates/stock/tabs.html:32
msgid "Attachments"
msgstr "Anhänge"
@@ -801,7 +801,7 @@ msgstr ""
msgid "Sales Order"
msgstr "Bestellung"
-#: build/templates/build/build_output.html:9 build/templates/build/tabs.html:11
+#: build/templates/build/build_output.html:9 build/templates/build/tabs.html:17
msgid "Build Outputs"
msgstr "Bau-Ausgabe"
@@ -993,11 +993,11 @@ msgstr "Bermerkungen bearbeiten"
msgid "Details"
msgstr "Details"
-#: build/templates/build/tabs.html:8
+#: build/templates/build/tabs.html:10
#, fuzzy
-#| msgid "Allocated Parts"
-msgid "Allocate Parts"
-msgstr "Zugeordnete Teile"
+#| msgid "Complete"
+msgid "Incomplete"
+msgstr "Fertig"
#: build/templates/build/unallocate.html:10
msgid "Are you sure you wish to unallocate all stock for this build?"
@@ -1036,7 +1036,7 @@ msgstr "Lagerbestand dem Bau zuweisen"
msgid "Create Build Output"
msgstr "Bau-Ausgabe"
-#: build/views.py:207 stock/models.py:832 stock/views.py:1645
+#: build/views.py:207 stock/models.py:832 stock/views.py:1647
#, fuzzy
#| msgid "Serial numbers already exist: "
msgid "Serial numbers already exist"
@@ -1175,7 +1175,7 @@ msgstr "Bauobjekt aktualisiert"
msgid "Add Build Order Attachment"
msgstr "Auftragsanhang hinzufügen"
-#: build/views.py:1059 order/views.py:111 order/views.py:164 part/views.py:96
+#: build/views.py:1059 order/views.py:111 order/views.py:164 part/views.py:164
#: stock/views.py:176
msgid "Added attachment"
msgstr "Anhang hinzugefügt"
@@ -1715,7 +1715,7 @@ msgid "Pricing Information"
msgstr "Preisinformationen ansehen"
#: company/templates/company/supplier_part_pricing.html:17 company/views.py:410
-#: part/templates/part/sale_prices.html:13 part/views.py:2292
+#: part/templates/part/sale_prices.html:13 part/views.py:2360
msgid "Add Price Break"
msgstr "Preisstaffel hinzufügen"
@@ -1848,17 +1848,17 @@ msgstr "Neues Zuliefererteil anlegen"
msgid "Delete Supplier Part"
msgstr "Zuliefererteil entfernen"
-#: company/views.py:416 part/views.py:2298
+#: company/views.py:416 part/views.py:2366
#, fuzzy
#| msgid "Add Price Break"
msgid "Added new price break"
msgstr "Preisstaffel hinzufügen"
-#: company/views.py:453 part/views.py:2343
+#: company/views.py:453 part/views.py:2411
msgid "Edit Price Break"
msgstr "Preisstaffel bearbeiten"
-#: company/views.py:469 part/views.py:2359
+#: company/views.py:469 part/views.py:2427
msgid "Delete Price Break"
msgstr "Preisstaffel löschen"
@@ -1963,7 +1963,7 @@ msgstr ""
msgid "Date order was completed"
msgstr "Bestellung als vollständig markieren"
-#: order/models.py:185 order/models.py:267 part/views.py:1409
+#: order/models.py:185 order/models.py:267 part/views.py:1477
#: stock/models.py:243 stock/models.py:816
msgid "Quantity must be greater than zero"
msgstr "Anzahl muss größer Null sein"
@@ -2557,7 +2557,7 @@ msgstr "Neues Zulieferer-Teil"
msgid "Include part supplier data in exported BOM"
msgstr ""
-#: part/forms.py:93 part/models.py:1582
+#: part/forms.py:93 part/models.py:1608
msgid "Parent Part"
msgstr "Ausgangsteil"
@@ -2587,11 +2587,17 @@ msgstr "Bestätigen, dass die Stückliste korrekt ist"
msgid "Select BOM file to upload"
msgstr "Stücklisten-Datei zum Upload auswählen"
-#: part/forms.py:159
+#: part/forms.py:154
+#, fuzzy
+#| msgid "Delete Parts"
+msgid "Related Part"
+msgstr "Teile löschen"
+
+#: part/forms.py:173
msgid "Select part category"
msgstr "Teilekategorie wählen"
-#: part/forms.py:173
+#: part/forms.py:187
#, fuzzy
#| msgid "Perform 'deep copy' which will duplicate all BOM data for this part"
msgid "Duplicate all BOM data for this part"
@@ -2599,29 +2605,29 @@ msgstr ""
"Tiefe Kopie ausführen. Dies wird alle Daten der Stückliste für dieses Teil "
"duplizieren"
-#: part/forms.py:174
+#: part/forms.py:188
msgid "Copy BOM"
msgstr ""
-#: part/forms.py:179
+#: part/forms.py:193
msgid "Duplicate all parameter data for this part"
msgstr ""
-#: part/forms.py:180
+#: part/forms.py:194
#, fuzzy
#| msgid "Parameters"
msgid "Copy Parameters"
msgstr "Parameter"
-#: part/forms.py:185
+#: part/forms.py:199
msgid "Confirm part creation"
msgstr "Erstellen des Teils bestätigen"
-#: part/forms.py:279
+#: part/forms.py:293
msgid "Input quantity for price calculation"
msgstr "Eintragsmenge zur Preisberechnung"
-#: part/forms.py:282
+#: part/forms.py:296
msgid "Select currency for price calculation"
msgstr "Währung zur Preisberechnung wählen"
@@ -2751,13 +2757,13 @@ msgstr "Bemerkungen - unterstüzt Markdown-Formatierung"
msgid "Stored BOM checksum"
msgstr "Prüfsumme der Stückliste gespeichert"
-#: part/models.py:1455
+#: part/models.py:1481
#, fuzzy
#| msgid "Stock item cannot be created for a template Part"
msgid "Test templates can only be created for trackable parts"
msgstr "Lagerobjekt kann nicht für Vorlagen-Teile angelegt werden"
-#: part/models.py:1472
+#: part/models.py:1498
#, fuzzy
#| msgid ""
#| "A stock item with this serial number already exists for template part "
@@ -2767,126 +2773,138 @@ msgstr ""
"Ein Teil mit dieser Seriennummer existiert bereits für die Teilevorlage "
"{part}"
-#: part/models.py:1491 templates/js/part.js:567 templates/js/stock.js:92
+#: part/models.py:1517 templates/js/part.js:567 templates/js/stock.js:92
#, fuzzy
#| msgid "Instance Name"
msgid "Test Name"
msgstr "Instanzname"
-#: part/models.py:1492
+#: part/models.py:1518
#, fuzzy
#| msgid "Serial number for this item"
msgid "Enter a name for the test"
msgstr "Seriennummer für dieses Teil"
-#: part/models.py:1497
+#: part/models.py:1523
#, fuzzy
#| msgid "Description"
msgid "Test Description"
msgstr "Beschreibung"
-#: part/models.py:1498
+#: part/models.py:1524
#, fuzzy
#| msgid "Brief description of the build"
msgid "Enter description for this test"
msgstr "Kurze Beschreibung des Baus"
-#: part/models.py:1503 templates/js/part.js:576
+#: part/models.py:1529 templates/js/part.js:576
#: templates/js/table_filters.js:172
msgid "Required"
msgstr "benötigt"
-#: part/models.py:1504
+#: part/models.py:1530
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:1509 templates/js/part.js:584
+#: part/models.py:1535 templates/js/part.js:584
#, fuzzy
#| msgid "Required Parts"
msgid "Requires Value"
msgstr "benötigte Teile"
-#: part/models.py:1510
+#: part/models.py:1536
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:1515 templates/js/part.js:591
+#: part/models.py:1541 templates/js/part.js:591
#, fuzzy
#| msgid "Delete Attachment"
msgid "Requires Attachment"
msgstr "Anhang löschen"
-#: part/models.py:1516
+#: part/models.py:1542
msgid "Does this test require a file attachment when adding a test result?"
msgstr ""
-#: part/models.py:1549
+#: part/models.py:1575
msgid "Parameter template name must be unique"
msgstr "Vorlagen-Name des Parameters muss eindeutig sein"
-#: part/models.py:1554
+#: part/models.py:1580
msgid "Parameter Name"
msgstr "Name des Parameters"
-#: part/models.py:1556
+#: part/models.py:1582
msgid "Parameter Units"
msgstr "Parameter Einheit"
-#: part/models.py:1584
+#: part/models.py:1610
msgid "Parameter Template"
msgstr "Parameter Vorlage"
-#: part/models.py:1586
+#: part/models.py:1612
msgid "Parameter Value"
msgstr "Parameter Wert"
-#: part/models.py:1623
+#: part/models.py:1649
msgid "Select parent part"
msgstr "Ausgangsteil auswählen"
-#: part/models.py:1631
+#: part/models.py:1657
msgid "Select part to be used in BOM"
msgstr "Teil für die Nutzung in der Stückliste auswählen"
-#: part/models.py:1637
+#: part/models.py:1663
msgid "BOM quantity for this BOM item"
msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil"
-#: part/models.py:1639
+#: part/models.py:1665
#, fuzzy
#| msgid "Confim BOM item deletion"
msgid "This BOM item is optional"
msgstr "Löschung von BOM-Position bestätigen"
-#: part/models.py:1642
+#: part/models.py:1668
msgid "Estimated build wastage quantity (absolute or percentage)"
msgstr "Geschätzter Ausschuss (absolut oder prozentual)"
-#: part/models.py:1645
+#: part/models.py:1671
msgid "BOM item reference"
msgstr "Referenz des Objekts auf der Stückliste"
-#: part/models.py:1648
+#: part/models.py:1674
msgid "BOM item notes"
msgstr "Notizen zum Stücklisten-Objekt"
-#: part/models.py:1650
+#: part/models.py:1676
msgid "BOM line checksum"
msgstr "Prüfsumme der Stückliste"
-#: part/models.py:1717 part/views.py:1415 part/views.py:1467
+#: part/models.py:1743 part/views.py:1483 part/views.py:1535
#: stock/models.py:233
#, fuzzy
#| msgid "Overage must be an integer value or a percentage"
msgid "Quantity must be integer value for trackable parts"
msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein"
-#: part/models.py:1733
+#: part/models.py:1759
#, fuzzy
#| msgid "New BOM Item"
msgid "BOM Item"
msgstr "Neue Stücklistenposition"
+#: part/models.py:1874
+#, fuzzy
+#| msgid "Select a part"
+msgid "Select Related Part"
+msgstr "Teil auswählen"
+
+#: part/models.py:1906
+msgid ""
+"Error creating relationship: check that the part is not related to itself "
+"and that the relationship is unique"
+msgstr ""
+
#: part/templates/part/allocation.html:10
msgid "Part Stock Allocations"
msgstr "Teilbestandszuordnungen"
@@ -2977,7 +2995,7 @@ msgstr "Stückliste validieren"
msgid "Validate"
msgstr "BOM validieren"
-#: part/templates/part/bom.html:62 part/views.py:1706
+#: part/templates/part/bom.html:62 part/views.py:1774
msgid "Export Bill of Materials"
msgstr "Stückliste exportieren"
@@ -3099,7 +3117,7 @@ msgstr "Neuen Bau beginnen"
msgid "All parts"
msgstr "Alle Teile"
-#: part/templates/part/category.html:24 part/views.py:2109
+#: part/templates/part/category.html:24 part/views.py:2177
msgid "Create new part category"
msgstr "Teilkategorie anlegen"
@@ -3398,8 +3416,8 @@ msgstr "Neuer Parameter"
msgid "Value"
msgstr "Wert"
-#: part/templates/part/params.html:41 part/templates/part/supplier.html:19
-#: users/models.py:146
+#: part/templates/part/params.html:41 part/templates/part/related.html:41
+#: part/templates/part/supplier.html:19 users/models.py:147
msgid "Delete"
msgstr "Löschen"
@@ -3526,6 +3544,18 @@ msgstr "Aus vorhandenen Bildern auswählen"
msgid "Upload new image"
msgstr "Neues Bild hochladen"
+#: part/templates/part/related.html:9
+#, fuzzy
+#| msgid "Delete Parts"
+msgid "Related Parts"
+msgstr "Teile löschen"
+
+#: part/templates/part/related.html:15
+#, fuzzy
+#| msgid "Edit Template"
+msgid "Add Related"
+msgstr "Vorlage bearbeiten"
+
#: part/templates/part/sale_prices.html:9 part/templates/part/tabs.html:53
#, fuzzy
#| msgid "Price"
@@ -3605,6 +3635,12 @@ msgstr "Benutzt in"
msgid "Tests"
msgstr ""
+#: part/templates/part/tabs.html:67
+#, fuzzy
+#| msgid "Created"
+msgid "Related"
+msgstr "Erstellt"
+
#: part/templates/part/track.html:8
msgid "Part Tracking"
msgstr "Teilverfolgung"
@@ -3632,217 +3668,229 @@ msgid "New Variant"
msgstr "Varianten"
#: part/views.py:80
+#, fuzzy
+#| msgid "Allocated Parts"
+msgid "Add Related Part"
+msgstr "Zugeordnete Teile"
+
+#: part/views.py:136
+#, fuzzy
+#| msgid "Delete Supplier Part"
+msgid "Delete Related Part"
+msgstr "Zuliefererteil entfernen"
+
+#: part/views.py:148
msgid "Add part attachment"
msgstr "Teilanhang hinzufügen"
-#: part/views.py:135 templates/attachment_table.html:34
+#: part/views.py:203 templates/attachment_table.html:34
msgid "Edit attachment"
msgstr "Anhang bearbeiten"
-#: part/views.py:141
+#: part/views.py:209
msgid "Part attachment updated"
msgstr "Teilanhang aktualisiert"
-#: part/views.py:156
+#: part/views.py:224
msgid "Delete Part Attachment"
msgstr "Teilanhang löschen"
-#: part/views.py:164
+#: part/views.py:232
msgid "Deleted part attachment"
msgstr "Teilanhang gelöscht"
-#: part/views.py:173
+#: part/views.py:241
#, fuzzy
#| msgid "Create Part Parameter Template"
msgid "Create Test Template"
msgstr "Teilparametervorlage anlegen"
-#: part/views.py:202
+#: part/views.py:270
#, fuzzy
#| msgid "Edit Template"
msgid "Edit Test Template"
msgstr "Vorlage bearbeiten"
-#: part/views.py:218
+#: part/views.py:286
#, fuzzy
#| msgid "Delete Template"
msgid "Delete Test Template"
msgstr "Vorlage löschen"
-#: part/views.py:227
+#: part/views.py:295
msgid "Set Part Category"
msgstr "Teilkategorie auswählen"
-#: part/views.py:277
+#: part/views.py:345
#, python-brace-format
msgid "Set category for {n} parts"
msgstr "Kategorie für {n} Teile setzen"
-#: part/views.py:312
+#: part/views.py:380
msgid "Create Variant"
msgstr "Variante anlegen"
-#: part/views.py:394
+#: part/views.py:462
msgid "Duplicate Part"
msgstr "Teil duplizieren"
-#: part/views.py:401
+#: part/views.py:469
msgid "Copied part"
msgstr "Teil kopiert"
-#: part/views.py:455 part/views.py:585
+#: part/views.py:523 part/views.py:653
msgid "Possible matches exist - confirm creation of new part"
msgstr ""
-#: part/views.py:520 templates/js/stock.js:840
+#: part/views.py:588 templates/js/stock.js:840
msgid "Create New Part"
msgstr "Neues Teil anlegen"
-#: part/views.py:527
+#: part/views.py:595
msgid "Created new part"
msgstr "Neues Teil angelegt"
-#: part/views.py:743
+#: part/views.py:811
msgid "Part QR Code"
msgstr "Teil-QR-Code"
-#: part/views.py:762
+#: part/views.py:830
msgid "Upload Part Image"
msgstr "Teilbild hochladen"
-#: part/views.py:770 part/views.py:807
+#: part/views.py:838 part/views.py:875
msgid "Updated part image"
msgstr "Teilbild aktualisiert"
-#: part/views.py:779
+#: part/views.py:847
msgid "Select Part Image"
msgstr "Teilbild auswählen"
-#: part/views.py:810
+#: part/views.py:878
msgid "Part image not found"
msgstr "Teilbild nicht gefunden"
-#: part/views.py:821
+#: part/views.py:889
msgid "Edit Part Properties"
msgstr "Teileigenschaften bearbeiten"
-#: part/views.py:848
+#: part/views.py:916
#, fuzzy
#| msgid "Duplicate Part"
msgid "Duplicate BOM"
msgstr "Teil duplizieren"
-#: part/views.py:879
+#: part/views.py:947
#, fuzzy
#| msgid "Confirm unallocation of build stock"
msgid "Confirm duplication of BOM from parent"
msgstr "Zuweisungsaufhebung bestätigen"
-#: part/views.py:900
+#: part/views.py:968
msgid "Validate BOM"
msgstr "BOM validieren"
-#: part/views.py:923
+#: part/views.py:991
#, fuzzy
#| msgid "Confirm that the BOM is correct"
msgid "Confirm that the BOM is valid"
msgstr "Bestätigen, dass die Stückliste korrekt ist"
-#: part/views.py:934
+#: part/views.py:1002
#, fuzzy
#| msgid "Validate Bill of Materials"
msgid "Validated Bill of Materials"
msgstr "Stückliste validieren"
-#: part/views.py:1068
+#: part/views.py:1136
msgid "No BOM file provided"
msgstr "Keine Stückliste angegeben"
-#: part/views.py:1418
+#: part/views.py:1486
msgid "Enter a valid quantity"
msgstr "Bitte eine gültige Anzahl eingeben"
-#: part/views.py:1443 part/views.py:1446
+#: part/views.py:1511 part/views.py:1514
msgid "Select valid part"
msgstr "Bitte ein gültiges Teil auswählen"
-#: part/views.py:1452
+#: part/views.py:1520
msgid "Duplicate part selected"
msgstr "Teil doppelt ausgewählt"
-#: part/views.py:1490
+#: part/views.py:1558
msgid "Select a part"
msgstr "Teil auswählen"
-#: part/views.py:1496
+#: part/views.py:1564
#, fuzzy
#| msgid "Select part to be used in BOM"
msgid "Selected part creates a circular BOM"
msgstr "Teil für die Nutzung in der Stückliste auswählen"
-#: part/views.py:1500
+#: part/views.py:1568
msgid "Specify quantity"
msgstr "Anzahl angeben"
-#: part/views.py:1756
+#: part/views.py:1824
msgid "Confirm Part Deletion"
msgstr "Löschen des Teils bestätigen"
-#: part/views.py:1765
+#: part/views.py:1833
msgid "Part was deleted"
msgstr "Teil wurde gelöscht"
-#: part/views.py:1774
+#: part/views.py:1842
msgid "Part Pricing"
msgstr "Teilbepreisung"
-#: part/views.py:1900
+#: part/views.py:1968
msgid "Create Part Parameter Template"
msgstr "Teilparametervorlage anlegen"
-#: part/views.py:1910
+#: part/views.py:1978
msgid "Edit Part Parameter Template"
msgstr "Teilparametervorlage bearbeiten"
-#: part/views.py:1919
+#: part/views.py:1987
msgid "Delete Part Parameter Template"
msgstr "Teilparametervorlage löschen"
-#: part/views.py:1929
+#: part/views.py:1997
msgid "Create Part Parameter"
msgstr "Teilparameter anlegen"
-#: part/views.py:1981
+#: part/views.py:2049
msgid "Edit Part Parameter"
msgstr "Teilparameter bearbeiten"
-#: part/views.py:1997
+#: part/views.py:2065
msgid "Delete Part Parameter"
msgstr "Teilparameter löschen"
-#: part/views.py:2056
+#: part/views.py:2124
msgid "Edit Part Category"
msgstr "Teilkategorie bearbeiten"
-#: part/views.py:2093
+#: part/views.py:2161
msgid "Delete Part Category"
msgstr "Teilkategorie löschen"
-#: part/views.py:2101
+#: part/views.py:2169
msgid "Part category was deleted"
msgstr "Teilekategorie wurde gelöscht"
-#: part/views.py:2164
+#: part/views.py:2232
#, fuzzy
#| msgid "Create BOM item"
msgid "Create BOM Item"
msgstr "BOM-Position anlegen"
-#: part/views.py:2232
+#: part/views.py:2300
msgid "Edit BOM item"
msgstr "BOM-Position beaarbeiten"
-#: part/views.py:2282
+#: part/views.py:2350
msgid "Confim BOM item deletion"
msgstr "Löschung von BOM-Position bestätigen"
@@ -4806,52 +4854,52 @@ msgstr "Lagerbestand erfassen"
msgid "Create new Stock Item"
msgstr "Neues Lagerobjekt hinzufügen"
-#: stock/views.py:1553
+#: stock/views.py:1555
#, fuzzy
#| msgid "Count stock items"
msgid "Duplicate Stock Item"
msgstr "Lagerobjekte zählen"
-#: stock/views.py:1619
+#: stock/views.py:1621
msgid "Invalid quantity"
msgstr "Ungültige Menge"
-#: stock/views.py:1622
+#: stock/views.py:1624
#, fuzzy
#| msgid "Quantity must be greater than zero"
msgid "Quantity cannot be less than zero"
msgstr "Anzahl muss größer Null sein"
-#: stock/views.py:1626
+#: stock/views.py:1628
msgid "Invalid part selection"
msgstr "Ungültige Teileauswahl"
-#: stock/views.py:1674
+#: stock/views.py:1676
#, python-brace-format
msgid "Created {n} new stock items"
msgstr "{n} neue Lagerobjekte erstellt"
-#: stock/views.py:1693 stock/views.py:1709
+#: stock/views.py:1695 stock/views.py:1711
msgid "Created new stock item"
msgstr "Neues Lagerobjekt erstellt"
-#: stock/views.py:1728
+#: stock/views.py:1730
msgid "Delete Stock Location"
msgstr "Standort löschen"
-#: stock/views.py:1742
+#: stock/views.py:1744
msgid "Delete Stock Item"
msgstr "Lagerobjekt löschen"
-#: stock/views.py:1754
+#: stock/views.py:1756
msgid "Delete Stock Tracking Entry"
msgstr "Lagerbestands-Tracking-Eintrag löschen"
-#: stock/views.py:1773
+#: stock/views.py:1775
msgid "Edit Stock Tracking Entry"
msgstr "Lagerbestands-Tracking-Eintrag bearbeiten"
-#: stock/views.py:1783
+#: stock/views.py:1785
msgid "Add Stock Tracking Entry"
msgstr "Lagerbestands-Tracking-Eintrag hinzufügen"
@@ -5920,69 +5968,73 @@ msgstr "Position löschen"
msgid "Delete Stock"
msgstr "Bestand löschen"
-#: users/admin.py:61
+#: users/admin.py:62
#, fuzzy
#| msgid "User"
msgid "Users"
msgstr "Benutzer"
-#: users/admin.py:62
+#: users/admin.py:63
msgid "Select which users are assigned to this group"
msgstr ""
#: users/admin.py:120
+msgid "The following users are members of multiple groups:"
+msgstr ""
+
+#: users/admin.py:143
#, fuzzy
#| msgid "External Link"
msgid "Personal info"
msgstr "Externer Link"
-#: users/admin.py:121
+#: users/admin.py:144
#, fuzzy
#| msgid "Revision"
msgid "Permissions"
msgstr "Revision"
-#: users/admin.py:124
+#: users/admin.py:147
#, fuzzy
#| msgid "Import BOM data"
msgid "Important dates"
msgstr "Stückliste importieren"
-#: users/models.py:129
+#: users/models.py:130
msgid "Permission set"
msgstr ""
-#: users/models.py:137
+#: users/models.py:138
msgid "Group"
msgstr ""
-#: users/models.py:140
+#: users/models.py:141
msgid "View"
msgstr ""
-#: users/models.py:140
+#: users/models.py:141
msgid "Permission to view items"
msgstr ""
-#: users/models.py:142
+#: users/models.py:143
#, fuzzy
#| msgid "Address"
msgid "Add"
msgstr "Adresse"
-#: users/models.py:142
+#: users/models.py:143
msgid "Permission to add items"
msgstr ""
-#: users/models.py:144
+#: users/models.py:145
msgid "Change"
msgstr ""
-#: users/models.py:144
+#: users/models.py:145
msgid "Permissions to edit items"
msgstr ""
-#: users/models.py:146
+#: users/models.py:147
#, fuzzy
#| msgid "Remove selected BOM items"
msgid "Permission to delete items"
diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po
index aacb4b74ec..13e4832bc5 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: 2020-11-03 10:02+0000\n"
+"POT-Creation-Date: 2020-11-05 08:57+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -397,7 +397,7 @@ msgstr ""
#: order/templates/order/order_wizard/select_parts.html:30
#: order/templates/order/purchase_order_detail.html:148
#: order/templates/order/receive_parts.html:19 part/models.py:293
-#: part/templates/part/part_app_base.html:7
+#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:26
#: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133
#: templates/js/barcode.js:336 templates/js/bom.js:147 templates/js/bom.js:484
#: templates/js/build.js:647 templates/js/company.js:138
@@ -480,10 +480,10 @@ msgstr ""
msgid "Link to external URL"
msgstr ""
-#: build/models.py:181 build/templates/build/tabs.html:14 company/models.py:314
+#: build/models.py:181 build/templates/build/tabs.html:23 company/models.py:314
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18
#: order/templates/order/purchase_order_detail.html:203
-#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:70
+#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:73
#: stock/forms.py:306 stock/forms.py:338 stock/forms.py:366 stock/models.py:455
#: stock/models.py:1428 stock/templates/stock/tabs.html:26
#: templates/js/barcode.js:391 templates/js/bom.js:250
@@ -495,65 +495,65 @@ msgstr ""
msgid "Extra build notes"
msgstr ""
-#: build/models.py:543
+#: build/models.py:551
msgid "No build output specified"
msgstr ""
-#: build/models.py:546
+#: build/models.py:554
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:549
+#: build/models.py:557
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:620
+#: build/models.py:632
msgid "Completed build output"
msgstr ""
-#: build/models.py:858
+#: build/models.py:870
msgid "BuildItem must be unique for build, stock_item and install_into"
msgstr ""
-#: build/models.py:880
+#: build/models.py:892
msgid "Build item must specify a build output"
msgstr ""
-#: build/models.py:885
+#: build/models.py:897
#, python-brace-format
msgid "Selected stock item not found in BOM for part '{p}'"
msgstr ""
-#: build/models.py:889
+#: build/models.py:901
#, python-brace-format
msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
msgstr ""
-#: build/models.py:896 order/models.py:603
+#: build/models.py:908 order/models.py:603
msgid "StockItem is over-allocated"
msgstr ""
-#: build/models.py:900 order/models.py:606
+#: build/models.py:912 order/models.py:606
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:904
+#: build/models.py:916
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:944
+#: build/models.py:956
msgid "Build to allocate parts"
msgstr ""
-#: build/models.py:951
+#: build/models.py:963
msgid "Source stock item"
msgstr ""
-#: build/models.py:964
+#: build/models.py:976
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:972
+#: build/models.py:984
msgid "Destination stock item"
msgstr ""
@@ -565,47 +565,47 @@ msgstr ""
msgid "Build order has been completed"
msgstr ""
-#: build/templates/build/allocate.html:24
+#: build/templates/build/allocate.html:25
msgid "Create new build output"
msgstr ""
-#: build/templates/build/allocate.html:25
+#: build/templates/build/allocate.html:26
msgid "Create New Output"
msgstr ""
-#: build/templates/build/allocate.html:28
+#: build/templates/build/allocate.html:29
msgid "Order required parts"
msgstr ""
-#: build/templates/build/allocate.html:29
+#: build/templates/build/allocate.html:30
#: company/templates/company/detail_part.html:28 order/views.py:801
#: part/templates/part/category.html:125
msgid "Order Parts"
msgstr ""
-#: build/templates/build/allocate.html:32 templates/js/build.js:574
+#: build/templates/build/allocate.html:33 templates/js/build.js:574
msgid "Unallocate stock"
msgstr ""
-#: build/templates/build/allocate.html:33 build/views.py:341 build/views.py:778
+#: build/templates/build/allocate.html:34 build/views.py:341 build/views.py:778
msgid "Unallocate Stock"
msgstr ""
-#: build/templates/build/allocate.html:46
+#: build/templates/build/allocate.html:48
msgid "Create a new build output"
msgstr ""
-#: build/templates/build/allocate.html:47
+#: build/templates/build/allocate.html:49
msgid "No incomplete build outputs remain."
msgstr ""
-#: build/templates/build/allocate.html:48
+#: build/templates/build/allocate.html:50
msgid "Create a new build output using the button above"
msgstr ""
-#: build/templates/build/attachments.html:11 build/templates/build/tabs.html:17
+#: build/templates/build/attachments.html:11 build/templates/build/tabs.html:29
#: order/templates/order/po_tabs.html:11 order/templates/order/so_tabs.html:16
-#: part/templates/part/tabs.html:67 stock/templates/stock/tabs.html:32
+#: part/templates/part/tabs.html:70 stock/templates/stock/tabs.html:32
msgid "Attachments"
msgstr ""
@@ -698,7 +698,7 @@ msgstr ""
msgid "Sales Order"
msgstr ""
-#: build/templates/build/build_output.html:9 build/templates/build/tabs.html:11
+#: build/templates/build/build_output.html:9 build/templates/build/tabs.html:17
msgid "Build Outputs"
msgstr ""
@@ -855,8 +855,8 @@ msgstr ""
msgid "Details"
msgstr ""
-#: build/templates/build/tabs.html:8
-msgid "Allocate Parts"
+#: build/templates/build/tabs.html:10
+msgid "Incomplete"
msgstr ""
#: build/templates/build/unallocate.html:10
@@ -887,7 +887,7 @@ msgstr ""
msgid "Create Build Output"
msgstr ""
-#: build/views.py:207 stock/models.py:832 stock/views.py:1645
+#: build/views.py:207 stock/models.py:832 stock/views.py:1647
msgid "Serial numbers already exist"
msgstr ""
@@ -992,7 +992,7 @@ msgstr ""
msgid "Add Build Order Attachment"
msgstr ""
-#: build/views.py:1059 order/views.py:111 order/views.py:164 part/views.py:96
+#: build/views.py:1059 order/views.py:111 order/views.py:164 part/views.py:164
#: stock/views.py:176
msgid "Added attachment"
msgstr ""
@@ -1487,7 +1487,7 @@ msgid "Pricing Information"
msgstr ""
#: company/templates/company/supplier_part_pricing.html:17 company/views.py:410
-#: part/templates/part/sale_prices.html:13 part/views.py:2292
+#: part/templates/part/sale_prices.html:13 part/views.py:2360
msgid "Add Price Break"
msgstr ""
@@ -1614,15 +1614,15 @@ msgstr ""
msgid "Delete Supplier Part"
msgstr ""
-#: company/views.py:416 part/views.py:2298
+#: company/views.py:416 part/views.py:2366
msgid "Added new price break"
msgstr ""
-#: company/views.py:453 part/views.py:2343
+#: company/views.py:453 part/views.py:2411
msgid "Edit Price Break"
msgstr ""
-#: company/views.py:469 part/views.py:2359
+#: company/views.py:469 part/views.py:2427
msgid "Delete Price Break"
msgstr ""
@@ -1715,7 +1715,7 @@ msgstr ""
msgid "Date order was completed"
msgstr ""
-#: order/models.py:185 order/models.py:267 part/views.py:1409
+#: order/models.py:185 order/models.py:267 part/views.py:1477
#: stock/models.py:243 stock/models.py:816
msgid "Quantity must be greater than zero"
msgstr ""
@@ -2278,7 +2278,7 @@ msgstr ""
msgid "Include part supplier data in exported BOM"
msgstr ""
-#: part/forms.py:93 part/models.py:1582
+#: part/forms.py:93 part/models.py:1608
msgid "Parent Part"
msgstr ""
@@ -2302,35 +2302,39 @@ msgstr ""
msgid "Select BOM file to upload"
msgstr ""
-#: part/forms.py:159
-msgid "Select part category"
+#: part/forms.py:154
+msgid "Related Part"
msgstr ""
#: part/forms.py:173
+msgid "Select part category"
+msgstr ""
+
+#: part/forms.py:187
msgid "Duplicate all BOM data for this part"
msgstr ""
-#: part/forms.py:174
+#: part/forms.py:188
msgid "Copy BOM"
msgstr ""
-#: part/forms.py:179
+#: part/forms.py:193
msgid "Duplicate all parameter data for this part"
msgstr ""
-#: part/forms.py:180
+#: part/forms.py:194
msgid "Copy Parameters"
msgstr ""
-#: part/forms.py:185
+#: part/forms.py:199
msgid "Confirm part creation"
msgstr ""
-#: part/forms.py:279
+#: part/forms.py:293
msgid "Input quantity for price calculation"
msgstr ""
-#: part/forms.py:282
+#: part/forms.py:296
msgid "Select currency for price calculation"
msgstr ""
@@ -2456,116 +2460,126 @@ msgstr ""
msgid "Stored BOM checksum"
msgstr ""
-#: part/models.py:1455
+#: part/models.py:1481
msgid "Test templates can only be created for trackable parts"
msgstr ""
-#: part/models.py:1472
+#: part/models.py:1498
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:1491 templates/js/part.js:567 templates/js/stock.js:92
+#: part/models.py:1517 templates/js/part.js:567 templates/js/stock.js:92
msgid "Test Name"
msgstr ""
-#: part/models.py:1492
+#: part/models.py:1518
msgid "Enter a name for the test"
msgstr ""
-#: part/models.py:1497
+#: part/models.py:1523
msgid "Test Description"
msgstr ""
-#: part/models.py:1498
+#: part/models.py:1524
msgid "Enter description for this test"
msgstr ""
-#: part/models.py:1503 templates/js/part.js:576
+#: part/models.py:1529 templates/js/part.js:576
#: templates/js/table_filters.js:172
msgid "Required"
msgstr ""
-#: part/models.py:1504
+#: part/models.py:1530
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:1509 templates/js/part.js:584
+#: part/models.py:1535 templates/js/part.js:584
msgid "Requires Value"
msgstr ""
-#: part/models.py:1510
+#: part/models.py:1536
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:1515 templates/js/part.js:591
+#: part/models.py:1541 templates/js/part.js:591
msgid "Requires Attachment"
msgstr ""
-#: part/models.py:1516
+#: part/models.py:1542
msgid "Does this test require a file attachment when adding a test result?"
msgstr ""
-#: part/models.py:1549
+#: part/models.py:1575
msgid "Parameter template name must be unique"
msgstr ""
-#: part/models.py:1554
+#: part/models.py:1580
msgid "Parameter Name"
msgstr ""
-#: part/models.py:1556
+#: part/models.py:1582
msgid "Parameter Units"
msgstr ""
-#: part/models.py:1584
+#: part/models.py:1610
msgid "Parameter Template"
msgstr ""
-#: part/models.py:1586
+#: part/models.py:1612
msgid "Parameter Value"
msgstr ""
-#: part/models.py:1623
+#: part/models.py:1649
msgid "Select parent part"
msgstr ""
-#: part/models.py:1631
+#: part/models.py:1657
msgid "Select part to be used in BOM"
msgstr ""
-#: part/models.py:1637
+#: part/models.py:1663
msgid "BOM quantity for this BOM item"
msgstr ""
-#: part/models.py:1639
+#: part/models.py:1665
msgid "This BOM item is optional"
msgstr ""
-#: part/models.py:1642
+#: part/models.py:1668
msgid "Estimated build wastage quantity (absolute or percentage)"
msgstr ""
-#: part/models.py:1645
+#: part/models.py:1671
msgid "BOM item reference"
msgstr ""
-#: part/models.py:1648
+#: part/models.py:1674
msgid "BOM item notes"
msgstr ""
-#: part/models.py:1650
+#: part/models.py:1676
msgid "BOM line checksum"
msgstr ""
-#: part/models.py:1717 part/views.py:1415 part/views.py:1467
+#: part/models.py:1743 part/views.py:1483 part/views.py:1535
#: stock/models.py:233
msgid "Quantity must be integer value for trackable parts"
msgstr ""
-#: part/models.py:1733
+#: part/models.py:1759
msgid "BOM Item"
msgstr ""
+#: part/models.py:1874
+msgid "Select Related Part"
+msgstr ""
+
+#: part/models.py:1906
+msgid ""
+"Error creating relationship: check that the part is not related to itself "
+"and that the relationship is unique"
+msgstr ""
+
#: part/templates/part/allocation.html:10
msgid "Part Stock Allocations"
msgstr ""
@@ -2648,7 +2662,7 @@ msgstr ""
msgid "Validate"
msgstr ""
-#: part/templates/part/bom.html:62 part/views.py:1706
+#: part/templates/part/bom.html:62 part/views.py:1774
msgid "Export Bill of Materials"
msgstr ""
@@ -2744,7 +2758,7 @@ msgstr ""
msgid "All parts"
msgstr ""
-#: part/templates/part/category.html:24 part/views.py:2109
+#: part/templates/part/category.html:24 part/views.py:2177
msgid "Create new part category"
msgstr ""
@@ -3007,8 +3021,8 @@ msgstr ""
msgid "Value"
msgstr ""
-#: part/templates/part/params.html:41 part/templates/part/supplier.html:19
-#: users/models.py:146
+#: part/templates/part/params.html:41 part/templates/part/related.html:41
+#: part/templates/part/supplier.html:19 users/models.py:147
msgid "Delete"
msgstr ""
@@ -3115,6 +3129,14 @@ msgstr ""
msgid "Upload new image"
msgstr ""
+#: part/templates/part/related.html:9
+msgid "Related Parts"
+msgstr ""
+
+#: part/templates/part/related.html:15
+msgid "Add Related"
+msgstr ""
+
#: part/templates/part/sale_prices.html:9 part/templates/part/tabs.html:53
msgid "Sale Price"
msgstr ""
@@ -3184,6 +3206,10 @@ msgstr ""
msgid "Tests"
msgstr ""
+#: part/templates/part/tabs.html:67
+msgid "Related"
+msgstr ""
+
#: part/templates/part/track.html:8
msgid "Part Tracking"
msgstr ""
@@ -3205,199 +3231,207 @@ msgid "New Variant"
msgstr ""
#: part/views.py:80
+msgid "Add Related Part"
+msgstr ""
+
+#: part/views.py:136
+msgid "Delete Related Part"
+msgstr ""
+
+#: part/views.py:148
msgid "Add part attachment"
msgstr ""
-#: part/views.py:135 templates/attachment_table.html:34
+#: part/views.py:203 templates/attachment_table.html:34
msgid "Edit attachment"
msgstr ""
-#: part/views.py:141
+#: part/views.py:209
msgid "Part attachment updated"
msgstr ""
-#: part/views.py:156
+#: part/views.py:224
msgid "Delete Part Attachment"
msgstr ""
-#: part/views.py:164
+#: part/views.py:232
msgid "Deleted part attachment"
msgstr ""
-#: part/views.py:173
+#: part/views.py:241
msgid "Create Test Template"
msgstr ""
-#: part/views.py:202
+#: part/views.py:270
msgid "Edit Test Template"
msgstr ""
-#: part/views.py:218
+#: part/views.py:286
msgid "Delete Test Template"
msgstr ""
-#: part/views.py:227
+#: part/views.py:295
msgid "Set Part Category"
msgstr ""
-#: part/views.py:277
+#: part/views.py:345
#, python-brace-format
msgid "Set category for {n} parts"
msgstr ""
-#: part/views.py:312
+#: part/views.py:380
msgid "Create Variant"
msgstr ""
-#: part/views.py:394
+#: part/views.py:462
msgid "Duplicate Part"
msgstr ""
-#: part/views.py:401
+#: part/views.py:469
msgid "Copied part"
msgstr ""
-#: part/views.py:455 part/views.py:585
+#: part/views.py:523 part/views.py:653
msgid "Possible matches exist - confirm creation of new part"
msgstr ""
-#: part/views.py:520 templates/js/stock.js:840
+#: part/views.py:588 templates/js/stock.js:840
msgid "Create New Part"
msgstr ""
-#: part/views.py:527
+#: part/views.py:595
msgid "Created new part"
msgstr ""
-#: part/views.py:743
+#: part/views.py:811
msgid "Part QR Code"
msgstr ""
-#: part/views.py:762
+#: part/views.py:830
msgid "Upload Part Image"
msgstr ""
-#: part/views.py:770 part/views.py:807
+#: part/views.py:838 part/views.py:875
msgid "Updated part image"
msgstr ""
-#: part/views.py:779
+#: part/views.py:847
msgid "Select Part Image"
msgstr ""
-#: part/views.py:810
+#: part/views.py:878
msgid "Part image not found"
msgstr ""
-#: part/views.py:821
+#: part/views.py:889
msgid "Edit Part Properties"
msgstr ""
-#: part/views.py:848
+#: part/views.py:916
msgid "Duplicate BOM"
msgstr ""
-#: part/views.py:879
+#: part/views.py:947
msgid "Confirm duplication of BOM from parent"
msgstr ""
-#: part/views.py:900
+#: part/views.py:968
msgid "Validate BOM"
msgstr ""
-#: part/views.py:923
+#: part/views.py:991
msgid "Confirm that the BOM is valid"
msgstr ""
-#: part/views.py:934
+#: part/views.py:1002
msgid "Validated Bill of Materials"
msgstr ""
-#: part/views.py:1068
+#: part/views.py:1136
msgid "No BOM file provided"
msgstr ""
-#: part/views.py:1418
+#: part/views.py:1486
msgid "Enter a valid quantity"
msgstr ""
-#: part/views.py:1443 part/views.py:1446
+#: part/views.py:1511 part/views.py:1514
msgid "Select valid part"
msgstr ""
-#: part/views.py:1452
+#: part/views.py:1520
msgid "Duplicate part selected"
msgstr ""
-#: part/views.py:1490
+#: part/views.py:1558
msgid "Select a part"
msgstr ""
-#: part/views.py:1496
+#: part/views.py:1564
msgid "Selected part creates a circular BOM"
msgstr ""
-#: part/views.py:1500
+#: part/views.py:1568
msgid "Specify quantity"
msgstr ""
-#: part/views.py:1756
+#: part/views.py:1824
msgid "Confirm Part Deletion"
msgstr ""
-#: part/views.py:1765
+#: part/views.py:1833
msgid "Part was deleted"
msgstr ""
-#: part/views.py:1774
+#: part/views.py:1842
msgid "Part Pricing"
msgstr ""
-#: part/views.py:1900
+#: part/views.py:1968
msgid "Create Part Parameter Template"
msgstr ""
-#: part/views.py:1910
+#: part/views.py:1978
msgid "Edit Part Parameter Template"
msgstr ""
-#: part/views.py:1919
+#: part/views.py:1987
msgid "Delete Part Parameter Template"
msgstr ""
-#: part/views.py:1929
+#: part/views.py:1997
msgid "Create Part Parameter"
msgstr ""
-#: part/views.py:1981
+#: part/views.py:2049
msgid "Edit Part Parameter"
msgstr ""
-#: part/views.py:1997
+#: part/views.py:2065
msgid "Delete Part Parameter"
msgstr ""
-#: part/views.py:2056
+#: part/views.py:2124
msgid "Edit Part Category"
msgstr ""
-#: part/views.py:2093
+#: part/views.py:2161
msgid "Delete Part Category"
msgstr ""
-#: part/views.py:2101
+#: part/views.py:2169
msgid "Part category was deleted"
msgstr ""
-#: part/views.py:2164
+#: part/views.py:2232
msgid "Create BOM Item"
msgstr ""
-#: part/views.py:2232
+#: part/views.py:2300
msgid "Edit BOM item"
msgstr ""
-#: part/views.py:2282
+#: part/views.py:2350
msgid "Confim BOM item deletion"
msgstr ""
@@ -4198,48 +4232,48 @@ msgstr ""
msgid "Create new Stock Item"
msgstr ""
-#: stock/views.py:1553
+#: stock/views.py:1555
msgid "Duplicate Stock Item"
msgstr ""
-#: stock/views.py:1619
+#: stock/views.py:1621
msgid "Invalid quantity"
msgstr ""
-#: stock/views.py:1622
+#: stock/views.py:1624
msgid "Quantity cannot be less than zero"
msgstr ""
-#: stock/views.py:1626
+#: stock/views.py:1628
msgid "Invalid part selection"
msgstr ""
-#: stock/views.py:1674
+#: stock/views.py:1676
#, python-brace-format
msgid "Created {n} new stock items"
msgstr ""
-#: stock/views.py:1693 stock/views.py:1709
+#: stock/views.py:1695 stock/views.py:1711
msgid "Created new stock item"
msgstr ""
-#: stock/views.py:1728
+#: stock/views.py:1730
msgid "Delete Stock Location"
msgstr ""
-#: stock/views.py:1742
+#: stock/views.py:1744
msgid "Delete Stock Item"
msgstr ""
-#: stock/views.py:1754
+#: stock/views.py:1756
msgid "Delete Stock Tracking Entry"
msgstr ""
-#: stock/views.py:1773
+#: stock/views.py:1775
msgid "Edit Stock Tracking Entry"
msgstr ""
-#: stock/views.py:1783
+#: stock/views.py:1785
msgid "Add Stock Tracking Entry"
msgstr ""
@@ -5102,58 +5136,62 @@ msgstr ""
msgid "Delete Stock"
msgstr ""
-#: users/admin.py:61
+#: users/admin.py:62
msgid "Users"
msgstr ""
-#: users/admin.py:62
+#: users/admin.py:63
msgid "Select which users are assigned to this group"
msgstr ""
#: users/admin.py:120
+msgid "The following users are members of multiple groups:"
+msgstr ""
+
+#: users/admin.py:143
msgid "Personal info"
msgstr ""
-#: users/admin.py:121
+#: users/admin.py:144
msgid "Permissions"
msgstr ""
-#: users/admin.py:124
+#: users/admin.py:147
msgid "Important dates"
msgstr ""
-#: users/models.py:129
+#: users/models.py:130
msgid "Permission set"
msgstr ""
-#: users/models.py:137
+#: users/models.py:138
msgid "Group"
msgstr ""
-#: users/models.py:140
+#: users/models.py:141
msgid "View"
msgstr ""
-#: users/models.py:140
+#: users/models.py:141
msgid "Permission to view items"
msgstr ""
-#: users/models.py:142
+#: users/models.py:143
msgid "Add"
msgstr ""
-#: users/models.py:142
+#: users/models.py:143
msgid "Permission to add items"
msgstr ""
-#: users/models.py:144
+#: users/models.py:145
msgid "Change"
msgstr ""
-#: users/models.py:144
+#: users/models.py:145
msgid "Permissions to edit items"
msgstr ""
-#: users/models.py:146
+#: users/models.py:147
msgid "Permission to delete items"
msgstr ""
diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po
index aacb4b74ec..13e4832bc5 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: 2020-11-03 10:02+0000\n"
+"POT-Creation-Date: 2020-11-05 08:57+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -397,7 +397,7 @@ msgstr ""
#: order/templates/order/order_wizard/select_parts.html:30
#: order/templates/order/purchase_order_detail.html:148
#: order/templates/order/receive_parts.html:19 part/models.py:293
-#: part/templates/part/part_app_base.html:7
+#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:26
#: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133
#: templates/js/barcode.js:336 templates/js/bom.js:147 templates/js/bom.js:484
#: templates/js/build.js:647 templates/js/company.js:138
@@ -480,10 +480,10 @@ msgstr ""
msgid "Link to external URL"
msgstr ""
-#: build/models.py:181 build/templates/build/tabs.html:14 company/models.py:314
+#: build/models.py:181 build/templates/build/tabs.html:23 company/models.py:314
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18
#: order/templates/order/purchase_order_detail.html:203
-#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:70
+#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:73
#: stock/forms.py:306 stock/forms.py:338 stock/forms.py:366 stock/models.py:455
#: stock/models.py:1428 stock/templates/stock/tabs.html:26
#: templates/js/barcode.js:391 templates/js/bom.js:250
@@ -495,65 +495,65 @@ msgstr ""
msgid "Extra build notes"
msgstr ""
-#: build/models.py:543
+#: build/models.py:551
msgid "No build output specified"
msgstr ""
-#: build/models.py:546
+#: build/models.py:554
msgid "Build output is already completed"
msgstr ""
-#: build/models.py:549
+#: build/models.py:557
msgid "Build output does not match Build Order"
msgstr ""
-#: build/models.py:620
+#: build/models.py:632
msgid "Completed build output"
msgstr ""
-#: build/models.py:858
+#: build/models.py:870
msgid "BuildItem must be unique for build, stock_item and install_into"
msgstr ""
-#: build/models.py:880
+#: build/models.py:892
msgid "Build item must specify a build output"
msgstr ""
-#: build/models.py:885
+#: build/models.py:897
#, python-brace-format
msgid "Selected stock item not found in BOM for part '{p}'"
msgstr ""
-#: build/models.py:889
+#: build/models.py:901
#, python-brace-format
msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
msgstr ""
-#: build/models.py:896 order/models.py:603
+#: build/models.py:908 order/models.py:603
msgid "StockItem is over-allocated"
msgstr ""
-#: build/models.py:900 order/models.py:606
+#: build/models.py:912 order/models.py:606
msgid "Allocation quantity must be greater than zero"
msgstr ""
-#: build/models.py:904
+#: build/models.py:916
msgid "Quantity must be 1 for serialized stock"
msgstr ""
-#: build/models.py:944
+#: build/models.py:956
msgid "Build to allocate parts"
msgstr ""
-#: build/models.py:951
+#: build/models.py:963
msgid "Source stock item"
msgstr ""
-#: build/models.py:964
+#: build/models.py:976
msgid "Stock quantity to allocate to build"
msgstr ""
-#: build/models.py:972
+#: build/models.py:984
msgid "Destination stock item"
msgstr ""
@@ -565,47 +565,47 @@ msgstr ""
msgid "Build order has been completed"
msgstr ""
-#: build/templates/build/allocate.html:24
+#: build/templates/build/allocate.html:25
msgid "Create new build output"
msgstr ""
-#: build/templates/build/allocate.html:25
+#: build/templates/build/allocate.html:26
msgid "Create New Output"
msgstr ""
-#: build/templates/build/allocate.html:28
+#: build/templates/build/allocate.html:29
msgid "Order required parts"
msgstr ""
-#: build/templates/build/allocate.html:29
+#: build/templates/build/allocate.html:30
#: company/templates/company/detail_part.html:28 order/views.py:801
#: part/templates/part/category.html:125
msgid "Order Parts"
msgstr ""
-#: build/templates/build/allocate.html:32 templates/js/build.js:574
+#: build/templates/build/allocate.html:33 templates/js/build.js:574
msgid "Unallocate stock"
msgstr ""
-#: build/templates/build/allocate.html:33 build/views.py:341 build/views.py:778
+#: build/templates/build/allocate.html:34 build/views.py:341 build/views.py:778
msgid "Unallocate Stock"
msgstr ""
-#: build/templates/build/allocate.html:46
+#: build/templates/build/allocate.html:48
msgid "Create a new build output"
msgstr ""
-#: build/templates/build/allocate.html:47
+#: build/templates/build/allocate.html:49
msgid "No incomplete build outputs remain."
msgstr ""
-#: build/templates/build/allocate.html:48
+#: build/templates/build/allocate.html:50
msgid "Create a new build output using the button above"
msgstr ""
-#: build/templates/build/attachments.html:11 build/templates/build/tabs.html:17
+#: build/templates/build/attachments.html:11 build/templates/build/tabs.html:29
#: order/templates/order/po_tabs.html:11 order/templates/order/so_tabs.html:16
-#: part/templates/part/tabs.html:67 stock/templates/stock/tabs.html:32
+#: part/templates/part/tabs.html:70 stock/templates/stock/tabs.html:32
msgid "Attachments"
msgstr ""
@@ -698,7 +698,7 @@ msgstr ""
msgid "Sales Order"
msgstr ""
-#: build/templates/build/build_output.html:9 build/templates/build/tabs.html:11
+#: build/templates/build/build_output.html:9 build/templates/build/tabs.html:17
msgid "Build Outputs"
msgstr ""
@@ -855,8 +855,8 @@ msgstr ""
msgid "Details"
msgstr ""
-#: build/templates/build/tabs.html:8
-msgid "Allocate Parts"
+#: build/templates/build/tabs.html:10
+msgid "Incomplete"
msgstr ""
#: build/templates/build/unallocate.html:10
@@ -887,7 +887,7 @@ msgstr ""
msgid "Create Build Output"
msgstr ""
-#: build/views.py:207 stock/models.py:832 stock/views.py:1645
+#: build/views.py:207 stock/models.py:832 stock/views.py:1647
msgid "Serial numbers already exist"
msgstr ""
@@ -992,7 +992,7 @@ msgstr ""
msgid "Add Build Order Attachment"
msgstr ""
-#: build/views.py:1059 order/views.py:111 order/views.py:164 part/views.py:96
+#: build/views.py:1059 order/views.py:111 order/views.py:164 part/views.py:164
#: stock/views.py:176
msgid "Added attachment"
msgstr ""
@@ -1487,7 +1487,7 @@ msgid "Pricing Information"
msgstr ""
#: company/templates/company/supplier_part_pricing.html:17 company/views.py:410
-#: part/templates/part/sale_prices.html:13 part/views.py:2292
+#: part/templates/part/sale_prices.html:13 part/views.py:2360
msgid "Add Price Break"
msgstr ""
@@ -1614,15 +1614,15 @@ msgstr ""
msgid "Delete Supplier Part"
msgstr ""
-#: company/views.py:416 part/views.py:2298
+#: company/views.py:416 part/views.py:2366
msgid "Added new price break"
msgstr ""
-#: company/views.py:453 part/views.py:2343
+#: company/views.py:453 part/views.py:2411
msgid "Edit Price Break"
msgstr ""
-#: company/views.py:469 part/views.py:2359
+#: company/views.py:469 part/views.py:2427
msgid "Delete Price Break"
msgstr ""
@@ -1715,7 +1715,7 @@ msgstr ""
msgid "Date order was completed"
msgstr ""
-#: order/models.py:185 order/models.py:267 part/views.py:1409
+#: order/models.py:185 order/models.py:267 part/views.py:1477
#: stock/models.py:243 stock/models.py:816
msgid "Quantity must be greater than zero"
msgstr ""
@@ -2278,7 +2278,7 @@ msgstr ""
msgid "Include part supplier data in exported BOM"
msgstr ""
-#: part/forms.py:93 part/models.py:1582
+#: part/forms.py:93 part/models.py:1608
msgid "Parent Part"
msgstr ""
@@ -2302,35 +2302,39 @@ msgstr ""
msgid "Select BOM file to upload"
msgstr ""
-#: part/forms.py:159
-msgid "Select part category"
+#: part/forms.py:154
+msgid "Related Part"
msgstr ""
#: part/forms.py:173
+msgid "Select part category"
+msgstr ""
+
+#: part/forms.py:187
msgid "Duplicate all BOM data for this part"
msgstr ""
-#: part/forms.py:174
+#: part/forms.py:188
msgid "Copy BOM"
msgstr ""
-#: part/forms.py:179
+#: part/forms.py:193
msgid "Duplicate all parameter data for this part"
msgstr ""
-#: part/forms.py:180
+#: part/forms.py:194
msgid "Copy Parameters"
msgstr ""
-#: part/forms.py:185
+#: part/forms.py:199
msgid "Confirm part creation"
msgstr ""
-#: part/forms.py:279
+#: part/forms.py:293
msgid "Input quantity for price calculation"
msgstr ""
-#: part/forms.py:282
+#: part/forms.py:296
msgid "Select currency for price calculation"
msgstr ""
@@ -2456,116 +2460,126 @@ msgstr ""
msgid "Stored BOM checksum"
msgstr ""
-#: part/models.py:1455
+#: part/models.py:1481
msgid "Test templates can only be created for trackable parts"
msgstr ""
-#: part/models.py:1472
+#: part/models.py:1498
msgid "Test with this name already exists for this part"
msgstr ""
-#: part/models.py:1491 templates/js/part.js:567 templates/js/stock.js:92
+#: part/models.py:1517 templates/js/part.js:567 templates/js/stock.js:92
msgid "Test Name"
msgstr ""
-#: part/models.py:1492
+#: part/models.py:1518
msgid "Enter a name for the test"
msgstr ""
-#: part/models.py:1497
+#: part/models.py:1523
msgid "Test Description"
msgstr ""
-#: part/models.py:1498
+#: part/models.py:1524
msgid "Enter description for this test"
msgstr ""
-#: part/models.py:1503 templates/js/part.js:576
+#: part/models.py:1529 templates/js/part.js:576
#: templates/js/table_filters.js:172
msgid "Required"
msgstr ""
-#: part/models.py:1504
+#: part/models.py:1530
msgid "Is this test required to pass?"
msgstr ""
-#: part/models.py:1509 templates/js/part.js:584
+#: part/models.py:1535 templates/js/part.js:584
msgid "Requires Value"
msgstr ""
-#: part/models.py:1510
+#: part/models.py:1536
msgid "Does this test require a value when adding a test result?"
msgstr ""
-#: part/models.py:1515 templates/js/part.js:591
+#: part/models.py:1541 templates/js/part.js:591
msgid "Requires Attachment"
msgstr ""
-#: part/models.py:1516
+#: part/models.py:1542
msgid "Does this test require a file attachment when adding a test result?"
msgstr ""
-#: part/models.py:1549
+#: part/models.py:1575
msgid "Parameter template name must be unique"
msgstr ""
-#: part/models.py:1554
+#: part/models.py:1580
msgid "Parameter Name"
msgstr ""
-#: part/models.py:1556
+#: part/models.py:1582
msgid "Parameter Units"
msgstr ""
-#: part/models.py:1584
+#: part/models.py:1610
msgid "Parameter Template"
msgstr ""
-#: part/models.py:1586
+#: part/models.py:1612
msgid "Parameter Value"
msgstr ""
-#: part/models.py:1623
+#: part/models.py:1649
msgid "Select parent part"
msgstr ""
-#: part/models.py:1631
+#: part/models.py:1657
msgid "Select part to be used in BOM"
msgstr ""
-#: part/models.py:1637
+#: part/models.py:1663
msgid "BOM quantity for this BOM item"
msgstr ""
-#: part/models.py:1639
+#: part/models.py:1665
msgid "This BOM item is optional"
msgstr ""
-#: part/models.py:1642
+#: part/models.py:1668
msgid "Estimated build wastage quantity (absolute or percentage)"
msgstr ""
-#: part/models.py:1645
+#: part/models.py:1671
msgid "BOM item reference"
msgstr ""
-#: part/models.py:1648
+#: part/models.py:1674
msgid "BOM item notes"
msgstr ""
-#: part/models.py:1650
+#: part/models.py:1676
msgid "BOM line checksum"
msgstr ""
-#: part/models.py:1717 part/views.py:1415 part/views.py:1467
+#: part/models.py:1743 part/views.py:1483 part/views.py:1535
#: stock/models.py:233
msgid "Quantity must be integer value for trackable parts"
msgstr ""
-#: part/models.py:1733
+#: part/models.py:1759
msgid "BOM Item"
msgstr ""
+#: part/models.py:1874
+msgid "Select Related Part"
+msgstr ""
+
+#: part/models.py:1906
+msgid ""
+"Error creating relationship: check that the part is not related to itself "
+"and that the relationship is unique"
+msgstr ""
+
#: part/templates/part/allocation.html:10
msgid "Part Stock Allocations"
msgstr ""
@@ -2648,7 +2662,7 @@ msgstr ""
msgid "Validate"
msgstr ""
-#: part/templates/part/bom.html:62 part/views.py:1706
+#: part/templates/part/bom.html:62 part/views.py:1774
msgid "Export Bill of Materials"
msgstr ""
@@ -2744,7 +2758,7 @@ msgstr ""
msgid "All parts"
msgstr ""
-#: part/templates/part/category.html:24 part/views.py:2109
+#: part/templates/part/category.html:24 part/views.py:2177
msgid "Create new part category"
msgstr ""
@@ -3007,8 +3021,8 @@ msgstr ""
msgid "Value"
msgstr ""
-#: part/templates/part/params.html:41 part/templates/part/supplier.html:19
-#: users/models.py:146
+#: part/templates/part/params.html:41 part/templates/part/related.html:41
+#: part/templates/part/supplier.html:19 users/models.py:147
msgid "Delete"
msgstr ""
@@ -3115,6 +3129,14 @@ msgstr ""
msgid "Upload new image"
msgstr ""
+#: part/templates/part/related.html:9
+msgid "Related Parts"
+msgstr ""
+
+#: part/templates/part/related.html:15
+msgid "Add Related"
+msgstr ""
+
#: part/templates/part/sale_prices.html:9 part/templates/part/tabs.html:53
msgid "Sale Price"
msgstr ""
@@ -3184,6 +3206,10 @@ msgstr ""
msgid "Tests"
msgstr ""
+#: part/templates/part/tabs.html:67
+msgid "Related"
+msgstr ""
+
#: part/templates/part/track.html:8
msgid "Part Tracking"
msgstr ""
@@ -3205,199 +3231,207 @@ msgid "New Variant"
msgstr ""
#: part/views.py:80
+msgid "Add Related Part"
+msgstr ""
+
+#: part/views.py:136
+msgid "Delete Related Part"
+msgstr ""
+
+#: part/views.py:148
msgid "Add part attachment"
msgstr ""
-#: part/views.py:135 templates/attachment_table.html:34
+#: part/views.py:203 templates/attachment_table.html:34
msgid "Edit attachment"
msgstr ""
-#: part/views.py:141
+#: part/views.py:209
msgid "Part attachment updated"
msgstr ""
-#: part/views.py:156
+#: part/views.py:224
msgid "Delete Part Attachment"
msgstr ""
-#: part/views.py:164
+#: part/views.py:232
msgid "Deleted part attachment"
msgstr ""
-#: part/views.py:173
+#: part/views.py:241
msgid "Create Test Template"
msgstr ""
-#: part/views.py:202
+#: part/views.py:270
msgid "Edit Test Template"
msgstr ""
-#: part/views.py:218
+#: part/views.py:286
msgid "Delete Test Template"
msgstr ""
-#: part/views.py:227
+#: part/views.py:295
msgid "Set Part Category"
msgstr ""
-#: part/views.py:277
+#: part/views.py:345
#, python-brace-format
msgid "Set category for {n} parts"
msgstr ""
-#: part/views.py:312
+#: part/views.py:380
msgid "Create Variant"
msgstr ""
-#: part/views.py:394
+#: part/views.py:462
msgid "Duplicate Part"
msgstr ""
-#: part/views.py:401
+#: part/views.py:469
msgid "Copied part"
msgstr ""
-#: part/views.py:455 part/views.py:585
+#: part/views.py:523 part/views.py:653
msgid "Possible matches exist - confirm creation of new part"
msgstr ""
-#: part/views.py:520 templates/js/stock.js:840
+#: part/views.py:588 templates/js/stock.js:840
msgid "Create New Part"
msgstr ""
-#: part/views.py:527
+#: part/views.py:595
msgid "Created new part"
msgstr ""
-#: part/views.py:743
+#: part/views.py:811
msgid "Part QR Code"
msgstr ""
-#: part/views.py:762
+#: part/views.py:830
msgid "Upload Part Image"
msgstr ""
-#: part/views.py:770 part/views.py:807
+#: part/views.py:838 part/views.py:875
msgid "Updated part image"
msgstr ""
-#: part/views.py:779
+#: part/views.py:847
msgid "Select Part Image"
msgstr ""
-#: part/views.py:810
+#: part/views.py:878
msgid "Part image not found"
msgstr ""
-#: part/views.py:821
+#: part/views.py:889
msgid "Edit Part Properties"
msgstr ""
-#: part/views.py:848
+#: part/views.py:916
msgid "Duplicate BOM"
msgstr ""
-#: part/views.py:879
+#: part/views.py:947
msgid "Confirm duplication of BOM from parent"
msgstr ""
-#: part/views.py:900
+#: part/views.py:968
msgid "Validate BOM"
msgstr ""
-#: part/views.py:923
+#: part/views.py:991
msgid "Confirm that the BOM is valid"
msgstr ""
-#: part/views.py:934
+#: part/views.py:1002
msgid "Validated Bill of Materials"
msgstr ""
-#: part/views.py:1068
+#: part/views.py:1136
msgid "No BOM file provided"
msgstr ""
-#: part/views.py:1418
+#: part/views.py:1486
msgid "Enter a valid quantity"
msgstr ""
-#: part/views.py:1443 part/views.py:1446
+#: part/views.py:1511 part/views.py:1514
msgid "Select valid part"
msgstr ""
-#: part/views.py:1452
+#: part/views.py:1520
msgid "Duplicate part selected"
msgstr ""
-#: part/views.py:1490
+#: part/views.py:1558
msgid "Select a part"
msgstr ""
-#: part/views.py:1496
+#: part/views.py:1564
msgid "Selected part creates a circular BOM"
msgstr ""
-#: part/views.py:1500
+#: part/views.py:1568
msgid "Specify quantity"
msgstr ""
-#: part/views.py:1756
+#: part/views.py:1824
msgid "Confirm Part Deletion"
msgstr ""
-#: part/views.py:1765
+#: part/views.py:1833
msgid "Part was deleted"
msgstr ""
-#: part/views.py:1774
+#: part/views.py:1842
msgid "Part Pricing"
msgstr ""
-#: part/views.py:1900
+#: part/views.py:1968
msgid "Create Part Parameter Template"
msgstr ""
-#: part/views.py:1910
+#: part/views.py:1978
msgid "Edit Part Parameter Template"
msgstr ""
-#: part/views.py:1919
+#: part/views.py:1987
msgid "Delete Part Parameter Template"
msgstr ""
-#: part/views.py:1929
+#: part/views.py:1997
msgid "Create Part Parameter"
msgstr ""
-#: part/views.py:1981
+#: part/views.py:2049
msgid "Edit Part Parameter"
msgstr ""
-#: part/views.py:1997
+#: part/views.py:2065
msgid "Delete Part Parameter"
msgstr ""
-#: part/views.py:2056
+#: part/views.py:2124
msgid "Edit Part Category"
msgstr ""
-#: part/views.py:2093
+#: part/views.py:2161
msgid "Delete Part Category"
msgstr ""
-#: part/views.py:2101
+#: part/views.py:2169
msgid "Part category was deleted"
msgstr ""
-#: part/views.py:2164
+#: part/views.py:2232
msgid "Create BOM Item"
msgstr ""
-#: part/views.py:2232
+#: part/views.py:2300
msgid "Edit BOM item"
msgstr ""
-#: part/views.py:2282
+#: part/views.py:2350
msgid "Confim BOM item deletion"
msgstr ""
@@ -4198,48 +4232,48 @@ msgstr ""
msgid "Create new Stock Item"
msgstr ""
-#: stock/views.py:1553
+#: stock/views.py:1555
msgid "Duplicate Stock Item"
msgstr ""
-#: stock/views.py:1619
+#: stock/views.py:1621
msgid "Invalid quantity"
msgstr ""
-#: stock/views.py:1622
+#: stock/views.py:1624
msgid "Quantity cannot be less than zero"
msgstr ""
-#: stock/views.py:1626
+#: stock/views.py:1628
msgid "Invalid part selection"
msgstr ""
-#: stock/views.py:1674
+#: stock/views.py:1676
#, python-brace-format
msgid "Created {n} new stock items"
msgstr ""
-#: stock/views.py:1693 stock/views.py:1709
+#: stock/views.py:1695 stock/views.py:1711
msgid "Created new stock item"
msgstr ""
-#: stock/views.py:1728
+#: stock/views.py:1730
msgid "Delete Stock Location"
msgstr ""
-#: stock/views.py:1742
+#: stock/views.py:1744
msgid "Delete Stock Item"
msgstr ""
-#: stock/views.py:1754
+#: stock/views.py:1756
msgid "Delete Stock Tracking Entry"
msgstr ""
-#: stock/views.py:1773
+#: stock/views.py:1775
msgid "Edit Stock Tracking Entry"
msgstr ""
-#: stock/views.py:1783
+#: stock/views.py:1785
msgid "Add Stock Tracking Entry"
msgstr ""
@@ -5102,58 +5136,62 @@ msgstr ""
msgid "Delete Stock"
msgstr ""
-#: users/admin.py:61
+#: users/admin.py:62
msgid "Users"
msgstr ""
-#: users/admin.py:62
+#: users/admin.py:63
msgid "Select which users are assigned to this group"
msgstr ""
#: users/admin.py:120
+msgid "The following users are members of multiple groups:"
+msgstr ""
+
+#: users/admin.py:143
msgid "Personal info"
msgstr ""
-#: users/admin.py:121
+#: users/admin.py:144
msgid "Permissions"
msgstr ""
-#: users/admin.py:124
+#: users/admin.py:147
msgid "Important dates"
msgstr ""
-#: users/models.py:129
+#: users/models.py:130
msgid "Permission set"
msgstr ""
-#: users/models.py:137
+#: users/models.py:138
msgid "Group"
msgstr ""
-#: users/models.py:140
+#: users/models.py:141
msgid "View"
msgstr ""
-#: users/models.py:140
+#: users/models.py:141
msgid "Permission to view items"
msgstr ""
-#: users/models.py:142
+#: users/models.py:143
msgid "Add"
msgstr ""
-#: users/models.py:142
+#: users/models.py:143
msgid "Permission to add items"
msgstr ""
-#: users/models.py:144
+#: users/models.py:145
msgid "Change"
msgstr ""
-#: users/models.py:144
+#: users/models.py:145
msgid "Permissions to edit items"
msgstr ""
-#: users/models.py:146
+#: users/models.py:147
msgid "Permission to delete items"
msgstr ""