mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-31 05:05:42 +00:00 
			
		
		
		
	| @@ -213,6 +213,39 @@ class AjaxMixin(InvenTreeRoleMixin): | |||||||
|         """ |         """ | ||||||
|         return {} |         return {} | ||||||
|  |  | ||||||
|  |     def pre_save(self, obj, form, **kwargs): | ||||||
|  |         """ | ||||||
|  |         Hook for doing something *before* an object is saved. | ||||||
|  |  | ||||||
|  |         obj: The object to be saved | ||||||
|  |         form: The cleaned form | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         # Do nothing by default | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def post_save(self, obj, form, **kwargs): | ||||||
|  |         """ | ||||||
|  |         Hook for doing something *after* an object is saved. | ||||||
|  |  | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         # Do nothing by default | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def validate(self, obj, form, **kwargs): | ||||||
|  |         """ | ||||||
|  |         Hook for performing custom form validation steps. | ||||||
|  |  | ||||||
|  |         If a form error is detected, add it to the form, | ||||||
|  |         with 'form.add_error()' | ||||||
|  |  | ||||||
|  |         Ref: https://docs.djangoproject.com/en/dev/topics/forms/ | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         # Do nothing by default | ||||||
|  |         pass | ||||||
|  |  | ||||||
|     def renderJsonResponse(self, request, form=None, data={}, context=None): |     def renderJsonResponse(self, request, form=None, data={}, context=None): | ||||||
|         """ Render a JSON response based on specific class context. |         """ Render a JSON response based on specific class context. | ||||||
|  |  | ||||||
| @@ -320,18 +353,6 @@ class AjaxCreateView(AjaxMixin, CreateView): | |||||||
|     - Handles form validation via AJAX POST requests |     - Handles form validation via AJAX POST requests | ||||||
|     """ |     """ | ||||||
|  |  | ||||||
|     def pre_save(self, **kwargs): |  | ||||||
|         """ |  | ||||||
|         Hook for doing something before the form is validated |  | ||||||
|         """ |  | ||||||
|         pass |  | ||||||
|  |  | ||||||
|     def post_save(self, **kwargs): |  | ||||||
|         """ |  | ||||||
|         Hook for doing something with the created object after it is saved |  | ||||||
|         """ |  | ||||||
|         pass |  | ||||||
|  |  | ||||||
|     def get(self, request, *args, **kwargs): |     def get(self, request, *args, **kwargs): | ||||||
|         """ Creates form with initial data, and renders JSON response """ |         """ Creates form with initial data, and renders JSON response """ | ||||||
|  |  | ||||||
| @@ -351,16 +372,29 @@ class AjaxCreateView(AjaxMixin, CreateView): | |||||||
|         self.request = request |         self.request = request | ||||||
|         self.form = self.get_form() |         self.form = self.get_form() | ||||||
|  |  | ||||||
|  |         # Perform initial form validation | ||||||
|  |         self.form.is_valid() | ||||||
|  |  | ||||||
|  |         # Perform custom validation (no object can be provided yet) | ||||||
|  |         self.validate(None, self.form) | ||||||
|  |  | ||||||
|  |         valid = self.form.is_valid() | ||||||
|  |  | ||||||
|         # Extra JSON data sent alongside form |         # Extra JSON data sent alongside form | ||||||
|         data = { |         data = { | ||||||
|             'form_valid': self.form.is_valid(), |             'form_valid': valid | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if self.form.is_valid(): |         if valid: | ||||||
|  |  | ||||||
|             self.pre_save() |             # Perform (optional) pre-save step | ||||||
|  |             self.pre_save(None, self.form) | ||||||
|  |  | ||||||
|  |             # Save the object to the database | ||||||
|             self.object = self.form.save() |             self.object = self.form.save() | ||||||
|             self.post_save() |  | ||||||
|  |             # Perform (optional) post-save step | ||||||
|  |             self.post_save(self.object, self.form) | ||||||
|  |  | ||||||
|             # Return the PK of the newly-created object |             # Return the PK of the newly-created object | ||||||
|             data['pk'] = self.object.pk |             data['pk'] = self.object.pk | ||||||
| @@ -400,22 +434,40 @@ class AjaxUpdateView(AjaxMixin, UpdateView): | |||||||
|         - Otherwise, return sucess status |         - Otherwise, return sucess status | ||||||
|         """ |         """ | ||||||
|  |  | ||||||
|  |         self.request = request | ||||||
|  |  | ||||||
|         # Make sure we have an object to point to |         # Make sure we have an object to point to | ||||||
|         self.object = self.get_object() |         self.object = self.get_object() | ||||||
|  |  | ||||||
|         form = self.get_form() |         form = self.get_form() | ||||||
|  |  | ||||||
|  |         # Perform initial form validation | ||||||
|  |         form.is_valid() | ||||||
|  |  | ||||||
|  |         # Perform custom validation | ||||||
|  |         self.validate(self.object, form) | ||||||
|  |  | ||||||
|  |         valid = form.is_valid() | ||||||
|  |  | ||||||
|         data = { |         data = { | ||||||
|             'form_valid': form.is_valid() |             'form_valid': valid | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if form.is_valid(): |         if valid: | ||||||
|  |  | ||||||
|  |             # Perform (optional) pre-save step | ||||||
|  |             self.pre_save(self.object, form) | ||||||
|  |  | ||||||
|  |             # Save the updated objec to the database | ||||||
|             obj = form.save() |             obj = form.save() | ||||||
|  |  | ||||||
|             # Include context data about the updated object |             # Perform (optional) post-save step | ||||||
|             data['pk'] = obj.id |             self.post_save(obj, form) | ||||||
|  |  | ||||||
|             self.post_save(obj) |             # Include context data about the updated object | ||||||
|  |             data['pk'] = obj.pk | ||||||
|  |  | ||||||
|  |             self.post_save(obj, form) | ||||||
|  |  | ||||||
|             try: |             try: | ||||||
|                 data['url'] = obj.get_absolute_url() |                 data['url'] = obj.get_absolute_url() | ||||||
| @@ -424,13 +476,6 @@ class AjaxUpdateView(AjaxMixin, UpdateView): | |||||||
|  |  | ||||||
|         return self.renderJsonResponse(request, form, data) |         return self.renderJsonResponse(request, form, data) | ||||||
|  |  | ||||||
|     def post_save(self, obj, *args, **kwargs): |  | ||||||
|         """ |  | ||||||
|         Hook called after the form data is saved. |  | ||||||
|         (Optional) |  | ||||||
|         """ |  | ||||||
|         pass |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class AjaxDeleteView(AjaxMixin, UpdateView): | class AjaxDeleteView(AjaxMixin, UpdateView): | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: \n" | "Project-Id-Version: \n" | ||||||
| "Report-Msgid-Bugs-To: \n" | "Report-Msgid-Bugs-To: \n" | ||||||
| "POT-Creation-Date: 2020-10-29 02:25+0000\n" | "POT-Creation-Date: 2020-10-29 23:05+0000\n" | ||||||
| "PO-Revision-Date: 2020-05-03 11:32+0200\n" | "PO-Revision-Date: 2020-05-03 11:32+0200\n" | ||||||
| "Last-Translator: Christian Schlüter <chschlue@gmail.com>\n" | "Last-Translator: Christian Schlüter <chschlue@gmail.com>\n" | ||||||
| "Language-Team: C <kde-i18n-doc@kde.org>\n" | "Language-Team: C <kde-i18n-doc@kde.org>\n" | ||||||
| @@ -214,7 +214,7 @@ msgstr "Überschuss darf 100% nicht überschreiten" | |||||||
| msgid "Overage must be an integer value or a percentage" | msgid "Overage must be an integer value or a percentage" | ||||||
| msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein" | msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein" | ||||||
|  |  | ||||||
| #: InvenTree/views.py:707 | #: InvenTree/views.py:752 | ||||||
| msgid "Database Statistics" | msgid "Database Statistics" | ||||||
| msgstr "Datenbankstatistiken" | msgstr "Datenbankstatistiken" | ||||||
|  |  | ||||||
| @@ -547,7 +547,7 @@ msgstr "Zuweisung löschen" | |||||||
| msgid "No BOM items found" | msgid "No BOM items found" | ||||||
| msgstr "Keine BOM-Einträge gefunden" | msgstr "Keine BOM-Einträge gefunden" | ||||||
|  |  | ||||||
| #: build/templates/build/allocate.html:347 part/models.py:1401 | #: build/templates/build/allocate.html:347 part/models.py:1425 | ||||||
| #: templates/js/part.js:569 templates/js/table_filters.js:167 | #: templates/js/part.js:569 templates/js/table_filters.js:167 | ||||||
| msgid "Required" | msgid "Required" | ||||||
| msgstr "benötigt" | msgstr "benötigt" | ||||||
| @@ -1279,7 +1279,7 @@ msgstr "Zuliefererbestand" | |||||||
|  |  | ||||||
| #: company/templates/company/detail_stock.html:35 | #: company/templates/company/detail_stock.html:35 | ||||||
| #: company/templates/company/supplier_part_stock.html:33 | #: company/templates/company/supplier_part_stock.html:33 | ||||||
| #: part/templates/part/bom.html:62 part/templates/part/category.html:112 | #: part/templates/part/bom.html:67 part/templates/part/category.html:112 | ||||||
| #: part/templates/part/category.html:126 part/templates/part/stock.html:51 | #: part/templates/part/category.html:126 part/templates/part/stock.html:51 | ||||||
| #: templates/stock_table.html:7 | #: templates/stock_table.html:7 | ||||||
| msgid "Export" | msgid "Export" | ||||||
| @@ -1398,7 +1398,7 @@ msgid "Pricing Information" | |||||||
| msgstr "Preisinformationen ansehen" | msgstr "Preisinformationen ansehen" | ||||||
|  |  | ||||||
| #: company/templates/company/supplier_part_pricing.html:17 company/views.py:410 | #: company/templates/company/supplier_part_pricing.html:17 company/views.py:410 | ||||||
| #: part/templates/part/sale_prices.html:13 part/views.py:2229 | #: part/templates/part/sale_prices.html:13 part/views.py:2278 | ||||||
| msgid "Add Price Break" | msgid "Add Price Break" | ||||||
| msgstr "Preisstaffel hinzufügen" | msgstr "Preisstaffel hinzufügen" | ||||||
|  |  | ||||||
| @@ -1531,17 +1531,17 @@ msgstr "Neues Zuliefererteil anlegen" | |||||||
| msgid "Delete Supplier Part" | msgid "Delete Supplier Part" | ||||||
| msgstr "Zuliefererteil entfernen" | msgstr "Zuliefererteil entfernen" | ||||||
|  |  | ||||||
| #: company/views.py:416 part/views.py:2235 | #: company/views.py:416 part/views.py:2284 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Add Price Break" | #| msgid "Add Price Break" | ||||||
| msgid "Added new price break" | msgid "Added new price break" | ||||||
| msgstr "Preisstaffel hinzufügen" | msgstr "Preisstaffel hinzufügen" | ||||||
|  |  | ||||||
| #: company/views.py:453 part/views.py:2280 | #: company/views.py:453 part/views.py:2329 | ||||||
| msgid "Edit Price Break" | msgid "Edit Price Break" | ||||||
| msgstr "Preisstaffel bearbeiten" | msgstr "Preisstaffel bearbeiten" | ||||||
|  |  | ||||||
| #: company/views.py:469 part/views.py:2296 | #: company/views.py:469 part/views.py:2345 | ||||||
| msgid "Delete Price Break" | msgid "Delete Price Break" | ||||||
| msgstr "Preisstaffel löschen" | msgstr "Preisstaffel löschen" | ||||||
|  |  | ||||||
| @@ -1646,7 +1646,7 @@ msgstr "" | |||||||
| msgid "Date order was completed" | msgid "Date order was completed" | ||||||
| msgstr "Bestellung als vollständig markieren" | msgstr "Bestellung als vollständig markieren" | ||||||
|  |  | ||||||
| #: order/models.py:185 order/models.py:259 part/views.py:1346 | #: order/models.py:185 order/models.py:259 part/views.py:1395 | ||||||
| #: stock/models.py:241 stock/models.py:805 | #: stock/models.py:241 stock/models.py:805 | ||||||
| msgid "Quantity must be greater than zero" | msgid "Quantity must be greater than zero" | ||||||
| msgstr "Anzahl muss größer Null sein" | msgstr "Anzahl muss größer Null sein" | ||||||
| @@ -1934,6 +1934,7 @@ msgstr "Kundenreferenz" | |||||||
|  |  | ||||||
| #: order/templates/order/sales_order_cancel.html:8 | #: order/templates/order/sales_order_cancel.html:8 | ||||||
| #: order/templates/order/sales_order_ship.html:9 | #: order/templates/order/sales_order_ship.html:9 | ||||||
|  | #: part/templates/part/bom_duplicate.html:12 | ||||||
| #: stock/templates/stock/stockitem_convert.html:13 | #: stock/templates/stock/stockitem_convert.html:13 | ||||||
| msgid "Warning" | msgid "Warning" | ||||||
| msgstr "Warnung" | msgstr "Warnung" | ||||||
| @@ -2162,75 +2163,97 @@ msgstr "Fehler beim Lesen der Stückliste (ungültige Daten)" | |||||||
| msgid "Error reading BOM file (incorrect row size)" | msgid "Error reading BOM file (incorrect row size)" | ||||||
| msgstr "Fehler beim Lesen der Stückliste (ungültige Zeilengröße)" | msgstr "Fehler beim Lesen der Stückliste (ungültige Zeilengröße)" | ||||||
|  |  | ||||||
| #: part/forms.py:57 stock/forms.py:254 | #: part/forms.py:62 stock/forms.py:254 | ||||||
| msgid "File Format" | msgid "File Format" | ||||||
| msgstr "Dateiformat" | msgstr "Dateiformat" | ||||||
|  |  | ||||||
| #: part/forms.py:57 stock/forms.py:254 | #: part/forms.py:62 stock/forms.py:254 | ||||||
| msgid "Select output file format" | msgid "Select output file format" | ||||||
| msgstr "Ausgabe-Dateiformat auswählen" | msgstr "Ausgabe-Dateiformat auswählen" | ||||||
|  |  | ||||||
| #: part/forms.py:59 | #: part/forms.py:64 | ||||||
| msgid "Cascading" | msgid "Cascading" | ||||||
| msgstr "Kaskadierend" | msgstr "Kaskadierend" | ||||||
|  |  | ||||||
| #: part/forms.py:59 | #: part/forms.py:64 | ||||||
| msgid "Download cascading / multi-level BOM" | msgid "Download cascading / multi-level BOM" | ||||||
| msgstr "Kaskadierende Stückliste herunterladen" | msgstr "Kaskadierende Stückliste herunterladen" | ||||||
|  |  | ||||||
| #: part/forms.py:61 | #: part/forms.py:66 | ||||||
| msgid "Levels" | msgid "Levels" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:61 | #: part/forms.py:66 | ||||||
| msgid "Select maximum number of BOM levels to export (0 = all levels)" | msgid "Select maximum number of BOM levels to export (0 = all levels)" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:63 | #: part/forms.py:68 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "New Parameter" | #| msgid "New Parameter" | ||||||
| msgid "Include Parameter Data" | msgid "Include Parameter Data" | ||||||
| msgstr "Neuer Parameter" | msgstr "Neuer Parameter" | ||||||
|  |  | ||||||
| #: part/forms.py:63 | #: part/forms.py:68 | ||||||
| msgid "Include part parameters data in exported BOM" | msgid "Include part parameters data in exported BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:65 | #: part/forms.py:70 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Include stock in sublocations" | #| msgid "Include stock in sublocations" | ||||||
| msgid "Include Stock Data" | msgid "Include Stock Data" | ||||||
| msgstr "Bestand in Unterlagerorten einschließen" | msgstr "Bestand in Unterlagerorten einschließen" | ||||||
|  |  | ||||||
| #: part/forms.py:65 | #: part/forms.py:70 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Include parts in subcategories" | #| msgid "Include parts in subcategories" | ||||||
| msgid "Include part stock data in exported BOM" | msgid "Include part stock data in exported BOM" | ||||||
| msgstr "Teile in Unterkategorien einschließen" | msgstr "Teile in Unterkategorien einschließen" | ||||||
|  |  | ||||||
| #: part/forms.py:67 | #: part/forms.py:72 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "New Supplier Part" | #| msgid "New Supplier Part" | ||||||
| msgid "Include Supplier Data" | msgid "Include Supplier Data" | ||||||
| msgstr "Neues Zulieferer-Teil" | msgstr "Neues Zulieferer-Teil" | ||||||
|  |  | ||||||
| #: part/forms.py:67 | #: part/forms.py:72 | ||||||
| msgid "Include part supplier data in exported BOM" | msgid "Include part supplier data in exported BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:86 | #: part/forms.py:93 part/models.py:1504 | ||||||
|  | msgid "Parent Part" | ||||||
|  | msgstr "Ausgangsteil" | ||||||
|  |  | ||||||
|  | #: part/forms.py:94 part/templates/part/bom_duplicate.html:7 | ||||||
|  | #, fuzzy | ||||||
|  | #| msgid "Select parent part" | ||||||
|  | msgid "Select parent part to copy BOM from" | ||||||
|  | msgstr "Ausgangsteil auswählen" | ||||||
|  |  | ||||||
|  | #: part/forms.py:100 | ||||||
|  | #, fuzzy | ||||||
|  | #| msgid "Select from existing images" | ||||||
|  | msgid "Clear existing BOM items" | ||||||
|  | msgstr "Aus vorhandenen Bildern auswählen" | ||||||
|  |  | ||||||
|  | #: part/forms.py:105 | ||||||
|  | #, fuzzy | ||||||
|  | #| msgid "Confim BOM item deletion" | ||||||
|  | msgid "Confirm BOM duplication" | ||||||
|  | msgstr "Löschung von BOM-Position bestätigen" | ||||||
|  |  | ||||||
|  | #: part/forms.py:123 | ||||||
| msgid "Confirm that the BOM is correct" | msgid "Confirm that the BOM is correct" | ||||||
| msgstr "Bestätigen, dass die Stückliste korrekt ist" | msgstr "Bestätigen, dass die Stückliste korrekt ist" | ||||||
|  |  | ||||||
| #: part/forms.py:98 | #: part/forms.py:135 | ||||||
| msgid "Select BOM file to upload" | msgid "Select BOM file to upload" | ||||||
| msgstr "Stücklisten-Datei zum Upload auswählen" | msgstr "Stücklisten-Datei zum Upload auswählen" | ||||||
|  |  | ||||||
| #: part/forms.py:122 | #: part/forms.py:159 | ||||||
| msgid "Select part category" | msgid "Select part category" | ||||||
| msgstr "Teilekategorie wählen" | msgstr "Teilekategorie wählen" | ||||||
|  |  | ||||||
| #: part/forms.py:136 | #: part/forms.py:173 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Perform 'deep copy' which will duplicate all BOM data for this part" | #| msgid "Perform 'deep copy' which will duplicate all BOM data for this part" | ||||||
| msgid "Duplicate all BOM data for this part" | msgid "Duplicate all BOM data for this part" | ||||||
| @@ -2238,29 +2261,29 @@ msgstr "" | |||||||
| "Tiefe Kopie ausführen. Dies wird alle Daten der Stückliste für dieses Teil " | "Tiefe Kopie ausführen. Dies wird alle Daten der Stückliste für dieses Teil " | ||||||
| "duplizieren" | "duplizieren" | ||||||
|  |  | ||||||
| #: part/forms.py:137 | #: part/forms.py:174 | ||||||
| msgid "Copy BOM" | msgid "Copy BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:142 | #: part/forms.py:179 | ||||||
| msgid "Duplicate all parameter data for this part" | msgid "Duplicate all parameter data for this part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:143 | #: part/forms.py:180 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Parameters" | #| msgid "Parameters" | ||||||
| msgid "Copy Parameters" | msgid "Copy Parameters" | ||||||
| msgstr "Parameter" | msgstr "Parameter" | ||||||
|  |  | ||||||
| #: part/forms.py:148 | #: part/forms.py:185 | ||||||
| msgid "Confirm part creation" | msgid "Confirm part creation" | ||||||
| msgstr "Erstellen des Teils bestätigen" | msgstr "Erstellen des Teils bestätigen" | ||||||
|  |  | ||||||
| #: part/forms.py:248 | #: part/forms.py:279 | ||||||
| msgid "Input quantity for price calculation" | msgid "Input quantity for price calculation" | ||||||
| msgstr "Eintragsmenge zur Preisberechnung" | msgstr "Eintragsmenge zur Preisberechnung" | ||||||
|  |  | ||||||
| #: part/forms.py:251 | #: part/forms.py:282 | ||||||
| msgid "Select currency for price calculation" | msgid "Select currency for price calculation" | ||||||
| msgstr "Währung zur Preisberechnung wählen" | msgstr "Währung zur Preisberechnung wählen" | ||||||
|  |  | ||||||
| @@ -2390,13 +2413,13 @@ msgstr "Bemerkungen - unterstüzt Markdown-Formatierung" | |||||||
| msgid "Stored BOM checksum" | msgid "Stored BOM checksum" | ||||||
| msgstr "Prüfsumme der Stückliste gespeichert" | msgstr "Prüfsumme der Stückliste gespeichert" | ||||||
|  |  | ||||||
| #: part/models.py:1353 | #: part/models.py:1377 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Stock item cannot be created for a template Part" | #| msgid "Stock item cannot be created for a template Part" | ||||||
| msgid "Test templates can only be created for trackable parts" | msgid "Test templates can only be created for trackable parts" | ||||||
| msgstr "Lagerobjekt kann nicht für Vorlagen-Teile angelegt werden" | msgstr "Lagerobjekt kann nicht für Vorlagen-Teile angelegt werden" | ||||||
|  |  | ||||||
| #: part/models.py:1370 | #: part/models.py:1394 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "" | #| msgid "" | ||||||
| #| "A stock item with this serial number already exists for template part " | #| "A stock item with this serial number already exists for template part " | ||||||
| @@ -2406,120 +2429,116 @@ msgstr "" | |||||||
| "Ein Teil mit dieser Seriennummer existiert bereits für die Teilevorlage " | "Ein Teil mit dieser Seriennummer existiert bereits für die Teilevorlage " | ||||||
| "{part}" | "{part}" | ||||||
|  |  | ||||||
| #: part/models.py:1389 templates/js/part.js:560 templates/js/stock.js:92 | #: part/models.py:1413 templates/js/part.js:560 templates/js/stock.js:92 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Instance Name" | #| msgid "Instance Name" | ||||||
| msgid "Test Name" | msgid "Test Name" | ||||||
| msgstr "Instanzname" | msgstr "Instanzname" | ||||||
|  |  | ||||||
| #: part/models.py:1390 | #: part/models.py:1414 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Serial number for this item" | #| msgid "Serial number for this item" | ||||||
| msgid "Enter a name for the test" | msgid "Enter a name for the test" | ||||||
| msgstr "Seriennummer für dieses Teil" | msgstr "Seriennummer für dieses Teil" | ||||||
|  |  | ||||||
| #: part/models.py:1395 | #: part/models.py:1419 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Description" | #| msgid "Description" | ||||||
| msgid "Test Description" | msgid "Test Description" | ||||||
| msgstr "Beschreibung" | msgstr "Beschreibung" | ||||||
|  |  | ||||||
| #: part/models.py:1396 | #: part/models.py:1420 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Brief description of the build" | #| msgid "Brief description of the build" | ||||||
| msgid "Enter description for this test" | msgid "Enter description for this test" | ||||||
| msgstr "Kurze Beschreibung des Baus" | msgstr "Kurze Beschreibung des Baus" | ||||||
|  |  | ||||||
| #: part/models.py:1402 | #: part/models.py:1426 | ||||||
| msgid "Is this test required to pass?" | msgid "Is this test required to pass?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1407 templates/js/part.js:577 | #: part/models.py:1431 templates/js/part.js:577 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Required Parts" | #| msgid "Required Parts" | ||||||
| msgid "Requires Value" | msgid "Requires Value" | ||||||
| msgstr "benötigte Teile" | msgstr "benötigte Teile" | ||||||
|  |  | ||||||
| #: part/models.py:1408 | #: part/models.py:1432 | ||||||
| msgid "Does this test require a value when adding a test result?" | msgid "Does this test require a value when adding a test result?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1413 templates/js/part.js:584 | #: part/models.py:1437 templates/js/part.js:584 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Delete Attachment" | #| msgid "Delete Attachment" | ||||||
| msgid "Requires Attachment" | msgid "Requires Attachment" | ||||||
| msgstr "Anhang löschen" | msgstr "Anhang löschen" | ||||||
|  |  | ||||||
| #: part/models.py:1414 | #: part/models.py:1438 | ||||||
| msgid "Does this test require a file attachment when adding a test result?" | msgid "Does this test require a file attachment when adding a test result?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1447 | #: part/models.py:1471 | ||||||
| msgid "Parameter template name must be unique" | msgid "Parameter template name must be unique" | ||||||
| msgstr "Vorlagen-Name des Parameters muss eindeutig sein" | msgstr "Vorlagen-Name des Parameters muss eindeutig sein" | ||||||
|  |  | ||||||
| #: part/models.py:1452 | #: part/models.py:1476 | ||||||
| msgid "Parameter Name" | msgid "Parameter Name" | ||||||
| msgstr "Name des Parameters" | msgstr "Name des Parameters" | ||||||
|  |  | ||||||
| #: part/models.py:1454 | #: part/models.py:1478 | ||||||
| msgid "Parameter Units" | msgid "Parameter Units" | ||||||
| msgstr "Parameter Einheit" | msgstr "Parameter Einheit" | ||||||
|  |  | ||||||
| #: part/models.py:1480 | #: part/models.py:1506 | ||||||
| msgid "Parent Part" |  | ||||||
| msgstr "Ausgangsteil" |  | ||||||
|  |  | ||||||
| #: part/models.py:1482 |  | ||||||
| msgid "Parameter Template" | msgid "Parameter Template" | ||||||
| msgstr "Parameter Vorlage" | msgstr "Parameter Vorlage" | ||||||
|  |  | ||||||
| #: part/models.py:1484 | #: part/models.py:1508 | ||||||
| msgid "Parameter Value" | msgid "Parameter Value" | ||||||
| msgstr "Parameter Wert" | msgstr "Parameter Wert" | ||||||
|  |  | ||||||
| #: part/models.py:1521 | #: part/models.py:1545 | ||||||
| msgid "Select parent part" | msgid "Select parent part" | ||||||
| msgstr "Ausgangsteil auswählen" | msgstr "Ausgangsteil auswählen" | ||||||
|  |  | ||||||
| #: part/models.py:1529 | #: part/models.py:1553 | ||||||
| msgid "Select part to be used in BOM" | msgid "Select part to be used in BOM" | ||||||
| msgstr "Teil für die Nutzung in der Stückliste auswählen" | msgstr "Teil für die Nutzung in der Stückliste auswählen" | ||||||
|  |  | ||||||
| #: part/models.py:1535 | #: part/models.py:1559 | ||||||
| msgid "BOM quantity for this BOM item" | msgid "BOM quantity for this BOM item" | ||||||
| msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil" | msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil" | ||||||
|  |  | ||||||
| #: part/models.py:1537 | #: part/models.py:1561 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Confim BOM item deletion" | #| msgid "Confim BOM item deletion" | ||||||
| msgid "This BOM item is optional" | msgid "This BOM item is optional" | ||||||
| msgstr "Löschung von BOM-Position bestätigen" | msgstr "Löschung von BOM-Position bestätigen" | ||||||
|  |  | ||||||
| #: part/models.py:1540 | #: part/models.py:1564 | ||||||
| msgid "Estimated build wastage quantity (absolute or percentage)" | msgid "Estimated build wastage quantity (absolute or percentage)" | ||||||
| msgstr "Geschätzter Ausschuss (absolut oder prozentual)" | msgstr "Geschätzter Ausschuss (absolut oder prozentual)" | ||||||
|  |  | ||||||
| #: part/models.py:1543 | #: part/models.py:1567 | ||||||
| msgid "BOM item reference" | msgid "BOM item reference" | ||||||
| msgstr "Referenz des Objekts auf der Stückliste" | msgstr "Referenz des Objekts auf der Stückliste" | ||||||
|  |  | ||||||
| #: part/models.py:1546 | #: part/models.py:1570 | ||||||
| msgid "BOM item notes" | msgid "BOM item notes" | ||||||
| msgstr "Notizen zum Stücklisten-Objekt" | msgstr "Notizen zum Stücklisten-Objekt" | ||||||
|  |  | ||||||
| #: part/models.py:1548 | #: part/models.py:1572 | ||||||
| msgid "BOM line checksum" | msgid "BOM line checksum" | ||||||
| msgstr "Prüfsumme der Stückliste" | msgstr "Prüfsumme der Stückliste" | ||||||
|  |  | ||||||
| #: part/models.py:1612 part/views.py:1352 part/views.py:1404 | #: part/models.py:1636 part/views.py:1401 part/views.py:1453 | ||||||
| #: stock/models.py:231 | #: stock/models.py:231 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Overage must be an integer value or a percentage" | #| msgid "Overage must be an integer value or a percentage" | ||||||
| msgid "Quantity must be integer value for trackable parts" | msgid "Quantity must be integer value for trackable parts" | ||||||
| msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein" | msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein" | ||||||
|  |  | ||||||
| #: part/models.py:1621 | #: part/models.py:1645 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "New BOM Item" | #| msgid "New BOM Item" | ||||||
| msgid "BOM Item" | msgid "BOM Item" | ||||||
| @@ -2563,64 +2582,80 @@ msgid "Import BOM data" | |||||||
| msgstr "Stückliste importieren" | msgstr "Stückliste importieren" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:42 | #: part/templates/part/bom.html:42 | ||||||
| msgid "Upload" | msgid "Import from File" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:44 | #: part/templates/part/bom.html:45 | ||||||
|  | msgid "Copy BOM from parent part" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/templates/part/bom.html:46 | ||||||
|  | #, fuzzy | ||||||
|  | #| msgid "Parameters" | ||||||
|  | msgid "Copy from Parent" | ||||||
|  | msgstr "Parameter" | ||||||
|  |  | ||||||
|  | #: part/templates/part/bom.html:49 | ||||||
| msgid "New BOM Item" | msgid "New BOM Item" | ||||||
| msgstr "Neue Stücklistenposition" | msgstr "Neue Stücklistenposition" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:45 | #: part/templates/part/bom.html:50 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Add Line Item" | #| msgid "Add Line Item" | ||||||
| msgid "Add Item" | msgid "Add Item" | ||||||
| msgstr "Position hinzufügen" | msgstr "Position hinzufügen" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:47 | #: part/templates/part/bom.html:52 | ||||||
| msgid "Finish Editing" | msgid "Finish Editing" | ||||||
| msgstr "Bearbeitung beenden" | msgstr "Bearbeitung beenden" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:48 | #: part/templates/part/bom.html:53 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Finish Editing" | #| msgid "Finish Editing" | ||||||
| msgid "Finished" | msgid "Finished" | ||||||
| msgstr "Bearbeitung beenden" | msgstr "Bearbeitung beenden" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:52 | #: part/templates/part/bom.html:57 | ||||||
| msgid "Edit BOM" | msgid "Edit BOM" | ||||||
| msgstr "Stückliste bearbeiten" | msgstr "Stückliste bearbeiten" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:53 part/templates/part/params.html:38 | #: part/templates/part/bom.html:58 part/templates/part/params.html:38 | ||||||
| #: templates/InvenTree/settings/user.html:19 | #: templates/InvenTree/settings/user.html:19 | ||||||
| msgid "Edit" | msgid "Edit" | ||||||
| msgstr "Bearbeiten" | msgstr "Bearbeiten" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:56 | #: part/templates/part/bom.html:61 | ||||||
| msgid "Validate Bill of Materials" | msgid "Validate Bill of Materials" | ||||||
| msgstr "Stückliste validieren" | msgstr "Stückliste validieren" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:57 | #: part/templates/part/bom.html:62 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Validate BOM" | #| msgid "Validate BOM" | ||||||
| msgid "Validate" | msgid "Validate" | ||||||
| msgstr "BOM validieren" | msgstr "BOM validieren" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:61 part/views.py:1643 | #: part/templates/part/bom.html:66 part/views.py:1692 | ||||||
| msgid "Export Bill of Materials" | msgid "Export Bill of Materials" | ||||||
| msgstr "Stückliste exportieren" | msgstr "Stückliste exportieren" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:122 | #: part/templates/part/bom.html:127 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Remove selected BOM items" | #| msgid "Remove selected BOM items" | ||||||
| msgid "Delete selected BOM items?" | msgid "Delete selected BOM items?" | ||||||
| msgstr "Ausgewählte Stücklistenpositionen entfernen" | msgstr "Ausgewählte Stücklistenpositionen entfernen" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:123 | #: part/templates/part/bom.html:128 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Remove selected BOM items" | #| msgid "Remove selected BOM items" | ||||||
| msgid "All selected BOM items will be deleted" | msgid "All selected BOM items will be deleted" | ||||||
| msgstr "Ausgewählte Stücklistenpositionen entfernen" | msgstr "Ausgewählte Stücklistenpositionen entfernen" | ||||||
|  |  | ||||||
|  | #: part/templates/part/bom_duplicate.html:13 | ||||||
|  | #, fuzzy | ||||||
|  | #| msgid "Export Bill of Materials" | ||||||
|  | msgid "This part already has a Bill of Materials" | ||||||
|  | msgstr "Stückliste exportieren" | ||||||
|  |  | ||||||
| #: part/templates/part/bom_upload/select_fields.html:8 | #: part/templates/part/bom_upload/select_fields.html:8 | ||||||
| #: part/templates/part/bom_upload/select_parts.html:8 | #: part/templates/part/bom_upload/select_parts.html:8 | ||||||
| #: part/templates/part/bom_upload/upload_file.html:10 | #: part/templates/part/bom_upload/upload_file.html:10 | ||||||
| @@ -2721,7 +2756,7 @@ msgstr "Neuen Bau beginnen" | |||||||
| msgid "All parts" | msgid "All parts" | ||||||
| msgstr "Alle Teile" | msgstr "Alle Teile" | ||||||
|  |  | ||||||
| #: part/templates/part/category.html:24 part/views.py:2046 | #: part/templates/part/category.html:24 part/views.py:2095 | ||||||
| msgid "Create new part category" | msgid "Create new part category" | ||||||
| msgstr "Teilkategorie anlegen" | msgstr "Teilkategorie anlegen" | ||||||
|  |  | ||||||
| @@ -2895,104 +2930,104 @@ msgstr "Erstellt von" | |||||||
| msgid "Responsible User" | msgid "Responsible User" | ||||||
| msgstr "Verantwortlicher Benutzer" | msgstr "Verantwortlicher Benutzer" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:136 templates/js/table_filters.js:27 | #: part/templates/part/detail.html:138 templates/js/table_filters.js:27 | ||||||
| msgid "Virtual" | msgid "Virtual" | ||||||
| msgstr "Virtuell" | msgstr "Virtuell" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:139 | #: part/templates/part/detail.html:141 | ||||||
| msgid "Part is virtual (not a physical part)" | msgid "Part is virtual (not a physical part)" | ||||||
| msgstr "Teil ist virtuell (kein physisches Teil)" | msgstr "Teil ist virtuell (kein physisches Teil)" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:141 | #: part/templates/part/detail.html:143 | ||||||
| msgid "Part is not a virtual part" | msgid "Part is not a virtual part" | ||||||
| msgstr "Teil ist nicht virtuell" | msgstr "Teil ist nicht virtuell" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:145 stock/forms.py:248 | #: part/templates/part/detail.html:148 stock/forms.py:248 | ||||||
| #: templates/js/table_filters.js:23 templates/js/table_filters.js:243 | #: templates/js/table_filters.js:23 templates/js/table_filters.js:243 | ||||||
| msgid "Template" | msgid "Template" | ||||||
| msgstr "Vorlage" | msgstr "Vorlage" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:148 | #: part/templates/part/detail.html:151 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Part cannot be a template part if it is a variant of another part" | #| msgid "Part cannot be a template part if it is a variant of another part" | ||||||
| msgid "Part is a template part (variants can be made from this part)" | msgid "Part is a template part (variants can be made from this part)" | ||||||
| msgstr "Teil kann keine Vorlage sein wenn es Variante eines anderen Teils ist" | msgstr "Teil kann keine Vorlage sein wenn es Variante eines anderen Teils ist" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:150 | #: part/templates/part/detail.html:153 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Part is not a virtual part" | #| msgid "Part is not a virtual part" | ||||||
| msgid "Part is not a template part" | msgid "Part is not a template part" | ||||||
| msgstr "Teil ist nicht virtuell" | msgstr "Teil ist nicht virtuell" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:154 templates/js/table_filters.js:255 | #: part/templates/part/detail.html:158 templates/js/table_filters.js:255 | ||||||
| msgid "Assembly" | msgid "Assembly" | ||||||
| msgstr "Baugruppe" | msgstr "Baugruppe" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:157 | #: part/templates/part/detail.html:161 | ||||||
| msgid "Part can be assembled from other parts" | msgid "Part can be assembled from other parts" | ||||||
| msgstr "Teil kann aus anderen Teilen angefertigt werden" | msgstr "Teil kann aus anderen Teilen angefertigt werden" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:159 | #: part/templates/part/detail.html:163 | ||||||
| msgid "Part cannot be assembled from other parts" | msgid "Part cannot be assembled from other parts" | ||||||
| msgstr "Teil kann nicht aus anderen Teilen angefertigt werden" | msgstr "Teil kann nicht aus anderen Teilen angefertigt werden" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:163 templates/js/table_filters.js:259 | #: part/templates/part/detail.html:168 templates/js/table_filters.js:259 | ||||||
| msgid "Component" | msgid "Component" | ||||||
| msgstr "Komponente" | msgstr "Komponente" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:166 | #: part/templates/part/detail.html:171 | ||||||
| msgid "Part can be used in assemblies" | msgid "Part can be used in assemblies" | ||||||
| msgstr "Teil kann in Baugruppen benutzt werden" | msgstr "Teil kann in Baugruppen benutzt werden" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:168 | #: part/templates/part/detail.html:173 | ||||||
| msgid "Part cannot be used in assemblies" | msgid "Part cannot be used in assemblies" | ||||||
| msgstr "Teil kann nicht in Baugruppen benutzt werden" | msgstr "Teil kann nicht in Baugruppen benutzt werden" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:172 templates/js/table_filters.js:31 | #: part/templates/part/detail.html:178 templates/js/table_filters.js:31 | ||||||
| #: templates/js/table_filters.js:271 | #: templates/js/table_filters.js:271 | ||||||
| msgid "Trackable" | msgid "Trackable" | ||||||
| msgstr "nachverfolgbar" | msgstr "nachverfolgbar" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:175 | #: part/templates/part/detail.html:181 | ||||||
| msgid "Part stock is tracked by serial number" | msgid "Part stock is tracked by serial number" | ||||||
| msgstr "Teilebestand in der Seriennummer hinterlegt" | msgstr "Teilebestand in der Seriennummer hinterlegt" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:177 | #: part/templates/part/detail.html:183 | ||||||
| msgid "Part stock is not tracked by serial number" | msgid "Part stock is not tracked by serial number" | ||||||
| msgstr "Teilebestand ist nicht in der Seriennummer hinterlegt" | msgstr "Teilebestand ist nicht in der Seriennummer hinterlegt" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:181 | #: part/templates/part/detail.html:188 | ||||||
| msgid "Purchaseable" | msgid "Purchaseable" | ||||||
| msgstr "Kaufbar" | msgstr "Kaufbar" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:184 part/templates/part/detail.html:186 | #: part/templates/part/detail.html:191 part/templates/part/detail.html:193 | ||||||
| msgid "Part can be purchased from external suppliers" | msgid "Part can be purchased from external suppliers" | ||||||
| msgstr "Teil kann von externen Zulieferern gekauft werden" | msgstr "Teil kann von externen Zulieferern gekauft werden" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:190 templates/js/table_filters.js:267 | #: part/templates/part/detail.html:198 templates/js/table_filters.js:267 | ||||||
| msgid "Salable" | msgid "Salable" | ||||||
| msgstr "Verkäuflich" | msgstr "Verkäuflich" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:193 | #: part/templates/part/detail.html:201 | ||||||
| msgid "Part can be sold to customers" | msgid "Part can be sold to customers" | ||||||
| msgstr "Teil kann an Kunden verkauft werden" | msgstr "Teil kann an Kunden verkauft werden" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:195 | #: part/templates/part/detail.html:203 | ||||||
| msgid "Part cannot be sold to customers" | msgid "Part cannot be sold to customers" | ||||||
| msgstr "Teil kann nicht an Kunden verkauft werden" | msgstr "Teil kann nicht an Kunden verkauft werden" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:199 templates/js/table_filters.js:19 | #: part/templates/part/detail.html:214 templates/js/table_filters.js:19 | ||||||
| #: templates/js/table_filters.js:55 templates/js/table_filters.js:238 | #: templates/js/table_filters.js:55 templates/js/table_filters.js:238 | ||||||
| msgid "Active" | msgid "Active" | ||||||
| msgstr "Aktiv" | msgstr "Aktiv" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:202 | #: part/templates/part/detail.html:217 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "This part is not active" | #| msgid "This part is not active" | ||||||
| msgid "Part is active" | msgid "Part is active" | ||||||
| msgstr "Dieses Teil ist nicht aktiv" | msgstr "Dieses Teil ist nicht aktiv" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:204 | #: part/templates/part/detail.html:219 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "This part is not active" | #| msgid "This part is not active" | ||||||
| msgid "Part is not active" | msgid "Part is not active" | ||||||
| @@ -3344,99 +3379,111 @@ msgstr "Teilbild nicht gefunden" | |||||||
| msgid "Edit Part Properties" | msgid "Edit Part Properties" | ||||||
| msgstr "Teileigenschaften bearbeiten" | msgstr "Teileigenschaften bearbeiten" | ||||||
|  |  | ||||||
| #: part/views.py:838 | #: part/views.py:841 | ||||||
|  | #, fuzzy | ||||||
|  | #| msgid "Duplicate Part" | ||||||
|  | msgid "Duplicate BOM" | ||||||
|  | msgstr "Teil duplizieren" | ||||||
|  |  | ||||||
|  | #: part/views.py:871 | ||||||
|  | #, fuzzy | ||||||
|  | #| msgid "Confirm unallocation of build stock" | ||||||
|  | msgid "Confirm duplication of BOM from parent" | ||||||
|  | msgstr "Zuweisungsaufhebung bestätigen" | ||||||
|  |  | ||||||
|  | #: part/views.py:887 | ||||||
| msgid "Validate BOM" | msgid "Validate BOM" | ||||||
| msgstr "BOM validieren" | msgstr "BOM validieren" | ||||||
|  |  | ||||||
| #: part/views.py:1005 | #: part/views.py:1054 | ||||||
| msgid "No BOM file provided" | msgid "No BOM file provided" | ||||||
| msgstr "Keine Stückliste angegeben" | msgstr "Keine Stückliste angegeben" | ||||||
|  |  | ||||||
| #: part/views.py:1355 | #: part/views.py:1404 | ||||||
| msgid "Enter a valid quantity" | msgid "Enter a valid quantity" | ||||||
| msgstr "Bitte eine gültige Anzahl eingeben" | msgstr "Bitte eine gültige Anzahl eingeben" | ||||||
|  |  | ||||||
| #: part/views.py:1380 part/views.py:1383 | #: part/views.py:1429 part/views.py:1432 | ||||||
| msgid "Select valid part" | msgid "Select valid part" | ||||||
| msgstr "Bitte ein gültiges Teil auswählen" | msgstr "Bitte ein gültiges Teil auswählen" | ||||||
|  |  | ||||||
| #: part/views.py:1389 | #: part/views.py:1438 | ||||||
| msgid "Duplicate part selected" | msgid "Duplicate part selected" | ||||||
| msgstr "Teil doppelt ausgewählt" | msgstr "Teil doppelt ausgewählt" | ||||||
|  |  | ||||||
| #: part/views.py:1427 | #: part/views.py:1476 | ||||||
| msgid "Select a part" | msgid "Select a part" | ||||||
| msgstr "Teil auswählen" | msgstr "Teil auswählen" | ||||||
|  |  | ||||||
| #: part/views.py:1433 | #: part/views.py:1482 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Select part to be used in BOM" | #| msgid "Select part to be used in BOM" | ||||||
| msgid "Selected part creates a circular BOM" | msgid "Selected part creates a circular BOM" | ||||||
| msgstr "Teil für die Nutzung in der Stückliste auswählen" | msgstr "Teil für die Nutzung in der Stückliste auswählen" | ||||||
|  |  | ||||||
| #: part/views.py:1437 | #: part/views.py:1486 | ||||||
| msgid "Specify quantity" | msgid "Specify quantity" | ||||||
| msgstr "Anzahl angeben" | msgstr "Anzahl angeben" | ||||||
|  |  | ||||||
| #: part/views.py:1693 | #: part/views.py:1742 | ||||||
| msgid "Confirm Part Deletion" | msgid "Confirm Part Deletion" | ||||||
| msgstr "Löschen des Teils bestätigen" | msgstr "Löschen des Teils bestätigen" | ||||||
|  |  | ||||||
| #: part/views.py:1702 | #: part/views.py:1751 | ||||||
| msgid "Part was deleted" | msgid "Part was deleted" | ||||||
| msgstr "Teil wurde gelöscht" | msgstr "Teil wurde gelöscht" | ||||||
|  |  | ||||||
| #: part/views.py:1711 | #: part/views.py:1760 | ||||||
| msgid "Part Pricing" | msgid "Part Pricing" | ||||||
| msgstr "Teilbepreisung" | msgstr "Teilbepreisung" | ||||||
|  |  | ||||||
| #: part/views.py:1837 | #: part/views.py:1886 | ||||||
| msgid "Create Part Parameter Template" | msgid "Create Part Parameter Template" | ||||||
| msgstr "Teilparametervorlage anlegen" | msgstr "Teilparametervorlage anlegen" | ||||||
|  |  | ||||||
| #: part/views.py:1847 | #: part/views.py:1896 | ||||||
| msgid "Edit Part Parameter Template" | msgid "Edit Part Parameter Template" | ||||||
| msgstr "Teilparametervorlage bearbeiten" | msgstr "Teilparametervorlage bearbeiten" | ||||||
|  |  | ||||||
| #: part/views.py:1856 | #: part/views.py:1905 | ||||||
| msgid "Delete Part Parameter Template" | msgid "Delete Part Parameter Template" | ||||||
| msgstr "Teilparametervorlage löschen" | msgstr "Teilparametervorlage löschen" | ||||||
|  |  | ||||||
| #: part/views.py:1866 | #: part/views.py:1915 | ||||||
| msgid "Create Part Parameter" | msgid "Create Part Parameter" | ||||||
| msgstr "Teilparameter anlegen" | msgstr "Teilparameter anlegen" | ||||||
|  |  | ||||||
| #: part/views.py:1918 | #: part/views.py:1967 | ||||||
| msgid "Edit Part Parameter" | msgid "Edit Part Parameter" | ||||||
| msgstr "Teilparameter bearbeiten" | msgstr "Teilparameter bearbeiten" | ||||||
|  |  | ||||||
| #: part/views.py:1934 | #: part/views.py:1983 | ||||||
| msgid "Delete Part Parameter" | msgid "Delete Part Parameter" | ||||||
| msgstr "Teilparameter löschen" | msgstr "Teilparameter löschen" | ||||||
|  |  | ||||||
| #: part/views.py:1993 | #: part/views.py:2042 | ||||||
| msgid "Edit Part Category" | msgid "Edit Part Category" | ||||||
| msgstr "Teilkategorie bearbeiten" | msgstr "Teilkategorie bearbeiten" | ||||||
|  |  | ||||||
| #: part/views.py:2030 | #: part/views.py:2079 | ||||||
| msgid "Delete Part Category" | msgid "Delete Part Category" | ||||||
| msgstr "Teilkategorie löschen" | msgstr "Teilkategorie löschen" | ||||||
|  |  | ||||||
| #: part/views.py:2038 | #: part/views.py:2087 | ||||||
| msgid "Part category was deleted" | msgid "Part category was deleted" | ||||||
| msgstr "Teilekategorie wurde gelöscht" | msgstr "Teilekategorie wurde gelöscht" | ||||||
|  |  | ||||||
| #: part/views.py:2101 | #: part/views.py:2150 | ||||||
| #, fuzzy | #, fuzzy | ||||||
| #| msgid "Create BOM item" | #| msgid "Create BOM item" | ||||||
| msgid "Create BOM Item" | msgid "Create BOM Item" | ||||||
| msgstr "BOM-Position anlegen" | msgstr "BOM-Position anlegen" | ||||||
|  |  | ||||||
| #: part/views.py:2169 | #: part/views.py:2218 | ||||||
| msgid "Edit BOM item" | msgid "Edit BOM item" | ||||||
| msgstr "BOM-Position beaarbeiten" | msgstr "BOM-Position beaarbeiten" | ||||||
|  |  | ||||||
| #: part/views.py:2219 | #: part/views.py:2268 | ||||||
| msgid "Confim BOM item deletion" | msgid "Confim BOM item deletion" | ||||||
| msgstr "Löschung von BOM-Position bestätigen" | msgstr "Löschung von BOM-Position bestätigen" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: PACKAGE VERSION\n" | "Project-Id-Version: PACKAGE VERSION\n" | ||||||
| "Report-Msgid-Bugs-To: \n" | "Report-Msgid-Bugs-To: \n" | ||||||
| "POT-Creation-Date: 2020-10-29 02:25+0000\n" | "POT-Creation-Date: 2020-10-29 23:05+0000\n" | ||||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | "Language-Team: LANGUAGE <LL@li.org>\n" | ||||||
| @@ -204,7 +204,7 @@ msgstr "" | |||||||
| msgid "Overage must be an integer value or a percentage" | msgid "Overage must be an integer value or a percentage" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: InvenTree/views.py:707 | #: InvenTree/views.py:752 | ||||||
| msgid "Database Statistics" | msgid "Database Statistics" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -520,7 +520,7 @@ msgstr "" | |||||||
| msgid "No BOM items found" | msgid "No BOM items found" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: build/templates/build/allocate.html:347 part/models.py:1401 | #: build/templates/build/allocate.html:347 part/models.py:1425 | ||||||
| #: templates/js/part.js:569 templates/js/table_filters.js:167 | #: templates/js/part.js:569 templates/js/table_filters.js:167 | ||||||
| msgid "Required" | msgid "Required" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -1192,7 +1192,7 @@ msgstr "" | |||||||
|  |  | ||||||
| #: company/templates/company/detail_stock.html:35 | #: company/templates/company/detail_stock.html:35 | ||||||
| #: company/templates/company/supplier_part_stock.html:33 | #: company/templates/company/supplier_part_stock.html:33 | ||||||
| #: part/templates/part/bom.html:62 part/templates/part/category.html:112 | #: part/templates/part/bom.html:67 part/templates/part/category.html:112 | ||||||
| #: part/templates/part/category.html:126 part/templates/part/stock.html:51 | #: part/templates/part/category.html:126 part/templates/part/stock.html:51 | ||||||
| #: templates/stock_table.html:7 | #: templates/stock_table.html:7 | ||||||
| msgid "Export" | msgid "Export" | ||||||
| @@ -1310,7 +1310,7 @@ msgid "Pricing Information" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: company/templates/company/supplier_part_pricing.html:17 company/views.py:410 | #: company/templates/company/supplier_part_pricing.html:17 company/views.py:410 | ||||||
| #: part/templates/part/sale_prices.html:13 part/views.py:2229 | #: part/templates/part/sale_prices.html:13 part/views.py:2278 | ||||||
| msgid "Add Price Break" | msgid "Add Price Break" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -1437,15 +1437,15 @@ msgstr "" | |||||||
| msgid "Delete Supplier Part" | msgid "Delete Supplier Part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: company/views.py:416 part/views.py:2235 | #: company/views.py:416 part/views.py:2284 | ||||||
| msgid "Added new price break" | msgid "Added new price break" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: company/views.py:453 part/views.py:2280 | #: company/views.py:453 part/views.py:2329 | ||||||
| msgid "Edit Price Break" | msgid "Edit Price Break" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: company/views.py:469 part/views.py:2296 | #: company/views.py:469 part/views.py:2345 | ||||||
| msgid "Delete Price Break" | msgid "Delete Price Break" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -1538,7 +1538,7 @@ msgstr "" | |||||||
| msgid "Date order was completed" | msgid "Date order was completed" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: order/models.py:185 order/models.py:259 part/views.py:1346 | #: order/models.py:185 order/models.py:259 part/views.py:1395 | ||||||
| #: stock/models.py:241 stock/models.py:805 | #: stock/models.py:241 stock/models.py:805 | ||||||
| msgid "Quantity must be greater than zero" | msgid "Quantity must be greater than zero" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -1815,6 +1815,7 @@ msgstr "" | |||||||
|  |  | ||||||
| #: order/templates/order/sales_order_cancel.html:8 | #: order/templates/order/sales_order_cancel.html:8 | ||||||
| #: order/templates/order/sales_order_ship.html:9 | #: order/templates/order/sales_order_ship.html:9 | ||||||
|  | #: part/templates/part/bom_duplicate.html:12 | ||||||
| #: stock/templates/stock/stockitem_convert.html:13 | #: stock/templates/stock/stockitem_convert.html:13 | ||||||
| msgid "Warning" | msgid "Warning" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -2039,91 +2040,107 @@ msgstr "" | |||||||
| msgid "Error reading BOM file (incorrect row size)" | msgid "Error reading BOM file (incorrect row size)" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:57 stock/forms.py:254 | #: part/forms.py:62 stock/forms.py:254 | ||||||
| msgid "File Format" | msgid "File Format" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:57 stock/forms.py:254 | #: part/forms.py:62 stock/forms.py:254 | ||||||
| msgid "Select output file format" | msgid "Select output file format" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:59 | #: part/forms.py:64 | ||||||
| msgid "Cascading" | msgid "Cascading" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:59 | #: part/forms.py:64 | ||||||
| msgid "Download cascading / multi-level BOM" | msgid "Download cascading / multi-level BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:61 | #: part/forms.py:66 | ||||||
| msgid "Levels" | msgid "Levels" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:61 | #: part/forms.py:66 | ||||||
| msgid "Select maximum number of BOM levels to export (0 = all levels)" | msgid "Select maximum number of BOM levels to export (0 = all levels)" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:63 | #: part/forms.py:68 | ||||||
| msgid "Include Parameter Data" | msgid "Include Parameter Data" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:63 | #: part/forms.py:68 | ||||||
| msgid "Include part parameters data in exported BOM" | msgid "Include part parameters data in exported BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:65 | #: part/forms.py:70 | ||||||
| msgid "Include Stock Data" | msgid "Include Stock Data" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:65 | #: part/forms.py:70 | ||||||
| msgid "Include part stock data in exported BOM" | msgid "Include part stock data in exported BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:67 | #: part/forms.py:72 | ||||||
| msgid "Include Supplier Data" | msgid "Include Supplier Data" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:67 | #: part/forms.py:72 | ||||||
| msgid "Include part supplier data in exported BOM" | msgid "Include part supplier data in exported BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:86 | #: part/forms.py:93 part/models.py:1504 | ||||||
|  | msgid "Parent Part" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/forms.py:94 part/templates/part/bom_duplicate.html:7 | ||||||
|  | msgid "Select parent part to copy BOM from" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/forms.py:100 | ||||||
|  | msgid "Clear existing BOM items" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/forms.py:105 | ||||||
|  | msgid "Confirm BOM duplication" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/forms.py:123 | ||||||
| msgid "Confirm that the BOM is correct" | msgid "Confirm that the BOM is correct" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:98 | #: part/forms.py:135 | ||||||
| msgid "Select BOM file to upload" | msgid "Select BOM file to upload" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:122 | #: part/forms.py:159 | ||||||
| msgid "Select part category" | msgid "Select part category" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:136 | #: part/forms.py:173 | ||||||
| msgid "Duplicate all BOM data for this part" | msgid "Duplicate all BOM data for this part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:137 | #: part/forms.py:174 | ||||||
| msgid "Copy BOM" | msgid "Copy BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:142 | #: part/forms.py:179 | ||||||
| msgid "Duplicate all parameter data for this part" | msgid "Duplicate all parameter data for this part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:143 | #: part/forms.py:180 | ||||||
| msgid "Copy Parameters" | msgid "Copy Parameters" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:148 | #: part/forms.py:185 | ||||||
| msgid "Confirm part creation" | msgid "Confirm part creation" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:248 | #: part/forms.py:279 | ||||||
| msgid "Input quantity for price calculation" | msgid "Input quantity for price calculation" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:251 | #: part/forms.py:282 | ||||||
| msgid "Select currency for price calculation" | msgid "Select currency for price calculation" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -2249,112 +2266,108 @@ msgstr "" | |||||||
| msgid "Stored BOM checksum" | msgid "Stored BOM checksum" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1353 | #: part/models.py:1377 | ||||||
| msgid "Test templates can only be created for trackable parts" | msgid "Test templates can only be created for trackable parts" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1370 | #: part/models.py:1394 | ||||||
| msgid "Test with this name already exists for this part" | msgid "Test with this name already exists for this part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1389 templates/js/part.js:560 templates/js/stock.js:92 | #: part/models.py:1413 templates/js/part.js:560 templates/js/stock.js:92 | ||||||
| msgid "Test Name" | msgid "Test Name" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1390 | #: part/models.py:1414 | ||||||
| msgid "Enter a name for the test" | msgid "Enter a name for the test" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1395 | #: part/models.py:1419 | ||||||
| msgid "Test Description" | msgid "Test Description" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1396 | #: part/models.py:1420 | ||||||
| msgid "Enter description for this test" | msgid "Enter description for this test" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1402 | #: part/models.py:1426 | ||||||
| msgid "Is this test required to pass?" | msgid "Is this test required to pass?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1407 templates/js/part.js:577 | #: part/models.py:1431 templates/js/part.js:577 | ||||||
| msgid "Requires Value" | msgid "Requires Value" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1408 | #: part/models.py:1432 | ||||||
| msgid "Does this test require a value when adding a test result?" | msgid "Does this test require a value when adding a test result?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1413 templates/js/part.js:584 | #: part/models.py:1437 templates/js/part.js:584 | ||||||
| msgid "Requires Attachment" | msgid "Requires Attachment" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1414 | #: part/models.py:1438 | ||||||
| msgid "Does this test require a file attachment when adding a test result?" | msgid "Does this test require a file attachment when adding a test result?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1447 | #: part/models.py:1471 | ||||||
| msgid "Parameter template name must be unique" | msgid "Parameter template name must be unique" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1452 | #: part/models.py:1476 | ||||||
| msgid "Parameter Name" | msgid "Parameter Name" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1454 | #: part/models.py:1478 | ||||||
| msgid "Parameter Units" | msgid "Parameter Units" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1480 | #: part/models.py:1506 | ||||||
| msgid "Parent Part" |  | ||||||
| msgstr "" |  | ||||||
|  |  | ||||||
| #: part/models.py:1482 |  | ||||||
| msgid "Parameter Template" | msgid "Parameter Template" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1484 | #: part/models.py:1508 | ||||||
| msgid "Parameter Value" | msgid "Parameter Value" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1521 | #: part/models.py:1545 | ||||||
| msgid "Select parent part" | msgid "Select parent part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1529 | #: part/models.py:1553 | ||||||
| msgid "Select part to be used in BOM" | msgid "Select part to be used in BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1535 | #: part/models.py:1559 | ||||||
| msgid "BOM quantity for this BOM item" | msgid "BOM quantity for this BOM item" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1537 | #: part/models.py:1561 | ||||||
| msgid "This BOM item is optional" | msgid "This BOM item is optional" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1540 | #: part/models.py:1564 | ||||||
| msgid "Estimated build wastage quantity (absolute or percentage)" | msgid "Estimated build wastage quantity (absolute or percentage)" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1543 | #: part/models.py:1567 | ||||||
| msgid "BOM item reference" | msgid "BOM item reference" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1546 | #: part/models.py:1570 | ||||||
| msgid "BOM item notes" | msgid "BOM item notes" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1548 | #: part/models.py:1572 | ||||||
| msgid "BOM line checksum" | msgid "BOM line checksum" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1612 part/views.py:1352 part/views.py:1404 | #: part/models.py:1636 part/views.py:1401 part/views.py:1453 | ||||||
| #: stock/models.py:231 | #: stock/models.py:231 | ||||||
| msgid "Quantity must be integer value for trackable parts" | msgid "Quantity must be integer value for trackable parts" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1621 | #: part/models.py:1645 | ||||||
| msgid "BOM Item" | msgid "BOM Item" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -2396,54 +2409,66 @@ msgid "Import BOM data" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:42 | #: part/templates/part/bom.html:42 | ||||||
| msgid "Upload" | msgid "Import from File" | ||||||
| msgstr "" |  | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:44 |  | ||||||
| msgid "New BOM Item" |  | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:45 | #: part/templates/part/bom.html:45 | ||||||
|  | msgid "Copy BOM from parent part" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/templates/part/bom.html:46 | ||||||
|  | msgid "Copy from Parent" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/templates/part/bom.html:49 | ||||||
|  | msgid "New BOM Item" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/templates/part/bom.html:50 | ||||||
| msgid "Add Item" | msgid "Add Item" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:47 | #: part/templates/part/bom.html:52 | ||||||
| msgid "Finish Editing" | msgid "Finish Editing" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:48 | #: part/templates/part/bom.html:53 | ||||||
| msgid "Finished" | msgid "Finished" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:52 | #: part/templates/part/bom.html:57 | ||||||
| msgid "Edit BOM" | msgid "Edit BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:53 part/templates/part/params.html:38 | #: part/templates/part/bom.html:58 part/templates/part/params.html:38 | ||||||
| #: templates/InvenTree/settings/user.html:19 | #: templates/InvenTree/settings/user.html:19 | ||||||
| msgid "Edit" | msgid "Edit" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:56 | #: part/templates/part/bom.html:61 | ||||||
| msgid "Validate Bill of Materials" | msgid "Validate Bill of Materials" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:57 | #: part/templates/part/bom.html:62 | ||||||
| msgid "Validate" | msgid "Validate" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:61 part/views.py:1643 | #: part/templates/part/bom.html:66 part/views.py:1692 | ||||||
| msgid "Export Bill of Materials" | msgid "Export Bill of Materials" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:122 | #: part/templates/part/bom.html:127 | ||||||
| msgid "Delete selected BOM items?" | msgid "Delete selected BOM items?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:123 | #: part/templates/part/bom.html:128 | ||||||
| msgid "All selected BOM items will be deleted" | msgid "All selected BOM items will be deleted" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/templates/part/bom_duplicate.html:13 | ||||||
|  | msgid "This part already has a Bill of Materials" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom_upload/select_fields.html:8 | #: part/templates/part/bom_upload/select_fields.html:8 | ||||||
| #: part/templates/part/bom_upload/select_parts.html:8 | #: part/templates/part/bom_upload/select_parts.html:8 | ||||||
| #: part/templates/part/bom_upload/upload_file.html:10 | #: part/templates/part/bom_upload/upload_file.html:10 | ||||||
| @@ -2524,7 +2549,7 @@ msgstr "" | |||||||
| msgid "All parts" | msgid "All parts" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/category.html:24 part/views.py:2046 | #: part/templates/part/category.html:24 part/views.py:2095 | ||||||
| msgid "Create new part category" | msgid "Create new part category" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -2670,98 +2695,98 @@ msgstr "" | |||||||
| msgid "Responsible User" | msgid "Responsible User" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:136 templates/js/table_filters.js:27 | #: part/templates/part/detail.html:138 templates/js/table_filters.js:27 | ||||||
| msgid "Virtual" | msgid "Virtual" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:139 | #: part/templates/part/detail.html:141 | ||||||
| msgid "Part is virtual (not a physical part)" | msgid "Part is virtual (not a physical part)" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:141 | #: part/templates/part/detail.html:143 | ||||||
| msgid "Part is not a virtual part" | msgid "Part is not a virtual part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:145 stock/forms.py:248 | #: part/templates/part/detail.html:148 stock/forms.py:248 | ||||||
| #: templates/js/table_filters.js:23 templates/js/table_filters.js:243 | #: templates/js/table_filters.js:23 templates/js/table_filters.js:243 | ||||||
| msgid "Template" | msgid "Template" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:148 | #: part/templates/part/detail.html:151 | ||||||
| msgid "Part is a template part (variants can be made from this part)" | msgid "Part is a template part (variants can be made from this part)" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:150 | #: part/templates/part/detail.html:153 | ||||||
| msgid "Part is not a template part" | msgid "Part is not a template part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:154 templates/js/table_filters.js:255 | #: part/templates/part/detail.html:158 templates/js/table_filters.js:255 | ||||||
| msgid "Assembly" | msgid "Assembly" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:157 | #: part/templates/part/detail.html:161 | ||||||
| msgid "Part can be assembled from other parts" | msgid "Part can be assembled from other parts" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:159 | #: part/templates/part/detail.html:163 | ||||||
| msgid "Part cannot be assembled from other parts" | msgid "Part cannot be assembled from other parts" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:163 templates/js/table_filters.js:259 | #: part/templates/part/detail.html:168 templates/js/table_filters.js:259 | ||||||
| msgid "Component" | msgid "Component" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:166 | #: part/templates/part/detail.html:171 | ||||||
| msgid "Part can be used in assemblies" | msgid "Part can be used in assemblies" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:168 | #: part/templates/part/detail.html:173 | ||||||
| msgid "Part cannot be used in assemblies" | msgid "Part cannot be used in assemblies" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:172 templates/js/table_filters.js:31 | #: part/templates/part/detail.html:178 templates/js/table_filters.js:31 | ||||||
| #: templates/js/table_filters.js:271 | #: templates/js/table_filters.js:271 | ||||||
| msgid "Trackable" | msgid "Trackable" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:175 | #: part/templates/part/detail.html:181 | ||||||
| msgid "Part stock is tracked by serial number" | msgid "Part stock is tracked by serial number" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:177 | #: part/templates/part/detail.html:183 | ||||||
| msgid "Part stock is not tracked by serial number" | msgid "Part stock is not tracked by serial number" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:181 | #: part/templates/part/detail.html:188 | ||||||
| msgid "Purchaseable" | msgid "Purchaseable" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:184 part/templates/part/detail.html:186 | #: part/templates/part/detail.html:191 part/templates/part/detail.html:193 | ||||||
| msgid "Part can be purchased from external suppliers" | msgid "Part can be purchased from external suppliers" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:190 templates/js/table_filters.js:267 | #: part/templates/part/detail.html:198 templates/js/table_filters.js:267 | ||||||
| msgid "Salable" | msgid "Salable" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:193 | #: part/templates/part/detail.html:201 | ||||||
| msgid "Part can be sold to customers" | msgid "Part can be sold to customers" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:195 | #: part/templates/part/detail.html:203 | ||||||
| msgid "Part cannot be sold to customers" | msgid "Part cannot be sold to customers" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:199 templates/js/table_filters.js:19 | #: part/templates/part/detail.html:214 templates/js/table_filters.js:19 | ||||||
| #: templates/js/table_filters.js:55 templates/js/table_filters.js:238 | #: templates/js/table_filters.js:55 templates/js/table_filters.js:238 | ||||||
| msgid "Active" | msgid "Active" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:202 | #: part/templates/part/detail.html:217 | ||||||
| msgid "Part is active" | msgid "Part is active" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:204 | #: part/templates/part/detail.html:219 | ||||||
| msgid "Part is not active" | msgid "Part is not active" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -3069,95 +3094,103 @@ msgstr "" | |||||||
| msgid "Edit Part Properties" | msgid "Edit Part Properties" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:838 | #: part/views.py:841 | ||||||
|  | msgid "Duplicate BOM" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/views.py:871 | ||||||
|  | msgid "Confirm duplication of BOM from parent" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/views.py:887 | ||||||
| msgid "Validate BOM" | msgid "Validate BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1005 | #: part/views.py:1054 | ||||||
| msgid "No BOM file provided" | msgid "No BOM file provided" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1355 | #: part/views.py:1404 | ||||||
| msgid "Enter a valid quantity" | msgid "Enter a valid quantity" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1380 part/views.py:1383 | #: part/views.py:1429 part/views.py:1432 | ||||||
| msgid "Select valid part" | msgid "Select valid part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1389 | #: part/views.py:1438 | ||||||
| msgid "Duplicate part selected" | msgid "Duplicate part selected" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1427 | #: part/views.py:1476 | ||||||
| msgid "Select a part" | msgid "Select a part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1433 | #: part/views.py:1482 | ||||||
| msgid "Selected part creates a circular BOM" | msgid "Selected part creates a circular BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1437 | #: part/views.py:1486 | ||||||
| msgid "Specify quantity" | msgid "Specify quantity" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1693 | #: part/views.py:1742 | ||||||
| msgid "Confirm Part Deletion" | msgid "Confirm Part Deletion" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1702 | #: part/views.py:1751 | ||||||
| msgid "Part was deleted" | msgid "Part was deleted" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1711 | #: part/views.py:1760 | ||||||
| msgid "Part Pricing" | msgid "Part Pricing" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1837 | #: part/views.py:1886 | ||||||
| msgid "Create Part Parameter Template" | msgid "Create Part Parameter Template" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1847 | #: part/views.py:1896 | ||||||
| msgid "Edit Part Parameter Template" | msgid "Edit Part Parameter Template" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1856 | #: part/views.py:1905 | ||||||
| msgid "Delete Part Parameter Template" | msgid "Delete Part Parameter Template" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1866 | #: part/views.py:1915 | ||||||
| msgid "Create Part Parameter" | msgid "Create Part Parameter" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1918 | #: part/views.py:1967 | ||||||
| msgid "Edit Part Parameter" | msgid "Edit Part Parameter" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1934 | #: part/views.py:1983 | ||||||
| msgid "Delete Part Parameter" | msgid "Delete Part Parameter" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1993 | #: part/views.py:2042 | ||||||
| msgid "Edit Part Category" | msgid "Edit Part Category" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:2030 | #: part/views.py:2079 | ||||||
| msgid "Delete Part Category" | msgid "Delete Part Category" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:2038 | #: part/views.py:2087 | ||||||
| msgid "Part category was deleted" | msgid "Part category was deleted" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:2101 | #: part/views.py:2150 | ||||||
| msgid "Create BOM Item" | msgid "Create BOM Item" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:2169 | #: part/views.py:2218 | ||||||
| msgid "Edit BOM item" | msgid "Edit BOM item" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:2219 | #: part/views.py:2268 | ||||||
| msgid "Confim BOM item deletion" | msgid "Confim BOM item deletion" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ msgid "" | |||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: PACKAGE VERSION\n" | "Project-Id-Version: PACKAGE VERSION\n" | ||||||
| "Report-Msgid-Bugs-To: \n" | "Report-Msgid-Bugs-To: \n" | ||||||
| "POT-Creation-Date: 2020-10-29 02:25+0000\n" | "POT-Creation-Date: 2020-10-29 23:05+0000\n" | ||||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | "Language-Team: LANGUAGE <LL@li.org>\n" | ||||||
| @@ -204,7 +204,7 @@ msgstr "" | |||||||
| msgid "Overage must be an integer value or a percentage" | msgid "Overage must be an integer value or a percentage" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: InvenTree/views.py:707 | #: InvenTree/views.py:752 | ||||||
| msgid "Database Statistics" | msgid "Database Statistics" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -520,7 +520,7 @@ msgstr "" | |||||||
| msgid "No BOM items found" | msgid "No BOM items found" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: build/templates/build/allocate.html:347 part/models.py:1401 | #: build/templates/build/allocate.html:347 part/models.py:1425 | ||||||
| #: templates/js/part.js:569 templates/js/table_filters.js:167 | #: templates/js/part.js:569 templates/js/table_filters.js:167 | ||||||
| msgid "Required" | msgid "Required" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -1192,7 +1192,7 @@ msgstr "" | |||||||
|  |  | ||||||
| #: company/templates/company/detail_stock.html:35 | #: company/templates/company/detail_stock.html:35 | ||||||
| #: company/templates/company/supplier_part_stock.html:33 | #: company/templates/company/supplier_part_stock.html:33 | ||||||
| #: part/templates/part/bom.html:62 part/templates/part/category.html:112 | #: part/templates/part/bom.html:67 part/templates/part/category.html:112 | ||||||
| #: part/templates/part/category.html:126 part/templates/part/stock.html:51 | #: part/templates/part/category.html:126 part/templates/part/stock.html:51 | ||||||
| #: templates/stock_table.html:7 | #: templates/stock_table.html:7 | ||||||
| msgid "Export" | msgid "Export" | ||||||
| @@ -1310,7 +1310,7 @@ msgid "Pricing Information" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: company/templates/company/supplier_part_pricing.html:17 company/views.py:410 | #: company/templates/company/supplier_part_pricing.html:17 company/views.py:410 | ||||||
| #: part/templates/part/sale_prices.html:13 part/views.py:2229 | #: part/templates/part/sale_prices.html:13 part/views.py:2278 | ||||||
| msgid "Add Price Break" | msgid "Add Price Break" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -1437,15 +1437,15 @@ msgstr "" | |||||||
| msgid "Delete Supplier Part" | msgid "Delete Supplier Part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: company/views.py:416 part/views.py:2235 | #: company/views.py:416 part/views.py:2284 | ||||||
| msgid "Added new price break" | msgid "Added new price break" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: company/views.py:453 part/views.py:2280 | #: company/views.py:453 part/views.py:2329 | ||||||
| msgid "Edit Price Break" | msgid "Edit Price Break" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: company/views.py:469 part/views.py:2296 | #: company/views.py:469 part/views.py:2345 | ||||||
| msgid "Delete Price Break" | msgid "Delete Price Break" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -1538,7 +1538,7 @@ msgstr "" | |||||||
| msgid "Date order was completed" | msgid "Date order was completed" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: order/models.py:185 order/models.py:259 part/views.py:1346 | #: order/models.py:185 order/models.py:259 part/views.py:1395 | ||||||
| #: stock/models.py:241 stock/models.py:805 | #: stock/models.py:241 stock/models.py:805 | ||||||
| msgid "Quantity must be greater than zero" | msgid "Quantity must be greater than zero" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -1815,6 +1815,7 @@ msgstr "" | |||||||
|  |  | ||||||
| #: order/templates/order/sales_order_cancel.html:8 | #: order/templates/order/sales_order_cancel.html:8 | ||||||
| #: order/templates/order/sales_order_ship.html:9 | #: order/templates/order/sales_order_ship.html:9 | ||||||
|  | #: part/templates/part/bom_duplicate.html:12 | ||||||
| #: stock/templates/stock/stockitem_convert.html:13 | #: stock/templates/stock/stockitem_convert.html:13 | ||||||
| msgid "Warning" | msgid "Warning" | ||||||
| msgstr "" | msgstr "" | ||||||
| @@ -2039,91 +2040,107 @@ msgstr "" | |||||||
| msgid "Error reading BOM file (incorrect row size)" | msgid "Error reading BOM file (incorrect row size)" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:57 stock/forms.py:254 | #: part/forms.py:62 stock/forms.py:254 | ||||||
| msgid "File Format" | msgid "File Format" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:57 stock/forms.py:254 | #: part/forms.py:62 stock/forms.py:254 | ||||||
| msgid "Select output file format" | msgid "Select output file format" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:59 | #: part/forms.py:64 | ||||||
| msgid "Cascading" | msgid "Cascading" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:59 | #: part/forms.py:64 | ||||||
| msgid "Download cascading / multi-level BOM" | msgid "Download cascading / multi-level BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:61 | #: part/forms.py:66 | ||||||
| msgid "Levels" | msgid "Levels" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:61 | #: part/forms.py:66 | ||||||
| msgid "Select maximum number of BOM levels to export (0 = all levels)" | msgid "Select maximum number of BOM levels to export (0 = all levels)" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:63 | #: part/forms.py:68 | ||||||
| msgid "Include Parameter Data" | msgid "Include Parameter Data" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:63 | #: part/forms.py:68 | ||||||
| msgid "Include part parameters data in exported BOM" | msgid "Include part parameters data in exported BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:65 | #: part/forms.py:70 | ||||||
| msgid "Include Stock Data" | msgid "Include Stock Data" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:65 | #: part/forms.py:70 | ||||||
| msgid "Include part stock data in exported BOM" | msgid "Include part stock data in exported BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:67 | #: part/forms.py:72 | ||||||
| msgid "Include Supplier Data" | msgid "Include Supplier Data" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:67 | #: part/forms.py:72 | ||||||
| msgid "Include part supplier data in exported BOM" | msgid "Include part supplier data in exported BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:86 | #: part/forms.py:93 part/models.py:1504 | ||||||
|  | msgid "Parent Part" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/forms.py:94 part/templates/part/bom_duplicate.html:7 | ||||||
|  | msgid "Select parent part to copy BOM from" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/forms.py:100 | ||||||
|  | msgid "Clear existing BOM items" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/forms.py:105 | ||||||
|  | msgid "Confirm BOM duplication" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/forms.py:123 | ||||||
| msgid "Confirm that the BOM is correct" | msgid "Confirm that the BOM is correct" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:98 | #: part/forms.py:135 | ||||||
| msgid "Select BOM file to upload" | msgid "Select BOM file to upload" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:122 | #: part/forms.py:159 | ||||||
| msgid "Select part category" | msgid "Select part category" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:136 | #: part/forms.py:173 | ||||||
| msgid "Duplicate all BOM data for this part" | msgid "Duplicate all BOM data for this part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:137 | #: part/forms.py:174 | ||||||
| msgid "Copy BOM" | msgid "Copy BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:142 | #: part/forms.py:179 | ||||||
| msgid "Duplicate all parameter data for this part" | msgid "Duplicate all parameter data for this part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:143 | #: part/forms.py:180 | ||||||
| msgid "Copy Parameters" | msgid "Copy Parameters" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:148 | #: part/forms.py:185 | ||||||
| msgid "Confirm part creation" | msgid "Confirm part creation" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:248 | #: part/forms.py:279 | ||||||
| msgid "Input quantity for price calculation" | msgid "Input quantity for price calculation" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/forms.py:251 | #: part/forms.py:282 | ||||||
| msgid "Select currency for price calculation" | msgid "Select currency for price calculation" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -2249,112 +2266,108 @@ msgstr "" | |||||||
| msgid "Stored BOM checksum" | msgid "Stored BOM checksum" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1353 | #: part/models.py:1377 | ||||||
| msgid "Test templates can only be created for trackable parts" | msgid "Test templates can only be created for trackable parts" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1370 | #: part/models.py:1394 | ||||||
| msgid "Test with this name already exists for this part" | msgid "Test with this name already exists for this part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1389 templates/js/part.js:560 templates/js/stock.js:92 | #: part/models.py:1413 templates/js/part.js:560 templates/js/stock.js:92 | ||||||
| msgid "Test Name" | msgid "Test Name" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1390 | #: part/models.py:1414 | ||||||
| msgid "Enter a name for the test" | msgid "Enter a name for the test" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1395 | #: part/models.py:1419 | ||||||
| msgid "Test Description" | msgid "Test Description" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1396 | #: part/models.py:1420 | ||||||
| msgid "Enter description for this test" | msgid "Enter description for this test" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1402 | #: part/models.py:1426 | ||||||
| msgid "Is this test required to pass?" | msgid "Is this test required to pass?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1407 templates/js/part.js:577 | #: part/models.py:1431 templates/js/part.js:577 | ||||||
| msgid "Requires Value" | msgid "Requires Value" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1408 | #: part/models.py:1432 | ||||||
| msgid "Does this test require a value when adding a test result?" | msgid "Does this test require a value when adding a test result?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1413 templates/js/part.js:584 | #: part/models.py:1437 templates/js/part.js:584 | ||||||
| msgid "Requires Attachment" | msgid "Requires Attachment" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1414 | #: part/models.py:1438 | ||||||
| msgid "Does this test require a file attachment when adding a test result?" | msgid "Does this test require a file attachment when adding a test result?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1447 | #: part/models.py:1471 | ||||||
| msgid "Parameter template name must be unique" | msgid "Parameter template name must be unique" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1452 | #: part/models.py:1476 | ||||||
| msgid "Parameter Name" | msgid "Parameter Name" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1454 | #: part/models.py:1478 | ||||||
| msgid "Parameter Units" | msgid "Parameter Units" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1480 | #: part/models.py:1506 | ||||||
| msgid "Parent Part" |  | ||||||
| msgstr "" |  | ||||||
|  |  | ||||||
| #: part/models.py:1482 |  | ||||||
| msgid "Parameter Template" | msgid "Parameter Template" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1484 | #: part/models.py:1508 | ||||||
| msgid "Parameter Value" | msgid "Parameter Value" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1521 | #: part/models.py:1545 | ||||||
| msgid "Select parent part" | msgid "Select parent part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1529 | #: part/models.py:1553 | ||||||
| msgid "Select part to be used in BOM" | msgid "Select part to be used in BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1535 | #: part/models.py:1559 | ||||||
| msgid "BOM quantity for this BOM item" | msgid "BOM quantity for this BOM item" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1537 | #: part/models.py:1561 | ||||||
| msgid "This BOM item is optional" | msgid "This BOM item is optional" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1540 | #: part/models.py:1564 | ||||||
| msgid "Estimated build wastage quantity (absolute or percentage)" | msgid "Estimated build wastage quantity (absolute or percentage)" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1543 | #: part/models.py:1567 | ||||||
| msgid "BOM item reference" | msgid "BOM item reference" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1546 | #: part/models.py:1570 | ||||||
| msgid "BOM item notes" | msgid "BOM item notes" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1548 | #: part/models.py:1572 | ||||||
| msgid "BOM line checksum" | msgid "BOM line checksum" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1612 part/views.py:1352 part/views.py:1404 | #: part/models.py:1636 part/views.py:1401 part/views.py:1453 | ||||||
| #: stock/models.py:231 | #: stock/models.py:231 | ||||||
| msgid "Quantity must be integer value for trackable parts" | msgid "Quantity must be integer value for trackable parts" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/models.py:1621 | #: part/models.py:1645 | ||||||
| msgid "BOM Item" | msgid "BOM Item" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -2396,54 +2409,66 @@ msgid "Import BOM data" | |||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:42 | #: part/templates/part/bom.html:42 | ||||||
| msgid "Upload" | msgid "Import from File" | ||||||
| msgstr "" |  | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:44 |  | ||||||
| msgid "New BOM Item" |  | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:45 | #: part/templates/part/bom.html:45 | ||||||
|  | msgid "Copy BOM from parent part" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/templates/part/bom.html:46 | ||||||
|  | msgid "Copy from Parent" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/templates/part/bom.html:49 | ||||||
|  | msgid "New BOM Item" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/templates/part/bom.html:50 | ||||||
| msgid "Add Item" | msgid "Add Item" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:47 | #: part/templates/part/bom.html:52 | ||||||
| msgid "Finish Editing" | msgid "Finish Editing" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:48 | #: part/templates/part/bom.html:53 | ||||||
| msgid "Finished" | msgid "Finished" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:52 | #: part/templates/part/bom.html:57 | ||||||
| msgid "Edit BOM" | msgid "Edit BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:53 part/templates/part/params.html:38 | #: part/templates/part/bom.html:58 part/templates/part/params.html:38 | ||||||
| #: templates/InvenTree/settings/user.html:19 | #: templates/InvenTree/settings/user.html:19 | ||||||
| msgid "Edit" | msgid "Edit" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:56 | #: part/templates/part/bom.html:61 | ||||||
| msgid "Validate Bill of Materials" | msgid "Validate Bill of Materials" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:57 | #: part/templates/part/bom.html:62 | ||||||
| msgid "Validate" | msgid "Validate" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:61 part/views.py:1643 | #: part/templates/part/bom.html:66 part/views.py:1692 | ||||||
| msgid "Export Bill of Materials" | msgid "Export Bill of Materials" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:122 | #: part/templates/part/bom.html:127 | ||||||
| msgid "Delete selected BOM items?" | msgid "Delete selected BOM items?" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom.html:123 | #: part/templates/part/bom.html:128 | ||||||
| msgid "All selected BOM items will be deleted" | msgid "All selected BOM items will be deleted" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/templates/part/bom_duplicate.html:13 | ||||||
|  | msgid "This part already has a Bill of Materials" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/bom_upload/select_fields.html:8 | #: part/templates/part/bom_upload/select_fields.html:8 | ||||||
| #: part/templates/part/bom_upload/select_parts.html:8 | #: part/templates/part/bom_upload/select_parts.html:8 | ||||||
| #: part/templates/part/bom_upload/upload_file.html:10 | #: part/templates/part/bom_upload/upload_file.html:10 | ||||||
| @@ -2524,7 +2549,7 @@ msgstr "" | |||||||
| msgid "All parts" | msgid "All parts" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/category.html:24 part/views.py:2046 | #: part/templates/part/category.html:24 part/views.py:2095 | ||||||
| msgid "Create new part category" | msgid "Create new part category" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -2670,98 +2695,98 @@ msgstr "" | |||||||
| msgid "Responsible User" | msgid "Responsible User" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:136 templates/js/table_filters.js:27 | #: part/templates/part/detail.html:138 templates/js/table_filters.js:27 | ||||||
| msgid "Virtual" | msgid "Virtual" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:139 | #: part/templates/part/detail.html:141 | ||||||
| msgid "Part is virtual (not a physical part)" | msgid "Part is virtual (not a physical part)" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:141 | #: part/templates/part/detail.html:143 | ||||||
| msgid "Part is not a virtual part" | msgid "Part is not a virtual part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:145 stock/forms.py:248 | #: part/templates/part/detail.html:148 stock/forms.py:248 | ||||||
| #: templates/js/table_filters.js:23 templates/js/table_filters.js:243 | #: templates/js/table_filters.js:23 templates/js/table_filters.js:243 | ||||||
| msgid "Template" | msgid "Template" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:148 | #: part/templates/part/detail.html:151 | ||||||
| msgid "Part is a template part (variants can be made from this part)" | msgid "Part is a template part (variants can be made from this part)" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:150 | #: part/templates/part/detail.html:153 | ||||||
| msgid "Part is not a template part" | msgid "Part is not a template part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:154 templates/js/table_filters.js:255 | #: part/templates/part/detail.html:158 templates/js/table_filters.js:255 | ||||||
| msgid "Assembly" | msgid "Assembly" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:157 | #: part/templates/part/detail.html:161 | ||||||
| msgid "Part can be assembled from other parts" | msgid "Part can be assembled from other parts" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:159 | #: part/templates/part/detail.html:163 | ||||||
| msgid "Part cannot be assembled from other parts" | msgid "Part cannot be assembled from other parts" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:163 templates/js/table_filters.js:259 | #: part/templates/part/detail.html:168 templates/js/table_filters.js:259 | ||||||
| msgid "Component" | msgid "Component" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:166 | #: part/templates/part/detail.html:171 | ||||||
| msgid "Part can be used in assemblies" | msgid "Part can be used in assemblies" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:168 | #: part/templates/part/detail.html:173 | ||||||
| msgid "Part cannot be used in assemblies" | msgid "Part cannot be used in assemblies" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:172 templates/js/table_filters.js:31 | #: part/templates/part/detail.html:178 templates/js/table_filters.js:31 | ||||||
| #: templates/js/table_filters.js:271 | #: templates/js/table_filters.js:271 | ||||||
| msgid "Trackable" | msgid "Trackable" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:175 | #: part/templates/part/detail.html:181 | ||||||
| msgid "Part stock is tracked by serial number" | msgid "Part stock is tracked by serial number" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:177 | #: part/templates/part/detail.html:183 | ||||||
| msgid "Part stock is not tracked by serial number" | msgid "Part stock is not tracked by serial number" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:181 | #: part/templates/part/detail.html:188 | ||||||
| msgid "Purchaseable" | msgid "Purchaseable" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:184 part/templates/part/detail.html:186 | #: part/templates/part/detail.html:191 part/templates/part/detail.html:193 | ||||||
| msgid "Part can be purchased from external suppliers" | msgid "Part can be purchased from external suppliers" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:190 templates/js/table_filters.js:267 | #: part/templates/part/detail.html:198 templates/js/table_filters.js:267 | ||||||
| msgid "Salable" | msgid "Salable" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:193 | #: part/templates/part/detail.html:201 | ||||||
| msgid "Part can be sold to customers" | msgid "Part can be sold to customers" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:195 | #: part/templates/part/detail.html:203 | ||||||
| msgid "Part cannot be sold to customers" | msgid "Part cannot be sold to customers" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:199 templates/js/table_filters.js:19 | #: part/templates/part/detail.html:214 templates/js/table_filters.js:19 | ||||||
| #: templates/js/table_filters.js:55 templates/js/table_filters.js:238 | #: templates/js/table_filters.js:55 templates/js/table_filters.js:238 | ||||||
| msgid "Active" | msgid "Active" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:202 | #: part/templates/part/detail.html:217 | ||||||
| msgid "Part is active" | msgid "Part is active" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/templates/part/detail.html:204 | #: part/templates/part/detail.html:219 | ||||||
| msgid "Part is not active" | msgid "Part is not active" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| @@ -3069,95 +3094,103 @@ msgstr "" | |||||||
| msgid "Edit Part Properties" | msgid "Edit Part Properties" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:838 | #: part/views.py:841 | ||||||
|  | msgid "Duplicate BOM" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/views.py:871 | ||||||
|  | msgid "Confirm duplication of BOM from parent" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: part/views.py:887 | ||||||
| msgid "Validate BOM" | msgid "Validate BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1005 | #: part/views.py:1054 | ||||||
| msgid "No BOM file provided" | msgid "No BOM file provided" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1355 | #: part/views.py:1404 | ||||||
| msgid "Enter a valid quantity" | msgid "Enter a valid quantity" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1380 part/views.py:1383 | #: part/views.py:1429 part/views.py:1432 | ||||||
| msgid "Select valid part" | msgid "Select valid part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1389 | #: part/views.py:1438 | ||||||
| msgid "Duplicate part selected" | msgid "Duplicate part selected" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1427 | #: part/views.py:1476 | ||||||
| msgid "Select a part" | msgid "Select a part" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1433 | #: part/views.py:1482 | ||||||
| msgid "Selected part creates a circular BOM" | msgid "Selected part creates a circular BOM" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1437 | #: part/views.py:1486 | ||||||
| msgid "Specify quantity" | msgid "Specify quantity" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1693 | #: part/views.py:1742 | ||||||
| msgid "Confirm Part Deletion" | msgid "Confirm Part Deletion" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1702 | #: part/views.py:1751 | ||||||
| msgid "Part was deleted" | msgid "Part was deleted" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1711 | #: part/views.py:1760 | ||||||
| msgid "Part Pricing" | msgid "Part Pricing" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1837 | #: part/views.py:1886 | ||||||
| msgid "Create Part Parameter Template" | msgid "Create Part Parameter Template" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1847 | #: part/views.py:1896 | ||||||
| msgid "Edit Part Parameter Template" | msgid "Edit Part Parameter Template" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1856 | #: part/views.py:1905 | ||||||
| msgid "Delete Part Parameter Template" | msgid "Delete Part Parameter Template" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1866 | #: part/views.py:1915 | ||||||
| msgid "Create Part Parameter" | msgid "Create Part Parameter" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1918 | #: part/views.py:1967 | ||||||
| msgid "Edit Part Parameter" | msgid "Edit Part Parameter" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1934 | #: part/views.py:1983 | ||||||
| msgid "Delete Part Parameter" | msgid "Delete Part Parameter" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:1993 | #: part/views.py:2042 | ||||||
| msgid "Edit Part Category" | msgid "Edit Part Category" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:2030 | #: part/views.py:2079 | ||||||
| msgid "Delete Part Category" | msgid "Delete Part Category" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:2038 | #: part/views.py:2087 | ||||||
| msgid "Part category was deleted" | msgid "Part category was deleted" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:2101 | #: part/views.py:2150 | ||||||
| msgid "Create BOM Item" | msgid "Create BOM Item" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:2169 | #: part/views.py:2218 | ||||||
| msgid "Edit BOM item" | msgid "Edit BOM item" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
| #: part/views.py:2219 | #: part/views.py:2268 | ||||||
| msgid "Confim BOM item deletion" | msgid "Confim BOM item deletion" | ||||||
| msgstr "" | msgstr "" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -100,9 +100,9 @@ class PurchaseOrderAttachmentCreate(AjaxCreateView): | |||||||
|     ajax_template_name = "modal_form.html" |     ajax_template_name = "modal_form.html" | ||||||
|     role_required = 'purchase_order.add' |     role_required = 'purchase_order.add' | ||||||
|  |  | ||||||
|     def post_save(self, **kwargs): |     def post_save(self, attachment, form, **kwargs): | ||||||
|         self.object.user = self.request.user |         attachment.user = self.request.user | ||||||
|         self.object.save() |         attachment.save() | ||||||
|  |  | ||||||
|     def get_data(self): |     def get_data(self): | ||||||
|         return { |         return { | ||||||
| @@ -148,7 +148,7 @@ class SalesOrderAttachmentCreate(AjaxCreateView): | |||||||
|     ajax_form_title = _('Add Sales Order Attachment') |     ajax_form_title = _('Add Sales Order Attachment') | ||||||
|     role_required = 'sales_order.add' |     role_required = 'sales_order.add' | ||||||
|  |  | ||||||
|     def post_save(self, **kwargs): |     def post_save(self, attachment, form, **kwargs): | ||||||
|         self.object.user = self.request.user |         self.object.user = self.request.user | ||||||
|         self.object.save() |         self.object.save() | ||||||
|  |  | ||||||
| @@ -319,11 +319,11 @@ class PurchaseOrderCreate(AjaxCreateView): | |||||||
|  |  | ||||||
|         return initials |         return initials | ||||||
|  |  | ||||||
|     def post_save(self, **kwargs): |     def post_save(self, order, form, **kwargs): | ||||||
|         # Record the user who created this purchase order |         # Record the user who created this purchase order | ||||||
|  |  | ||||||
|         self.object.created_by = self.request.user |         order.created_by = self.request.user | ||||||
|         self.object.save() |         order.save() | ||||||
|  |  | ||||||
|  |  | ||||||
| class SalesOrderCreate(AjaxCreateView): | class SalesOrderCreate(AjaxCreateView): | ||||||
| @@ -351,10 +351,10 @@ class SalesOrderCreate(AjaxCreateView): | |||||||
|  |  | ||||||
|         return initials |         return initials | ||||||
|  |  | ||||||
|     def post_save(self, **kwargs): |     def post_save(self, order, form, **kwargs): | ||||||
|         # Record the user who created this sales order |         # Record the user who created this sales order | ||||||
|         self.object.created_by = self.request.user |         order.created_by = self.request.user | ||||||
|         self.object.save() |         order.save() | ||||||
|  |  | ||||||
|  |  | ||||||
| class PurchaseOrderEdit(AjaxUpdateView): | class PurchaseOrderEdit(AjaxUpdateView): | ||||||
|   | |||||||
| @@ -19,10 +19,15 @@ from .models import PartParameterTemplate, PartParameter | |||||||
| from .models import PartTestTemplate | from .models import PartTestTemplate | ||||||
| from .models import PartSellPriceBreak | from .models import PartSellPriceBreak | ||||||
|  |  | ||||||
|  |  | ||||||
| from common.models import Currency | from common.models import Currency | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class PartModelChoiceField(forms.ModelChoiceField): | ||||||
|  |     """ Extending string representation of Part instance with available stock """ | ||||||
|  |     def label_from_instance(self, part): | ||||||
|  |         return f'{part} - {part.available_stock}' | ||||||
|  |  | ||||||
|  |  | ||||||
| class PartImageForm(HelperForm): | class PartImageForm(HelperForm): | ||||||
|     """ Form for uploading a Part image """ |     """ Form for uploading a Part image """ | ||||||
|  |  | ||||||
| @@ -77,6 +82,38 @@ class BomExportForm(forms.Form): | |||||||
|         self.fields['file_format'].choices = self.get_choices() |         self.fields['file_format'].choices = self.get_choices() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class BomDuplicateForm(HelperForm): | ||||||
|  |     """ | ||||||
|  |     Simple confirmation form for BOM duplication. | ||||||
|  |  | ||||||
|  |     Select which parent to select from. | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     parent = PartModelChoiceField( | ||||||
|  |         label=_('Parent Part'), | ||||||
|  |         help_text=_('Select parent part to copy BOM from'), | ||||||
|  |         queryset=Part.objects.filter(is_template=True), | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     clear = forms.BooleanField( | ||||||
|  |         required=False, initial=True, | ||||||
|  |         help_text=_('Clear existing BOM items') | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     confirm = forms.BooleanField( | ||||||
|  |         required=False, initial=False, | ||||||
|  |         help_text=_('Confirm BOM duplication') | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     class Meta: | ||||||
|  |         model = Part | ||||||
|  |         fields = [ | ||||||
|  |             'parent', | ||||||
|  |             'clear', | ||||||
|  |             'confirm', | ||||||
|  |         ] | ||||||
|  |  | ||||||
|  |  | ||||||
| class BomValidateForm(HelperForm): | class BomValidateForm(HelperForm): | ||||||
|     """ Simple confirmation form for BOM validation. |     """ Simple confirmation form for BOM validation. | ||||||
|     User is presented with a single checkbox input, |     User is presented with a single checkbox input, | ||||||
| @@ -210,12 +247,6 @@ class EditCategoryForm(HelperForm): | |||||||
|         ] |         ] | ||||||
|  |  | ||||||
|  |  | ||||||
| class PartModelChoiceField(forms.ModelChoiceField): |  | ||||||
|     """ Extending string representation of Part instance with available stock """ |  | ||||||
|     def label_from_instance(self, part): |  | ||||||
|         return f'{part} - {part.available_stock}' |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class EditBomItemForm(HelperForm): | class EditBomItemForm(HelperForm): | ||||||
|     """ Form for editing a BomItem object """ |     """ Form for editing a BomItem object """ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1087,6 +1087,35 @@ class Part(MPTTModel): | |||||||
|                 max(buy_price_range[1], bom_price_range[1]) |                 max(buy_price_range[1], bom_price_range[1]) | ||||||
|             ) |             ) | ||||||
|  |  | ||||||
|  |     @transaction.atomic | ||||||
|  |     def copy_bom_from(self, other, clear=True, **kwargs): | ||||||
|  |         """ | ||||||
|  |         Copy the BOM from another part. | ||||||
|  |  | ||||||
|  |         args: | ||||||
|  |             other - The part to copy the BOM from | ||||||
|  |             clear - Remove existing BOM items first (default=True) | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         if clear: | ||||||
|  |             # Remove existing BOM items | ||||||
|  |             self.bom_items.all().delete() | ||||||
|  |  | ||||||
|  |         for bom_item in other.bom_items.all(): | ||||||
|  |             # If this part already has a BomItem pointing to the same sub-part, | ||||||
|  |             # delete that BomItem from this part first! | ||||||
|  |  | ||||||
|  |             try: | ||||||
|  |                 existing = BomItem.objects.get(part=self, sub_part=bom_item.sub_part) | ||||||
|  |                 existing.delete() | ||||||
|  |             except (BomItem.DoesNotExist): | ||||||
|  |                 pass | ||||||
|  |  | ||||||
|  |             bom_item.part = self | ||||||
|  |             bom_item.pk = None | ||||||
|  |  | ||||||
|  |             bom_item.save() | ||||||
|  |  | ||||||
|     def deepCopy(self, other, **kwargs): |     def deepCopy(self, other, **kwargs): | ||||||
|         """ Duplicates non-field data from another part. |         """ Duplicates non-field data from another part. | ||||||
|         Does not alter the normal fields of this part, |         Does not alter the normal fields of this part, | ||||||
| @@ -1106,12 +1135,7 @@ class Part(MPTTModel): | |||||||
|  |  | ||||||
|         # Copy the BOM data |         # Copy the BOM data | ||||||
|         if kwargs.get('bom', False): |         if kwargs.get('bom', False): | ||||||
|             for item in other.bom_items.all(): |             self.copy_bom_from(other) | ||||||
|                 # Point the item to THIS part. |  | ||||||
|                 # Set the pk to None so a new entry is created. |  | ||||||
|                 item.part = self |  | ||||||
|                 item.pk = None |  | ||||||
|                 item.save() |  | ||||||
|  |  | ||||||
|         # Copy the parameters data |         # Copy the parameters data | ||||||
|         if kwargs.get('parameters', True): |         if kwargs.get('parameters', True): | ||||||
|   | |||||||
| @@ -39,8 +39,13 @@ | |||||||
|             <span class='fas fa-trash-alt'></span> |             <span class='fas fa-trash-alt'></span> | ||||||
|         </button> |         </button> | ||||||
|         <button class='btn btn-primary' type='button' title='{% trans "Import BOM data" %}' id='bom-upload'> |         <button class='btn btn-primary' type='button' title='{% trans "Import BOM data" %}' id='bom-upload'> | ||||||
|             <span class='fas fa-file-upload'></span> {% trans "Upload" %} |             <span class='fas fa-file-upload'></span> {% trans "Import from File" %} | ||||||
|         </button> |         </button> | ||||||
|  |         {% if part.variant_of %} | ||||||
|  |         <button class='btn btn-default' type='button' title='{% trans "Copy BOM from parent part" %}' id='bom-duplicate'> | ||||||
|  |             <span class='fas fa-clone'></span> {% trans "Copy from Parent" %} | ||||||
|  |         </button> | ||||||
|  |         {% endif %} | ||||||
|         <button class='btn btn-default' type='button' title='{% trans "New BOM Item" %}' id='bom-item-new'> |         <button class='btn btn-default' type='button' title='{% trans "New BOM Item" %}' id='bom-item-new'> | ||||||
|             <span class='fas fa-plus-circle'></span> {% trans "Add Item" %} |             <span class='fas fa-plus-circle'></span> {% trans "Add Item" %} | ||||||
|         </button> |         </button> | ||||||
| @@ -157,6 +162,17 @@ | |||||||
|         location.href = "{% url 'upload-bom' part.id %}"; |         location.href = "{% url 'upload-bom' part.id %}"; | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  |     $('#bom-duplicate').click(function() { | ||||||
|  |         launchModalForm( | ||||||
|  |             "{% url 'duplicate-bom' part.id %}", | ||||||
|  |             { | ||||||
|  |                 success: function() { | ||||||
|  |                     $('#bom-table').bootstrapTable('refresh'); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         ); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|     $("#bom-item-new").click(function () { |     $("#bom-item-new").click(function () { | ||||||
|         launchModalForm( |         launchModalForm( | ||||||
|             "{% url 'bom-item-create' %}?parent={{ part.id }}", |             "{% url 'bom-item-create' %}?parent={{ part.id }}", | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								InvenTree/part/templates/part/bom_duplicate.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								InvenTree/part/templates/part/bom_duplicate.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | {% extends "modal_form.html" %} | ||||||
|  | {% load i18n %} | ||||||
|  |  | ||||||
|  | {% block pre_form_content %} | ||||||
|  |  | ||||||
|  | <p> | ||||||
|  |     {% trans "Select parent part to copy BOM from" %} | ||||||
|  | </p> | ||||||
|  |  | ||||||
|  | {% if part.has_bom %} | ||||||
|  | <div class='alert alert-block alert-danger'> | ||||||
|  |     <b>{% trans "Warning" %}</b><br> | ||||||
|  |     {% trans "This part already has a Bill of Materials" %}<br> | ||||||
|  | </div> | ||||||
|  | {% endif %} | ||||||
|  |  | ||||||
|  | {% endblock %} | ||||||
| @@ -46,6 +46,7 @@ part_detail_urls = [ | |||||||
|     url(r'^pricing/', views.PartPricing.as_view(), name='part-pricing'), |     url(r'^pricing/', views.PartPricing.as_view(), name='part-pricing'), | ||||||
|      |      | ||||||
|     url(r'^bom-upload/?', views.BomUpload.as_view(), name='upload-bom'), |     url(r'^bom-upload/?', views.BomUpload.as_view(), name='upload-bom'), | ||||||
|  |     url(r'^bom-duplicate/?', views.BomDuplicate.as_view(), name='duplicate-bom'), | ||||||
|      |      | ||||||
|     url(r'^params/', views.PartDetail.as_view(template_name='part/params.html'), name='part-params'), |     url(r'^params/', views.PartDetail.as_view(template_name='part/params.html'), name='part-params'), | ||||||
|     url(r'^variants/?', views.PartDetail.as_view(template_name='part/variants.html'), name='part-variants'), |     url(r'^variants/?', views.PartDetail.as_view(template_name='part/variants.html'), name='part-variants'), | ||||||
|   | |||||||
| @@ -831,8 +831,60 @@ class PartEdit(AjaxUpdateView): | |||||||
|         return form |         return form | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class BomDuplicate(AjaxUpdateView): | ||||||
|  |     """ | ||||||
|  |     View for duplicating BOM from a parent item. | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     model = Part | ||||||
|  |     context_object_name = 'part' | ||||||
|  |     ajax_form_title = _('Duplicate BOM') | ||||||
|  |     ajax_template_name = 'part/bom_duplicate.html' | ||||||
|  |     form_class = part_forms.BomDuplicateForm | ||||||
|  |     role_required = 'part.change' | ||||||
|  |      | ||||||
|  |     def get_form(self): | ||||||
|  |  | ||||||
|  |         form = super().get_form() | ||||||
|  |  | ||||||
|  |         # Limit choices to parents of the current part | ||||||
|  |         parents = self.get_object().get_ancestors() | ||||||
|  |  | ||||||
|  |         form.fields['parent'].queryset = parents | ||||||
|  |  | ||||||
|  |         return form | ||||||
|  |  | ||||||
|  |     def get_initial(self): | ||||||
|  |         initials = super().get_initial() | ||||||
|  |  | ||||||
|  |         parents = self.get_object().get_ancestors() | ||||||
|  |  | ||||||
|  |         if parents.count() == 1: | ||||||
|  |             initials['parent'] = parents[0] | ||||||
|  |  | ||||||
|  |         return initials | ||||||
|  |  | ||||||
|  |     def validate(self, part, form): | ||||||
|  |  | ||||||
|  |         confirm = str2bool(form.cleaned_data.get('confirm', False)) | ||||||
|  |  | ||||||
|  |         if not confirm: | ||||||
|  |             form.add_error('confirm', _('Confirm duplication of BOM from parent')) | ||||||
|  |  | ||||||
|  |     def post_save(self, part, form): | ||||||
|  |  | ||||||
|  |         parent = form.cleaned_data.get('parent', None) | ||||||
|  |  | ||||||
|  |         clear = str2bool(form.cleaned_data.get('clear', True)) | ||||||
|  |  | ||||||
|  |         if parent: | ||||||
|  |             part.copy_bom_from(parent, clear=clear) | ||||||
|  |  | ||||||
|  |  | ||||||
| class BomValidate(AjaxUpdateView): | class BomValidate(AjaxUpdateView): | ||||||
|     """ Modal form view for validating a part BOM """ |     """ | ||||||
|  |     Modal form view for validating a part BOM | ||||||
|  |     """ | ||||||
|  |  | ||||||
|     model = Part |     model = Part | ||||||
|     ajax_form_title = _("Validate BOM") |     ajax_form_title = _("Validate BOM") | ||||||
|   | |||||||
| @@ -164,11 +164,11 @@ class StockItemAttachmentCreate(AjaxCreateView): | |||||||
|     ajax_template_name = "modal_form.html" |     ajax_template_name = "modal_form.html" | ||||||
|     role_required = 'stock.add' |     role_required = 'stock.add' | ||||||
|  |  | ||||||
|     def post_save(self, **kwargs): |     def post_save(self, attachment, form, **kwargs): | ||||||
|         """ Record the user that uploaded the attachment """ |         """ Record the user that uploaded the attachment """ | ||||||
|          |          | ||||||
|         self.object.user = self.request.user |         attachment.user = self.request.user | ||||||
|         self.object.save() |         attachment.save() | ||||||
|  |  | ||||||
|     def get_data(self): |     def get_data(self): | ||||||
|         return { |         return { | ||||||
| @@ -440,11 +440,11 @@ class StockItemTestResultCreate(AjaxCreateView): | |||||||
|     ajax_form_title = _("Add Test Result") |     ajax_form_title = _("Add Test Result") | ||||||
|     role_required = 'stock.add' |     role_required = 'stock.add' | ||||||
|  |  | ||||||
|     def post_save(self, **kwargs): |     def post_save(self, result, form, **kwargs): | ||||||
|         """ Record the user that uploaded the test result """ |         """ Record the user that uploaded the test result """ | ||||||
|  |  | ||||||
|         self.object.user = self.request.user |         result.user = self.request.user | ||||||
|         self.object.save() |         result.save() | ||||||
|  |  | ||||||
|     def get_initial(self): |     def get_initial(self): | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user