diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 42f4ba4660..107cc7ff16 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -22,7 +22,28 @@ from django.utils.translation import gettext_lazy as _ def _is_true(x): - return x in [True, "True", "true", "Y", "y", "1"] + # Shortcut function to determine if a value "looks" like a boolean + return str(x).lower() in ['1', 'y', 'yes', 't', 'true'] + + +def get_setting(environment_var, backup_val, default_value=None): + """ + Helper function for retrieving a configuration setting value + + - First preference is to look for the environment variable + - Second preference is to look for the value of the settings file + - Third preference is the default value + """ + + val = os.getenv(environment_var) + + if val is not None: + return val + + if backup_val is not None: + return backup_val + + return default_value # Build paths inside the project like this: os.path.join(BASE_DIR, ...) @@ -39,10 +60,17 @@ with open(cfg_filename, 'r') as cfg: # Default action is to run the system in Debug mode # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = _is_true(os.getenv("INVENTREE_DEBUG", CONFIG.get("debug", True))) +DEBUG = _is_true(get_setting( + 'INVENTREE_DEBUG', + CONFIG.get('debug', True) +)) # Configure logging settings -log_level = CONFIG.get('log_level', 'DEBUG').upper() +log_level = get_setting( + 'INVENTREE_LOG_LEVEL', + CONFIG.get('log_level', 'DEBUG') +) + logging.basicConfig( level=log_level, format="%(asctime)s %(levelname)s %(message)s", @@ -75,6 +103,7 @@ if os.getenv("INVENTREE_SECRET_KEY"): else: # Secret key passed in by file location key_file = os.getenv("INVENTREE_SECRET_KEY_FILE") + if key_file: if os.path.isfile(key_file): logger.info("SECRET_KEY loaded by INVENTREE_SECRET_KEY_FILE") @@ -112,7 +141,12 @@ if cors_opt: STATIC_URL = '/static/' # The filesystem location for served static files -STATIC_ROOT = os.path.abspath(CONFIG.get('static_root', os.path.join(BASE_DIR, 'static'))) +STATIC_ROOT = os.path.abspath( + get_setting( + 'INVENTREE_STATIC_ROOT', + CONFIG.get('static_root', os.path.join(BASE_DIR, 'static')) + ) +) STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'InvenTree', 'static'), @@ -125,7 +159,12 @@ STATIC_COLOR_THEMES_DIR = os.path.join(STATIC_ROOT, 'css', 'color-themes') MEDIA_URL = '/media/' # The filesystem location for served static files -MEDIA_ROOT = os.path.abspath(CONFIG.get('media_root', os.path.join(BASE_DIR, 'media'))) +MEDIA_ROOT = os.path.abspath( + get_setting( + 'INVENTREE_MEDIA_ROOT', + CONFIG.get('media_root', os.path.join(BASE_DIR, 'media')) + ) +) if DEBUG: logger.info("InvenTree running in DEBUG mode") @@ -133,30 +172,6 @@ if DEBUG: logger.info(f"MEDIA_ROOT: '{MEDIA_ROOT}'") logger.info(f"STATIC_ROOT: '{STATIC_ROOT}'") -# Does the user wish to use the sentry.io integration? -sentry_opts = CONFIG.get('sentry', {}) - -if sentry_opts.get('enabled', False): - - logger.info("Configuring sentry.io integration") - - dsn = sentry_opts.get('dsn', None) - - if dsn is not None: - # Try to import required modules (exit if not installed) - try: - import sentry_sdk - from sentry_sdk.integrations.django import DjangoIntegration - - sentry_sdk.init(dsn=dsn, integrations=[DjangoIntegration()], send_default_pii=True) - - except ModuleNotFoundError: - logger.error("sentry_sdk module not found. Install using 'pip install sentry-sdk'") - sys.exit(-1) - - else: - logger.warning("Sentry.io DSN not specified in config file") - # Application definition INSTALLED_APPS = [ @@ -430,16 +445,17 @@ if not type(EXTRA_URL_SCHEMES) in [list]: EXTRA_URL_SCHEMES = [] # Internationalization -# https://docs.djangoproject.com/en/1.10/topics/i18n/ +# https://docs.djangoproject.com/en/dev/topics/i18n/ LANGUAGE_CODE = CONFIG.get('language', 'en-us') # If a new language translation is supported, it must be added here LANGUAGES = [ ('en', _('English')), - ('de', _('German')), ('fr', _('French')), + ('de', _('German')), ('pk', _('Polish')), + ('tr', _('Turkish')), ] # Currencies available for use @@ -491,10 +507,15 @@ CRISPY_TEMPLATE_PACK = 'bootstrap3' # Use database transactions when importing / exporting data IMPORT_EXPORT_USE_TRANSACTIONS = True +BACKUP_DIR = get_setting( + 'INVENTREE_BACKUP_DIR', + CONFIG.get('backup_dir', tempfile.gettempdir()), +) + # Settings for dbbsettings app DBBACKUP_STORAGE = 'django.core.files.storage.FileSystemStorage' DBBACKUP_STORAGE_OPTIONS = { - 'location': CONFIG.get('backup_dir', tempfile.gettempdir()), + 'location': BACKUP_DIR, } # Internal IP addresses allowed to see the debug toolbar diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index d8a64708a9..9ad7780122 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -29,6 +29,7 @@ from stock.api import stock_api_urls from build.api import build_api_urls from order.api import order_api_urls from label.api import label_api_urls +from report.api import report_api_urls from django.conf import settings from django.conf.urls.static import static @@ -60,6 +61,7 @@ apipatterns = [ url(r'^build/', include(build_api_urls)), url(r'^order/', include(order_api_urls)), url(r'^label/', include(label_api_urls)), + url(r'^report/', include(report_api_urls)), # User URLs url(r'^user/', include(user_urls)), @@ -101,6 +103,7 @@ dynamic_javascript_urls = [ url(r'^order.js', DynamicJsView.as_view(template_name='js/order.js'), name='order.js'), url(r'^part.js', DynamicJsView.as_view(template_name='js/part.js'), name='part.js'), url(r'^label.js', DynamicJsView.as_view(template_name='js/label.js'), name='label.js'), + url(r'^report.js', DynamicJsView.as_view(template_name='js/report.js'), name='report.js'), url(r'^stock.js', DynamicJsView.as_view(template_name='js/stock.js'), name='stock.js'), url(r'^table_filters.js', DynamicJsView.as_view(template_name='js/table_filters.js'), name='table_filters.js'), ] diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 4a6bde8bfe..0fd924a77a 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -196,6 +196,13 @@ class InvenTreeSetting(models.Model): 'validator': bool, }, + 'STOCK_OWNERSHIP_CONTROL': { + 'name': _('Stock Ownership Control'), + 'description': _('Enable ownership control over stock locations and items'), + 'default': False, + 'validator': bool, + }, + 'BUILDORDER_REFERENCE_PREFIX': { 'name': _('Build Order Reference Prefix'), 'description': _('Prefix value for build order reference'), diff --git a/InvenTree/config_template.yaml b/InvenTree/config_template.yaml index bb1e20fceb..c655ffdc5c 100644 --- a/InvenTree/config_template.yaml +++ b/InvenTree/config_template.yaml @@ -107,13 +107,6 @@ static_root: '../inventree_static' # If unspecified, the local user's temp directory will be used #backup_dir: '/home/inventree/backup/' -# Sentry.io integration -# If you have a sentry.io account, it can be used to log server errors -# Ensure sentry_sdk is installed by running 'pip install sentry-sdk' -sentry: - enabled: False - # dsn: add-your-sentry-dsn-here - # LaTeX report rendering # InvenTree uses the django-tex plugin to enable LaTeX report rendering # Ref: https://pypi.org/project/django-tex/ diff --git a/InvenTree/label/api.py b/InvenTree/label/api.py index 48ead2f443..6b542f80ed 100644 --- a/InvenTree/label/api.py +++ b/InvenTree/label/api.py @@ -310,7 +310,7 @@ class StockLocationLabelPrint(generics.RetrieveAPIView, StockLocationLabelMixin) """ queryset = StockLocationLabel.objects.all() - seiralizers_class = StockLocationLabelSerializer + seiralizer_class = StockLocationLabelSerializer def get(self, request, *args, **kwargs): diff --git a/InvenTree/label/test_api.py b/InvenTree/label/test_api.py new file mode 100644 index 0000000000..1fc0a3e0da --- /dev/null +++ b/InvenTree/label/test_api.py @@ -0,0 +1,70 @@ +# Tests for labels + +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from rest_framework.test import APITestCase + +from django.urls import reverse +from django.contrib.auth import get_user_model + + +class TestReportTests(APITestCase): + """ + Tests for the StockItem TestReport templates + """ + + fixtures = [ + 'category', + 'part', + 'location', + 'stock', + ] + + list_url = reverse('api-stockitem-testreport-list') + + def setUp(self): + user = get_user_model() + + self.user = user.objects.create_user('testuser', 'test@testing.com', 'password') + + self.user.is_staff = True + self.user.save() + + self.client.login(username='testuser', password='password') + + def do_list(self, filters={}): + + response = self.client.get(self.list_url, filters, format='json') + + self.assertEqual(response.status_code, 200) + + return response.data + + def test_list(self): + + response = self.do_list() + + # TODO - Add some report templates to the fixtures + self.assertEqual(len(response), 0) + + # TODO - Add some tests to this response + response = self.do_list( + { + 'item': 10, + } + ) + + # TODO - Add some tests to this response + response = self.do_list( + { + 'item': 100000, + } + ) + + # TODO - Add some tests to this response + response = self.do_list( + { + 'items': [10, 11, 12], + } + ) diff --git a/InvenTree/label/tests.py b/InvenTree/label/tests.py index dcb051c929..aaf93fd0a0 100644 --- a/InvenTree/label/tests.py +++ b/InvenTree/label/tests.py @@ -1,4 +1,4 @@ -# Tests for Part Parameters +# Tests for labels # -*- coding: utf-8 -*- from __future__ import unicode_literals diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po index 76931db8fa..aaf7c25e04 100644 --- a/InvenTree/locale/de/LC_MESSAGES/django.po +++ b/InvenTree/locale/de/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-14 23:57+1100\n" +"POT-Creation-Date: 2021-01-18 23:24+1100\n" "PO-Revision-Date: 2020-05-03 11:32+0200\n" "Last-Translator: Christian Schlüter \n" "Language-Team: C \n" @@ -62,7 +62,7 @@ msgid "Select Category" msgstr "Teilkategorie auswählen" #: InvenTree/helpers.py:361 order/models.py:232 order/models.py:330 -#: stock/views.py:1573 +#: stock/views.py:1778 msgid "Invalid quantity provided" msgstr "Keine gültige Menge" @@ -105,7 +105,7 @@ msgstr "Datei zum Anhängen auswählen" msgid "File comment" msgstr "Datei-Kommentar" -#: InvenTree/models.py:68 templates/js/stock.js:873 +#: InvenTree/models.py:68 templates/js/stock.js:901 msgid "User" msgstr "Benutzer" @@ -120,22 +120,26 @@ msgstr "Name" msgid "Description (optional)" msgstr "Firmenbeschreibung" -#: InvenTree/settings.py:439 +#: InvenTree/settings.py:454 msgid "English" msgstr "Englisch" -#: InvenTree/settings.py:440 -msgid "German" -msgstr "Deutsch" - -#: InvenTree/settings.py:441 +#: InvenTree/settings.py:455 msgid "French" msgstr "Französisch" -#: InvenTree/settings.py:442 +#: InvenTree/settings.py:456 +msgid "German" +msgstr "Deutsch" + +#: InvenTree/settings.py:457 msgid "Polish" msgstr "Polnisch" +#: InvenTree/settings.py:458 +msgid "Turkish" +msgstr "" + #: InvenTree/status.py:24 msgid "Celery worker check failed" msgstr "" @@ -338,7 +342,7 @@ msgstr "" #: build/forms.py:78 build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:83 -#: build/templates/build/detail.html:29 common/models.py:596 +#: build/templates/build/detail.html:29 common/models.py:603 #: company/forms.py:112 company/templates/company/supplier_part_pricing.html:75 #: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:179 @@ -346,13 +350,13 @@ msgstr "" #: order/templates/order/sales_order_detail.html:156 #: part/templates/part/allocation.html:16 #: part/templates/part/allocation.html:49 -#: part/templates/part/sale_prices.html:82 stock/forms.py:304 -#: stock/templates/stock/item_base.html:40 -#: stock/templates/stock/item_base.html:46 -#: stock/templates/stock/item_base.html:214 +#: part/templates/part/sale_prices.html:82 stock/forms.py:306 +#: stock/templates/stock/item_base.html:51 +#: stock/templates/stock/item_base.html:57 +#: stock/templates/stock/item_base.html:234 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:338 -#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:864 -#: templates/js/stock.js:1103 +#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:892 +#: templates/js/stock.js:1131 msgid "Quantity" msgstr "Anzahl" @@ -362,7 +366,7 @@ msgstr "Anzahl" msgid "Enter quantity for build output" msgstr "Seriennummer für dieses Teil" -#: build/forms.py:83 stock/forms.py:116 +#: build/forms.py:83 stock/forms.py:117 #, fuzzy #| msgid "Serial Number" msgid "Serial numbers" @@ -437,7 +441,7 @@ msgstr "Bauauftrag" #: build/models.py:62 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:11 #: order/templates/order/so_tabs.html:9 part/templates/part/tabs.html:31 -#: templates/InvenTree/settings/tabs.html:28 users/models.py:32 +#: templates/InvenTree/settings/tabs.html:28 users/models.py:36 msgid "Build Orders" msgstr "Bauaufträge" @@ -460,10 +464,10 @@ msgstr "Referenz" #: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 #: templates/InvenTree/search.html:147 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:180 -#: templates/js/bom.js:549 templates/js/build.js:664 templates/js/company.js:56 +#: templates/js/bom.js:547 templates/js/build.js:664 templates/js/company.js:56 #: templates/js/order.js:180 templates/js/order.js:274 templates/js/part.js:188 #: templates/js/part.js:271 templates/js/part.js:391 templates/js/part.js:572 -#: templates/js/stock.js:511 templates/js/stock.js:845 +#: templates/js/stock.js:511 templates/js/stock.js:873 msgid "Description" msgstr "Beschreibung" @@ -490,10 +494,10 @@ msgstr "Bestellung, die diesem Bau zugwiesen ist" #: order/templates/order/receive_parts.html:19 part/models.py:316 #: part/templates/part/part_app_base.html:7 part/templates/part/related.html:26 #: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133 -#: templates/js/barcode.js:336 templates/js/bom.js:153 templates/js/bom.js:534 +#: templates/js/barcode.js:336 templates/js/bom.js:153 templates/js/bom.js:532 #: templates/js/build.js:669 templates/js/company.js:138 #: templates/js/part.js:252 templates/js/part.js:357 templates/js/stock.js:485 -#: templates/js/stock.js:1175 +#: templates/js/stock.js:1203 msgid "Part" msgstr "Teil" @@ -561,7 +565,7 @@ msgstr "Bau-Status" msgid "Build status code" msgstr "Bau-Statuscode" -#: build/models.py:194 stock/models.py:412 +#: build/models.py:194 stock/models.py:418 msgid "Batch Code" msgstr "Losnummer" @@ -577,11 +581,11 @@ msgstr "" #: company/templates/company/supplier_part_base.html:68 #: company/templates/company/supplier_part_detail.html:24 #: part/templates/part/detail.html:80 part/templates/part/part_base.html:102 -#: stock/models.py:406 stock/templates/stock/item_base.html:297 +#: stock/models.py:412 stock/templates/stock/item_base.html:317 msgid "External Link" msgstr "Externer Link" -#: build/models.py:220 part/models.py:705 stock/models.py:408 +#: build/models.py:220 part/models.py:705 stock/models.py:414 msgid "Link to external URL" msgstr "Link zu einer externen URL" @@ -589,10 +593,10 @@ msgstr "Link zu einer externen URL" #: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18 #: order/templates/order/purchase_order_detail.html:213 #: order/templates/order/so_tabs.html:23 part/models.py:831 -#: part/templates/part/tabs.html:73 stock/forms.py:313 stock/forms.py:345 -#: stock/forms.py:373 stock/models.py:478 stock/models.py:1544 +#: part/templates/part/tabs.html:73 stock/forms.py:315 stock/forms.py:347 +#: stock/forms.py:375 stock/models.py:484 stock/models.py:1554 #: stock/templates/stock/tabs.html:26 templates/js/barcode.js:391 -#: templates/js/bom.js:295 templates/js/stock.js:127 templates/js/stock.js:618 +#: templates/js/bom.js:293 templates/js/stock.js:127 templates/js/stock.js:623 msgid "Notes" msgstr "Notizen" @@ -754,8 +758,8 @@ msgid "" "The following stock items will be allocated to the specified build output" msgstr "Lagerobjekt dem Bau zuweisen" -#: build/templates/build/auto_allocate.html:18 stock/forms.py:343 -#: stock/templates/stock/item_base.html:244 +#: build/templates/build/auto_allocate.html:18 stock/forms.py:345 +#: stock/templates/stock/item_base.html:264 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:183 templates/js/barcode.js:337 #: templates/js/build.js:434 templates/js/stock.js:597 @@ -791,8 +795,8 @@ msgstr "Dieser Bau ist Kind von Bau" #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:35 #: part/templates/part/category.html:13 part/templates/part/part_base.html:32 -#: stock/templates/stock/item_base.html:97 -#: stock/templates/stock/location.html:12 +#: stock/templates/stock/item_base.html:114 +#: stock/templates/stock/location.html:24 #, fuzzy #| msgid "Admin" msgid "Admin view" @@ -834,10 +838,10 @@ msgstr "Bau-Status" #: build/templates/build/build_base.html:88 #: build/templates/build/detail.html:57 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:343 templates/InvenTree/search.html:175 +#: stock/templates/stock/item_base.html:363 templates/InvenTree/search.html:175 #: templates/js/barcode.js:42 templates/js/build.js:697 #: templates/js/order.js:185 templates/js/order.js:279 -#: templates/js/stock.js:584 templates/js/stock.js:1111 +#: templates/js/stock.js:584 templates/js/stock.js:1139 msgid "Status" msgstr "Status" @@ -867,7 +871,7 @@ msgstr "" #: order/templates/order/sales_order_notes.html:10 #: order/templates/order/sales_order_ship.html:25 #: part/templates/part/allocation.html:27 -#: stock/templates/stock/item_base.html:238 templates/js/order.js:240 +#: stock/templates/stock/item_base.html:258 templates/js/order.js:240 msgid "Sales Order" msgstr "Bestellung" @@ -988,7 +992,7 @@ msgstr "Lagerobjekt" msgid "Stock can be taken from any available location." msgstr "Bestand kann jedem verfügbaren Lagerort entnommen werden." -#: build/templates/build/detail.html:44 stock/forms.py:371 +#: build/templates/build/detail.html:44 stock/forms.py:373 #, fuzzy #| msgid "Description" msgid "Destination" @@ -1001,8 +1005,8 @@ msgid "Destination location not specified" msgstr "Hat dieses Teil Tracking für einzelne Objekte?" #: build/templates/build/detail.html:68 -#: stock/templates/stock/item_base.html:262 templates/js/stock.js:592 -#: templates/js/stock.js:1118 templates/js/table_filters.js:80 +#: stock/templates/stock/item_base.html:282 templates/js/stock.js:592 +#: templates/js/stock.js:1146 templates/js/table_filters.js:80 #: templates/js/table_filters.js:161 msgid "Batch" msgstr "Los" @@ -1118,7 +1122,7 @@ msgstr "Lagerbestand dem Bau zuweisen" msgid "Create Build Output" msgstr "Bau-Ausgabe" -#: build/views.py:207 stock/models.py:887 stock/views.py:1594 +#: build/views.py:207 stock/models.py:897 stock/views.py:1804 #, fuzzy #| msgid "Serial numbers already exist: " msgid "Serial numbers already exist" @@ -1140,7 +1144,7 @@ msgstr "Bau entfernt" msgid "Confirm unallocation of build stock" msgstr "Zuweisungsaufhebung bestätigen" -#: build/views.py:303 build/views.py:388 stock/views.py:330 +#: build/views.py:303 build/views.py:388 stock/views.py:431 msgid "Check the confirmation box" msgstr "Bestätigungsbox bestätigen" @@ -1240,7 +1244,7 @@ msgstr "Dieses Lagerobjekt ist dem Bau zugewiesen" msgid "Stock item is over-allocated" msgstr "Zu viele Lagerobjekte zugewiesen" -#: build/views.py:847 templates/js/bom.js:221 templates/js/build.js:519 +#: build/views.py:847 templates/js/bom.js:220 templates/js/build.js:519 #: templates/js/build.js:758 msgid "Available" msgstr "verfügbar" @@ -1266,7 +1270,7 @@ msgid "Add Build Order Attachment" msgstr "Auftragsanhang hinzufügen" #: build/views.py:1060 order/views.py:113 order/views.py:166 part/views.py:170 -#: stock/views.py:179 +#: stock/views.py:280 msgid "Added attachment" msgstr "Anhang hinzugefügt" @@ -1282,7 +1286,7 @@ msgstr "Anhang aktualisiert" msgid "Delete Attachment" msgstr "Anhang löschen" -#: build/views.py:1123 order/views.py:242 order/views.py:257 stock/views.py:237 +#: build/views.py:1123 order/views.py:242 order/views.py:257 stock/views.py:338 msgid "Deleted attachment" msgstr "Anhang gelöscht" @@ -1378,7 +1382,7 @@ msgstr "Teilparametervorlage bearbeiten" msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:115 part/templates/part/detail.html:155 stock/forms.py:255 +#: common/models.py:115 part/templates/part/detail.html:155 stock/forms.py:257 #: templates/js/table_filters.js:23 templates/js/table_filters.js:270 msgid "Template" msgstr "Vorlage" @@ -1503,93 +1507,101 @@ msgid "Allow building with expired stock" msgstr "" #: common/models.py:200 +msgid "Stock Ownership Control" +msgstr "" + +#: common/models.py:201 +msgid "Enable ownership control over stock locations and items" +msgstr "" + +#: common/models.py:207 #, fuzzy #| msgid "Order Reference" msgid "Build Order Reference Prefix" msgstr "Bestellreferenz" -#: common/models.py:201 +#: common/models.py:208 #, fuzzy #| msgid "Order reference" msgid "Prefix value for build order reference" msgstr "Bestell-Referenz" -#: common/models.py:206 +#: common/models.py:213 #, fuzzy #| msgid "Order Reference" msgid "Build Order Reference Regex" msgstr "Bestellreferenz" -#: common/models.py:207 +#: common/models.py:214 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:211 +#: common/models.py:218 #, fuzzy #| msgid "Sales Order Reference" msgid "Sales Order Reference Prefix" msgstr "Bestellungsreferenz" -#: common/models.py:212 +#: common/models.py:219 #, fuzzy #| msgid "Order reference" msgid "Prefix value for sales order reference" msgstr "Bestell-Referenz" -#: common/models.py:217 +#: common/models.py:224 #, fuzzy #| msgid "Order reference" msgid "Purchase Order Reference Prefix" msgstr "Bestell-Referenz" -#: common/models.py:218 +#: common/models.py:225 #, fuzzy #| msgid "Order reference" msgid "Prefix value for purchase order reference" msgstr "Bestell-Referenz" -#: common/models.py:441 +#: common/models.py:448 msgid "Settings key (must be unique - case insensitive" msgstr "" "Einstellungs-Schlüssel (muss einzigartig sein, Groß-/ Kleinschreibung wird " "nicht beachtet)" -#: common/models.py:443 +#: common/models.py:450 msgid "Settings value" msgstr "Einstellungs-Wert" -#: common/models.py:500 +#: common/models.py:507 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:510 +#: common/models.py:517 #, fuzzy #| msgid "Must enter integer value" msgid "Value must be an integer value" msgstr "Nur Ganzzahl eingeben" -#: common/models.py:524 +#: common/models.py:531 msgid "Key string must be unique" msgstr "Schlüsseltext muss eindeutig sein" -#: common/models.py:597 company/forms.py:113 +#: common/models.py:604 company/forms.py:113 #, fuzzy #| msgid "Price Breaks" msgid "Price break quantity" msgstr "Preisstaffelung" -#: common/models.py:605 company/templates/company/supplier_part_pricing.html:80 -#: part/templates/part/sale_prices.html:87 templates/js/bom.js:246 +#: common/models.py:612 company/templates/company/supplier_part_pricing.html:80 +#: part/templates/part/sale_prices.html:87 templates/js/bom.js:245 msgid "Price" msgstr "Preis" -#: common/models.py:606 +#: common/models.py:613 #, fuzzy #| msgid "Enter a valid quantity" msgid "Unit price at specified quantity" msgstr "Bitte eine gültige Anzahl eingeben" -#: common/models.py:629 +#: common/models.py:636 #, fuzzy #| msgid "Default Location" msgid "Default" @@ -1710,8 +1722,8 @@ msgstr "Produziert diese Firma Teile?" msgid "Currency" msgstr "Währung bearbeiten" -#: company/models.py:313 stock/models.py:360 -#: stock/templates/stock/item_base.html:194 +#: company/models.py:313 stock/models.py:366 +#: stock/templates/stock/item_base.html:214 msgid "Base Part" msgstr "Basisteil" @@ -1724,7 +1736,7 @@ msgstr "Teil auswählen" #: company/templates/company/supplier_part_detail.html:21 #: order/templates/order/order_base.html:89 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170 -#: stock/templates/stock/item_base.html:304 templates/js/company.js:48 +#: stock/templates/stock/item_base.html:324 templates/js/company.js:48 #: templates/js/company.js:164 templates/js/order.js:167 msgid "Supplier" msgstr "Zulieferer" @@ -1828,8 +1840,8 @@ msgid "Uses default currency" msgstr "Währung entfernen" #: company/templates/company/detail.html:62 -#: order/templates/order/sales_order_base.html:89 stock/models.py:395 -#: stock/models.py:396 stock/templates/stock/item_base.html:221 +#: order/templates/order/sales_order_base.html:89 stock/models.py:401 +#: stock/models.py:402 stock/templates/stock/item_base.html:241 #: templates/js/company.js:40 templates/js/order.js:261 msgid "Customer" msgstr "Kunde" @@ -1845,13 +1857,12 @@ msgstr "Neues Zuliefererteil anlegen" #: company/templates/company/detail_part.html:18 #: order/templates/order/purchase_order_detail.html:68 -#: part/templates/part/supplier.html:14 templates/js/stock.js:995 +#: part/templates/part/supplier.html:14 templates/js/stock.js:1023 msgid "New Supplier Part" msgstr "Neues Zulieferer-Teil" #: company/templates/company/detail_part.html:23 #: part/templates/part/category.html:120 part/templates/part/supplier.html:17 -#: templates/stock_table.html:18 msgid "Options" msgstr "Optionen" @@ -1873,7 +1884,8 @@ msgid "Delete Parts" msgstr "Teile löschen" #: company/templates/company/detail_part.html:63 -#: part/templates/part/category.html:116 templates/js/stock.js:989 +#: part/templates/part/bom.html:182 part/templates/part/category.html:116 +#: templates/js/stock.js:1017 msgid "New Part" msgstr "Neues Teil" @@ -1907,7 +1919,6 @@ msgstr "Zuliefererbestand" #: company/templates/company/supplier_part_stock.html:33 #: part/templates/part/bom.html:63 part/templates/part/category.html:112 #: part/templates/part/category.html:126 part/templates/part/stock.html:51 -#: templates/stock_table.html:7 msgid "Export" msgstr "Exportieren" @@ -1931,7 +1942,7 @@ msgstr "" #: order/templates/order/purchase_orders.html:13 #: part/templates/part/orders.html:9 part/templates/part/tabs.html:48 #: templates/InvenTree/settings/tabs.html:31 templates/navbar.html:33 -#: users/models.py:33 +#: users/models.py:37 msgid "Purchase Orders" msgstr "Bestellungen" @@ -1951,7 +1962,7 @@ msgstr "Neue Bestellung" #: order/templates/order/sales_orders.html:13 #: part/templates/part/sales_orders.html:9 part/templates/part/tabs.html:56 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:42 -#: users/models.py:34 +#: users/models.py:38 msgid "Sales Orders" msgstr "Bestellungen" @@ -1966,8 +1977,8 @@ msgid "New Sales Order" msgstr "Neuer Auftrag" #: company/templates/company/supplier_part_base.html:6 -#: company/templates/company/supplier_part_base.html:19 stock/models.py:369 -#: stock/templates/stock/item_base.html:309 templates/js/company.js:180 +#: company/templates/company/supplier_part_base.html:19 stock/models.py:375 +#: stock/templates/stock/item_base.html:329 templates/js/company.js:180 msgid "Supplier Part" msgstr "Zulieferer-Teil" @@ -2008,7 +2019,7 @@ msgid "Pricing Information" msgstr "Preisinformationen ansehen" #: company/templates/company/supplier_part_pricing.html:17 company/views.py:486 -#: part/templates/part/sale_prices.html:14 part/views.py:2565 +#: part/templates/part/sale_prices.html:14 part/views.py:2558 msgid "Add Price Break" msgstr "Preisstaffel hinzufügen" @@ -2043,7 +2054,7 @@ msgstr "Bepreisung" #: company/templates/company/supplier_part_tabs.html:8 #: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18 -#: stock/templates/stock/location.html:17 templates/InvenTree/search.html:155 +#: stock/templates/stock/location.html:29 templates/InvenTree/search.html:155 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:192 #: templates/js/part.js:418 templates/js/stock.js:519 templates/navbar.html:22 msgid "Stock" @@ -2058,7 +2069,7 @@ msgstr "Bestellungen" #: part/templates/part/cat_link.html:7 part/templates/part/category.html:94 #: part/templates/part/category_tabs.html:6 #: templates/InvenTree/settings/tabs.html:22 templates/navbar.html:19 -#: templates/stats.html:35 templates/stats.html:44 users/models.py:29 +#: templates/stats.html:35 templates/stats.html:44 users/models.py:33 msgid "Parts" msgstr "Teile" @@ -2127,7 +2138,7 @@ msgstr "Firma gelöscht" msgid "Edit Supplier Part" msgstr "Zuliefererteil bearbeiten" -#: company/views.py:295 templates/js/stock.js:996 +#: company/views.py:295 templates/js/stock.js:1024 msgid "Create new Supplier Part" msgstr "Neues Zuliefererteil anlegen" @@ -2135,21 +2146,21 @@ msgstr "Neues Zuliefererteil anlegen" msgid "Delete Supplier Part" msgstr "Zuliefererteil entfernen" -#: company/views.py:492 part/views.py:2571 +#: company/views.py:492 part/views.py:2564 #, fuzzy #| msgid "Add Price Break" msgid "Added new price break" msgstr "Preisstaffel hinzufügen" -#: company/views.py:548 part/views.py:2615 +#: company/views.py:548 part/views.py:2608 msgid "Edit Price Break" msgstr "Preisstaffel bearbeiten" -#: company/views.py:564 part/views.py:2631 +#: company/views.py:564 part/views.py:2624 msgid "Delete Price Break" msgstr "Preisstaffel löschen" -#: label/api.py:171 +#: label/api.py:171 report/api.py:161 #, fuzzy #| msgid "Move Stock Items" msgid "Must provide valid StockItem(s)" @@ -2175,7 +2186,7 @@ msgstr "Name des Teils" msgid "Label description" msgstr "Beschreibung des Teils" -#: label/models.py:83 stock/forms.py:198 +#: label/models.py:83 stock/forms.py:200 msgid "Label" msgstr "" @@ -2304,8 +2315,8 @@ msgstr "Erstelldatum" msgid "Date order was completed" msgstr "Bestellung als vollständig markieren" -#: order/models.py:230 order/models.py:328 part/views.py:1504 -#: stock/models.py:259 stock/models.py:871 +#: order/models.py:230 order/models.py:328 part/views.py:1506 +#: stock/models.py:265 stock/models.py:881 msgid "Quantity must be greater than zero" msgstr "Anzahl muss größer Null sein" @@ -2343,7 +2354,7 @@ msgstr "Position - Notizen" #: order/models.py:607 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 -#: stock/templates/stock/item_base.html:276 templates/js/order.js:145 +#: stock/templates/stock/item_base.html:296 templates/js/order.js:145 msgid "Purchase Order" msgstr "Kaufvertrag" @@ -2355,8 +2366,8 @@ msgstr "Zulieferer-Teil" msgid "Number of items received" msgstr "Empfangene Objekt-Anzahl" -#: order/models.py:630 stock/models.py:488 -#: stock/templates/stock/item_base.html:283 +#: order/models.py:630 stock/models.py:494 +#: stock/templates/stock/item_base.html:303 #, fuzzy #| msgid "Purchase Order" msgid "Purchase Price" @@ -2531,13 +2542,13 @@ msgstr "Bestellpositionen" #: order/templates/order/purchase_order_detail.html:39 #: order/templates/order/purchase_order_detail.html:119 #: part/templates/part/category.html:173 part/templates/part/category.html:215 -#: templates/js/stock.js:642 templates/js/stock.js:1001 +#: templates/js/stock.js:657 templates/js/stock.js:1029 msgid "New Location" msgstr "Neuer Standort" #: order/templates/order/purchase_order_detail.html:40 #: order/templates/order/purchase_order_detail.html:120 -#: stock/templates/stock/location.html:22 +#: stock/templates/stock/location.html:35 msgid "Create new stock location" msgstr "Neuen Lagerort anlegen" @@ -2620,8 +2631,8 @@ msgid "Sales Order Items" msgstr "Auftragspositionen" #: order/templates/order/sales_order_detail.html:72 -#: order/templates/order/sales_order_detail.html:154 stock/models.py:400 -#: stock/templates/stock/item_base.html:208 templates/js/build.js:418 +#: order/templates/order/sales_order_detail.html:154 stock/models.py:406 +#: stock/templates/stock/item_base.html:228 templates/js/build.js:418 msgid "Serial Number" msgstr "Seriennummer" @@ -2865,11 +2876,11 @@ msgstr "Fehler beim Lesen der Stückliste (ungültige Daten)" msgid "Error reading BOM file (incorrect row size)" msgstr "Fehler beim Lesen der Stückliste (ungültige Zeilengröße)" -#: part/forms.py:71 stock/forms.py:261 +#: part/forms.py:71 stock/forms.py:263 msgid "File Format" msgstr "Dateiformat" -#: part/forms.py:71 stock/forms.py:261 +#: part/forms.py:71 stock/forms.py:263 msgid "Select output file format" msgstr "Ausgabe-Dateiformat auswählen" @@ -3030,7 +3041,7 @@ msgstr "Teilkategorie" #: part/models.py:78 part/templates/part/category.html:18 #: part/templates/part/category.html:89 templates/stats.html:39 -#: users/models.py:28 +#: users/models.py:32 msgid "Part Categories" msgstr "Teile-Kategorien" @@ -3302,66 +3313,66 @@ msgstr "Parameter Wert" msgid "Default Parameter Value" msgstr "Parameter Wert" -#: part/models.py:1865 +#: part/models.py:1862 msgid "Select parent part" msgstr "Ausgangsteil auswählen" -#: part/models.py:1873 +#: part/models.py:1870 msgid "Select part to be used in BOM" msgstr "Teil für die Nutzung in der Stückliste auswählen" -#: part/models.py:1879 +#: part/models.py:1876 msgid "BOM quantity for this BOM item" msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil" -#: part/models.py:1881 +#: part/models.py:1878 #, fuzzy #| msgid "Confim BOM item deletion" msgid "This BOM item is optional" msgstr "Löschung von BOM-Position bestätigen" -#: part/models.py:1884 +#: part/models.py:1881 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "Geschätzter Ausschuss (absolut oder prozentual)" -#: part/models.py:1887 +#: part/models.py:1884 msgid "BOM item reference" msgstr "Referenz des Objekts auf der Stückliste" -#: part/models.py:1890 +#: part/models.py:1887 msgid "BOM item notes" msgstr "Notizen zum Stücklisten-Objekt" -#: part/models.py:1892 +#: part/models.py:1889 msgid "BOM line checksum" msgstr "Prüfsumme der Stückliste" -#: part/models.py:1963 part/views.py:1510 part/views.py:1562 -#: stock/models.py:249 +#: part/models.py:1960 part/views.py:1512 part/views.py:1564 +#: stock/models.py:255 #, fuzzy #| msgid "Overage must be an integer value or a percentage" msgid "Quantity must be integer value for trackable parts" msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein" -#: part/models.py:1972 part/models.py:1974 +#: part/models.py:1969 part/models.py:1971 #, fuzzy #| msgid "Supplier part description" msgid "Sub part must be specified" msgstr "Zuliefererbeschreibung des Teils" -#: part/models.py:1977 +#: part/models.py:1974 #, fuzzy #| msgid "New BOM Item" msgid "BOM Item" msgstr "Neue Stücklistenposition" -#: part/models.py:2098 +#: part/models.py:2095 #, fuzzy #| msgid "Select a part" msgid "Select Related Part" msgstr "Teil auswählen" -#: part/models.py:2130 +#: part/models.py:2127 msgid "" "Error creating relationship: check that the part is not related to itself " "and that the relationship is unique" @@ -3381,10 +3392,10 @@ msgstr "Bestellung" #: part/templates/part/allocation.html:28 #: part/templates/part/allocation.html:45 #: stock/templates/stock/item_base.html:8 -#: stock/templates/stock/item_base.html:72 -#: stock/templates/stock/item_base.html:291 +#: stock/templates/stock/item_base.html:89 +#: stock/templates/stock/item_base.html:311 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:751 -#: templates/js/stock.js:834 templates/js/stock.js:1094 +#: templates/js/stock.js:862 templates/js/stock.js:1122 msgid "Stock Item" msgstr "Lagerobjekt" @@ -3392,6 +3403,16 @@ msgstr "Lagerobjekt" msgid "Part Attachments" msgstr "Anhänge" +#: part/templates/part/bom-delete.html:6 +#, fuzzy +#| msgid "Are you sure you want to delete this attachment?" +msgid "Are you sure you want to delete this BOM item?" +msgstr "Sind Sie sicher, dass Sie diesen Anhang löschen wollen?" + +#: part/templates/part/bom-delete.html:8 +msgid "Deleting this entry will remove the BOM row from the following part" +msgstr "" + #: part/templates/part/bom.html:13 msgid "Bill of Materials" msgstr "Stückliste" @@ -3457,7 +3478,7 @@ msgstr "Stückliste validieren" msgid "Validate" msgstr "BOM validieren" -#: part/templates/part/bom.html:62 part/views.py:1801 +#: part/templates/part/bom.html:62 part/views.py:1803 msgid "Export Bill of Materials" msgstr "Stückliste exportieren" @@ -3473,6 +3494,11 @@ msgstr "Ausgewählte Stücklistenpositionen entfernen" msgid "All selected BOM items will be deleted" msgstr "Ausgewählte Stücklistenpositionen entfernen" +#: part/templates/part/bom.html:183 part/views.py:594 +#: templates/js/stock.js:1018 +msgid "Create New Part" +msgstr "Neues Teil anlegen" + #: part/templates/part/bom_duplicate.html:13 #, fuzzy #| msgid "Export Bill of Materials" @@ -3544,6 +3570,17 @@ msgstr "" msgid "Select Part" msgstr "Teil auswählen" +#: part/templates/part/bom_upload/select_parts.html:52 +#, fuzzy +#| msgid "Remove part" +msgid "Remove row" +msgstr "Teil entfernen" + +#: part/templates/part/bom_upload/select_parts.html:59 +#: part/templates/part/category.html:115 +msgid "Create new part" +msgstr "Neues Teil anlegen" + #: part/templates/part/bom_upload/upload_file.html:13 #, fuzzy #| msgid "Step 1 of 2 - Select Part Suppliers" @@ -3585,7 +3622,7 @@ msgstr "Neuen Bau beginnen" msgid "All parts" msgstr "Alle Teile" -#: part/templates/part/category.html:24 part/views.py:2192 +#: part/templates/part/category.html:24 part/views.py:2194 msgid "Create new part category" msgstr "Teilkategorie anlegen" @@ -3625,10 +3662,6 @@ msgstr "Teile (inklusive Unter-Kategorien)" msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:115 -msgid "Create new part" -msgstr "Neues Teil anlegen" - #: part/templates/part/category.html:123 #, fuzzy #| msgid "Part category" @@ -3647,7 +3680,7 @@ msgstr "Teilkategorie auswählen" msgid "Export Data" msgstr "Exportieren" -#: part/templates/part/category.html:174 templates/js/stock.js:643 +#: part/templates/part/category.html:174 templates/js/stock.js:658 #, fuzzy #| msgid "Create New Location" msgid "Create new location" @@ -3671,7 +3704,7 @@ msgstr "Teilkategorie anlegen" msgid "Create new Part Category" msgstr "Teilkategorie anlegen" -#: part/templates/part/category.html:216 stock/views.py:1276 +#: part/templates/part/category.html:216 stock/views.py:1371 msgid "Create new Stock Location" msgstr "Neuen Lager-Standort erstellen" @@ -3681,12 +3714,14 @@ msgstr "Neuen Lager-Standort erstellen" msgid "Parametric Table" msgstr "Parameter Wert" +#: part/templates/part/copy_part.html:14 #: part/templates/part/create_part.html:11 #, fuzzy #| msgid "No matching data" msgid "Possible Matching Parts" msgstr "Keine passenden Daten" +#: part/templates/part/copy_part.html:15 #: part/templates/part/create_part.html:12 msgid "The new part may be a duplicate of these existing parts" msgstr "" @@ -3817,13 +3852,13 @@ msgstr "Parameter hinzufügen" msgid "New Parameter" msgstr "Neuer Parameter" -#: part/templates/part/params.html:25 stock/models.py:1531 +#: part/templates/part/params.html:25 stock/models.py:1541 #: templates/InvenTree/settings/header.html:8 templates/js/stock.js:123 msgid "Value" msgstr "Wert" #: part/templates/part/params.html:41 part/templates/part/related.html:41 -#: part/templates/part/supplier.html:19 users/models.py:159 +#: part/templates/part/supplier.html:19 users/models.py:164 msgid "Delete" msgstr "Löschen" @@ -3855,24 +3890,24 @@ msgid "Star this part" msgstr "Teil favorisieren" #: part/templates/part/part_base.html:49 -#: stock/templates/stock/item_base.html:108 -#: stock/templates/stock/location.html:29 +#: stock/templates/stock/item_base.html:125 +#: stock/templates/stock/location.html:43 #, fuzzy #| msgid "Source Location" msgid "Barcode actions" msgstr "Quell-Standort" #: part/templates/part/part_base.html:51 -#: stock/templates/stock/item_base.html:110 -#: stock/templates/stock/location.html:31 +#: stock/templates/stock/item_base.html:127 +#: stock/templates/stock/location.html:45 #, fuzzy #| msgid "Part QR Code" msgid "Show QR Code" msgstr "Teil-QR-Code" #: part/templates/part/part_base.html:52 -#: stock/templates/stock/item_base.html:126 -#: stock/templates/stock/location.html:32 +#: stock/templates/stock/item_base.html:143 +#: stock/templates/stock/location.html:46 msgid "Print Label" msgstr "" @@ -3922,7 +3957,7 @@ msgstr "Zu Bauaufträgen zugeordnet" msgid "Allocated to Sales Orders" msgstr "Zu Aufträgen zugeordnet" -#: part/templates/part/part_base.html:160 templates/js/bom.js:262 +#: part/templates/part/part_base.html:160 templates/js/bom.js:260 msgid "Can Build" msgstr "Herstellbar?" @@ -3988,7 +4023,7 @@ msgstr "Teil entfernen" msgid "Part Stock" msgstr "Teilbestand" -#: part/templates/part/stock_count.html:7 templates/js/bom.js:230 +#: part/templates/part/stock_count.html:7 templates/js/bom.js:229 #: templates/js/part.js:442 msgid "No Stock" msgstr "Kein Bestand" @@ -4037,7 +4072,7 @@ msgstr "Stückliste" msgid "Used In" msgstr "Benutzt in" -#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:349 +#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:369 msgid "Tests" msgstr "" @@ -4055,6 +4090,18 @@ msgstr "Teilverfolgung" msgid "Assemblies" msgstr "Baugruppen" +#: part/templates/part/variant_part.html:9 +#, fuzzy +#| msgid "Create new Part" +msgid "Create new part variant" +msgstr "Neues Teil hinzufügen" + +#: part/templates/part/variant_part.html:10 +#, fuzzy +#| msgid "Create new Part" +msgid "Create a new variant of template" +msgstr "Neues Teil hinzufügen" + #: part/templates/part/variants.html:11 #, fuzzy #| msgid "Variants" @@ -4089,7 +4136,7 @@ msgstr "Zuliefererteil entfernen" msgid "Add part attachment" msgstr "Teilanhang hinzufügen" -#: part/views.py:209 templates/attachment_table.html:34 +#: part/views.py:209 templates/attachment_table.html:32 msgid "Edit attachment" msgstr "Anhang bearbeiten" @@ -4144,177 +4191,173 @@ msgstr "Teil duplizieren" msgid "Copied part" msgstr "Teil kopiert" -#: part/views.py:529 part/views.py:667 +#: part/views.py:529 part/views.py:669 msgid "Possible matches exist - confirm creation of new part" msgstr "" -#: part/views.py:594 templates/js/stock.js:990 -msgid "Create New Part" -msgstr "Neues Teil anlegen" - #: part/views.py:601 msgid "Created new part" msgstr "Neues Teil angelegt" -#: part/views.py:836 +#: part/views.py:838 msgid "Part QR Code" msgstr "Teil-QR-Code" -#: part/views.py:855 +#: part/views.py:857 msgid "Upload Part Image" msgstr "Teilbild hochladen" -#: part/views.py:863 part/views.py:900 +#: part/views.py:865 part/views.py:902 msgid "Updated part image" msgstr "Teilbild aktualisiert" -#: part/views.py:872 +#: part/views.py:874 msgid "Select Part Image" msgstr "Teilbild auswählen" -#: part/views.py:903 +#: part/views.py:905 msgid "Part image not found" msgstr "Teilbild nicht gefunden" -#: part/views.py:914 +#: part/views.py:916 msgid "Edit Part Properties" msgstr "Teileigenschaften bearbeiten" -#: part/views.py:945 +#: part/views.py:947 #, fuzzy #| msgid "Duplicate Part" msgid "Duplicate BOM" msgstr "Teil duplizieren" -#: part/views.py:976 +#: part/views.py:978 #, fuzzy #| msgid "Confirm unallocation of build stock" msgid "Confirm duplication of BOM from parent" msgstr "Zuweisungsaufhebung bestätigen" -#: part/views.py:997 +#: part/views.py:999 msgid "Validate BOM" msgstr "BOM validieren" -#: part/views.py:1020 +#: part/views.py:1022 #, fuzzy #| msgid "Confirm that the BOM is correct" msgid "Confirm that the BOM is valid" msgstr "Bestätigen, dass die Stückliste korrekt ist" -#: part/views.py:1031 +#: part/views.py:1033 #, fuzzy #| msgid "Validate Bill of Materials" msgid "Validated Bill of Materials" msgstr "Stückliste validieren" -#: part/views.py:1165 +#: part/views.py:1167 msgid "No BOM file provided" msgstr "Keine Stückliste angegeben" -#: part/views.py:1513 +#: part/views.py:1515 msgid "Enter a valid quantity" msgstr "Bitte eine gültige Anzahl eingeben" -#: part/views.py:1538 part/views.py:1541 +#: part/views.py:1540 part/views.py:1543 msgid "Select valid part" msgstr "Bitte ein gültiges Teil auswählen" -#: part/views.py:1547 +#: part/views.py:1549 msgid "Duplicate part selected" msgstr "Teil doppelt ausgewählt" -#: part/views.py:1585 +#: part/views.py:1587 msgid "Select a part" msgstr "Teil auswählen" -#: part/views.py:1591 +#: part/views.py:1593 #, fuzzy #| msgid "Select part to be used in BOM" msgid "Selected part creates a circular BOM" msgstr "Teil für die Nutzung in der Stückliste auswählen" -#: part/views.py:1595 +#: part/views.py:1597 msgid "Specify quantity" msgstr "Anzahl angeben" -#: part/views.py:1851 +#: part/views.py:1853 msgid "Confirm Part Deletion" msgstr "Löschen des Teils bestätigen" -#: part/views.py:1860 +#: part/views.py:1862 msgid "Part was deleted" msgstr "Teil wurde gelöscht" -#: part/views.py:1869 +#: part/views.py:1871 msgid "Part Pricing" msgstr "Teilbepreisung" -#: part/views.py:1983 +#: part/views.py:1985 msgid "Create Part Parameter Template" msgstr "Teilparametervorlage anlegen" -#: part/views.py:1993 +#: part/views.py:1995 msgid "Edit Part Parameter Template" msgstr "Teilparametervorlage bearbeiten" -#: part/views.py:2002 +#: part/views.py:2004 msgid "Delete Part Parameter Template" msgstr "Teilparametervorlage löschen" -#: part/views.py:2012 +#: part/views.py:2014 msgid "Create Part Parameter" msgstr "Teilparameter anlegen" -#: part/views.py:2064 +#: part/views.py:2066 msgid "Edit Part Parameter" msgstr "Teilparameter bearbeiten" -#: part/views.py:2080 +#: part/views.py:2082 msgid "Delete Part Parameter" msgstr "Teilparameter löschen" -#: part/views.py:2139 +#: part/views.py:2141 msgid "Edit Part Category" msgstr "Teilkategorie bearbeiten" -#: part/views.py:2176 +#: part/views.py:2178 msgid "Delete Part Category" msgstr "Teilkategorie löschen" -#: part/views.py:2184 +#: part/views.py:2186 msgid "Part category was deleted" msgstr "Teilekategorie wurde gelöscht" -#: part/views.py:2240 +#: part/views.py:2242 #, fuzzy #| msgid "Create Part Parameter Template" msgid "Create Category Parameter Template" msgstr "Teilparametervorlage anlegen" -#: part/views.py:2343 +#: part/views.py:2345 #, fuzzy #| msgid "Edit Part Parameter Template" msgid "Edit Category Parameter Template" msgstr "Teilparametervorlage bearbeiten" -#: part/views.py:2401 +#: part/views.py:2403 #, fuzzy #| msgid "Delete Part Parameter Template" msgid "Delete Category Parameter Template" msgstr "Teilparametervorlage löschen" -#: part/views.py:2426 +#: part/views.py:2419 #, fuzzy #| msgid "Create BOM item" msgid "Create BOM Item" msgstr "BOM-Position anlegen" -#: part/views.py:2498 +#: part/views.py:2491 msgid "Edit BOM item" msgstr "BOM-Position beaarbeiten" -#: part/views.py:2555 +#: part/views.py:2548 msgid "Confim BOM item deletion" msgstr "Löschung von BOM-Position bestätigen" @@ -4354,364 +4397,364 @@ msgstr "" msgid "Asset file description" msgstr "Einstellungs-Beschreibung" -#: stock/forms.py:116 +#: stock/forms.py:117 msgid "Enter unique serial numbers (or leave blank)" msgstr "Eindeutige Seriennummern eingeben (oder leer lassen)" -#: stock/forms.py:199 stock/forms.py:255 +#: stock/forms.py:201 stock/forms.py:257 #, fuzzy #| msgid "Select stock item to allocate" msgid "Select test report template" msgstr "Lagerobjekt für Zuordnung auswählen" -#: stock/forms.py:263 +#: stock/forms.py:265 msgid "Include stock items in sub locations" msgstr "Lagerobjekte in untergeordneten Lagerorten einschließen" -#: stock/forms.py:298 +#: stock/forms.py:300 #, fuzzy #| msgid "No stock items matching query" msgid "Stock item to install" msgstr "Keine zur Anfrage passenden Lagerobjekte" -#: stock/forms.py:305 +#: stock/forms.py:307 #, fuzzy #| msgid "Stock Quantity" msgid "Stock quantity to assign" msgstr "Bestand" -#: stock/forms.py:333 +#: stock/forms.py:335 #, fuzzy #| msgid "Quantity must not exceed available stock quantity ({n})" msgid "Must not exceed available quantity" msgstr "Anzahl darf nicht die verfügbare Anzahl überschreiten ({n})" -#: stock/forms.py:343 +#: stock/forms.py:345 #, fuzzy #| msgid "Does this part have tracking for unique items?" msgid "Destination location for uninstalled items" msgstr "Hat dieses Teil Tracking für einzelne Objekte?" -#: stock/forms.py:345 +#: stock/forms.py:347 #, fuzzy #| msgid "Description of the company" msgid "Add transaction note (optional)" msgstr "Firmenbeschreibung" -#: stock/forms.py:347 +#: stock/forms.py:349 #, fuzzy #| msgid "Confirm stock allocation" msgid "Confirm uninstall" msgstr "Lagerbestandszuordnung bestätigen" -#: stock/forms.py:347 +#: stock/forms.py:349 #, fuzzy #| msgid "Confirm movement of stock items" msgid "Confirm removal of installed stock items" msgstr "Bewegung der Lagerobjekte bestätigen" -#: stock/forms.py:371 +#: stock/forms.py:373 msgid "Destination stock location" msgstr "Ziel-Lagerbestand" -#: stock/forms.py:373 +#: stock/forms.py:375 msgid "Add note (required)" msgstr "" -#: stock/forms.py:377 stock/views.py:848 stock/views.py:1046 +#: stock/forms.py:379 stock/views.py:863 stock/views.py:1061 msgid "Confirm stock adjustment" msgstr "Bestands-Anpassung bestätigen" -#: stock/forms.py:377 +#: stock/forms.py:379 msgid "Confirm movement of stock items" msgstr "Bewegung der Lagerobjekte bestätigen" -#: stock/forms.py:379 +#: stock/forms.py:381 #, fuzzy #| msgid "Default Location" msgid "Set Default Location" msgstr "Standard-Lagerort" -#: stock/forms.py:379 +#: stock/forms.py:381 msgid "Set the destination as the default location for selected parts" msgstr "Setze das Ziel als Standard-Ziel für ausgewählte Teile" -#: stock/models.py:194 +#: stock/models.py:200 #, fuzzy #| msgid "Created new stock item" msgid "Created stock item" msgstr "Neues Lagerobjekt erstellt" -#: stock/models.py:230 +#: stock/models.py:236 #, fuzzy #| msgid "A stock item with this serial number already exists" msgid "StockItem with this serial number already exists" msgstr "Ein Teil mit dieser Seriennummer existiert bereits" -#: stock/models.py:266 +#: stock/models.py:272 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "Teile-Typ ('{pf}') muss {pe} sein" -#: stock/models.py:276 stock/models.py:285 +#: stock/models.py:282 stock/models.py:291 msgid "Quantity must be 1 for item with a serial number" msgstr "Anzahl muss für Objekte mit Seriennummer \"1\" sein" -#: stock/models.py:277 +#: stock/models.py:283 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" "Seriennummer kann nicht gesetzt werden wenn die Anzahl größer als \"1\" ist" -#: stock/models.py:299 +#: stock/models.py:305 msgid "Item cannot belong to itself" msgstr "Teil kann nicht zu sich selbst gehören" -#: stock/models.py:305 +#: stock/models.py:311 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:312 +#: stock/models.py:318 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:352 +#: stock/models.py:358 msgid "Parent Stock Item" msgstr "Eltern-Lagerobjekt" -#: stock/models.py:361 +#: stock/models.py:367 msgid "Base part" msgstr "Basis-Teil" -#: stock/models.py:370 +#: stock/models.py:376 msgid "Select a matching supplier part for this stock item" msgstr "Passenden Zulieferer für dieses Lagerobjekt auswählen" -#: stock/models.py:375 stock/templates/stock/stock_app_base.html:7 +#: stock/models.py:381 stock/templates/stock/stock_app_base.html:7 msgid "Stock Location" msgstr "Lagerort" -#: stock/models.py:378 +#: stock/models.py:384 msgid "Where is this stock item located?" msgstr "Wo wird dieses Teil normalerweise gelagert?" -#: stock/models.py:383 stock/templates/stock/item_base.html:229 +#: stock/models.py:389 stock/templates/stock/item_base.html:249 msgid "Installed In" msgstr "Installiert in" -#: stock/models.py:386 +#: stock/models.py:392 msgid "Is this item installed in another item?" msgstr "Ist dieses Teil in einem anderen verbaut?" -#: stock/models.py:402 +#: stock/models.py:408 msgid "Serial number for this item" msgstr "Seriennummer für dieses Teil" -#: stock/models.py:414 +#: stock/models.py:420 msgid "Batch code for this stock item" msgstr "Losnummer für dieses Lagerobjekt" -#: stock/models.py:418 +#: stock/models.py:424 msgid "Stock Quantity" msgstr "Bestand" -#: stock/models.py:427 +#: stock/models.py:433 msgid "Source Build" msgstr "Quellbau" -#: stock/models.py:429 +#: stock/models.py:435 msgid "Build for this stock item" msgstr "Bau für dieses Lagerobjekt" -#: stock/models.py:440 +#: stock/models.py:446 msgid "Source Purchase Order" msgstr "Quellbestellung" -#: stock/models.py:443 +#: stock/models.py:449 msgid "Purchase order for this stock item" msgstr "Bestellung für dieses Teil" -#: stock/models.py:449 +#: stock/models.py:455 msgid "Destination Sales Order" msgstr "Zielauftrag" -#: stock/models.py:455 stock/templates/stock/item_base.html:316 +#: stock/models.py:461 stock/templates/stock/item_base.html:336 #: templates/js/stock.js:612 #, fuzzy #| msgid "Export" msgid "Expiry Date" msgstr "Exportieren" -#: stock/models.py:456 +#: stock/models.py:462 msgid "" "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:469 +#: stock/models.py:475 msgid "Delete this Stock Item when stock is depleted" msgstr "Objekt löschen wenn Lagerbestand aufgebraucht" -#: stock/models.py:479 stock/templates/stock/item_notes.html:14 +#: stock/models.py:485 stock/templates/stock/item_notes.html:14 #: stock/templates/stock/item_notes.html:30 msgid "Stock Item Notes" msgstr "Lagerobjekt-Notizen" -#: stock/models.py:489 +#: stock/models.py:495 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:589 +#: stock/models.py:599 #, fuzzy #| msgid "Item assigned to customer?" msgid "Assigned to Customer" msgstr "Ist dieses Objekt einem Kunden zugeteilt?" -#: stock/models.py:591 +#: stock/models.py:601 #, fuzzy #| msgid "Item assigned to customer?" msgid "Manually assigned to customer" msgstr "Ist dieses Objekt einem Kunden zugeteilt?" -#: stock/models.py:604 +#: stock/models.py:614 #, fuzzy #| msgid "Item assigned to customer?" msgid "Returned from customer" msgstr "Ist dieses Objekt einem Kunden zugeteilt?" -#: stock/models.py:606 +#: stock/models.py:616 #, fuzzy #| msgid "Create new stock location" msgid "Returned to location" msgstr "Neuen Lagerort anlegen" -#: stock/models.py:731 +#: stock/models.py:741 #, fuzzy #| msgid "Installed in Stock Item" msgid "Installed into stock item" msgstr "In Lagerobjekt installiert" -#: stock/models.py:739 +#: stock/models.py:749 #, fuzzy #| msgid "Installed in Stock Item" msgid "Installed stock item" msgstr "In Lagerobjekt installiert" -#: stock/models.py:763 +#: stock/models.py:773 #, fuzzy #| msgid "Installed in Stock Item" msgid "Uninstalled stock item" msgstr "In Lagerobjekt installiert" -#: stock/models.py:782 +#: stock/models.py:792 #, fuzzy #| msgid "Include sublocations" msgid "Uninstalled into location" msgstr "Unterlagerorte einschließen" -#: stock/models.py:862 +#: stock/models.py:872 #, fuzzy #| msgid "Part is not a virtual part" msgid "Part is not set as trackable" msgstr "Teil ist nicht virtuell" -#: stock/models.py:868 +#: stock/models.py:878 msgid "Quantity must be integer" msgstr "Anzahl muss eine Ganzzahl sein" -#: stock/models.py:874 +#: stock/models.py:884 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "Anzahl darf nicht die verfügbare Anzahl überschreiten ({n})" -#: stock/models.py:877 +#: stock/models.py:887 msgid "Serial numbers must be a list of integers" msgstr "Seriennummern muss eine Liste von Ganzzahlen sein" -#: stock/models.py:880 +#: stock/models.py:890 msgid "Quantity does not match serial numbers" msgstr "Anzahl stimmt nicht mit den Seriennummern überein" -#: stock/models.py:912 +#: stock/models.py:922 msgid "Add serial number" msgstr "Seriennummer hinzufügen" -#: stock/models.py:915 +#: stock/models.py:925 #, python-brace-format msgid "Serialized {n} items" msgstr "{n} Teile serialisiert" -#: stock/models.py:1026 +#: stock/models.py:1036 msgid "StockItem cannot be moved as it is not in stock" msgstr "Lagerobjekt kann nicht bewegt werden, da kein Bestand vorhanden ist" -#: stock/models.py:1432 +#: stock/models.py:1442 msgid "Tracking entry title" msgstr "Name des Eintrags-Trackings" -#: stock/models.py:1434 +#: stock/models.py:1444 msgid "Entry notes" msgstr "Eintrags-Notizen" -#: stock/models.py:1436 +#: stock/models.py:1446 msgid "Link to external page for further information" msgstr "Link auf externe Seite für weitere Informationen" -#: stock/models.py:1496 +#: stock/models.py:1506 #, fuzzy #| msgid "Serial number for this item" msgid "Value must be provided for this test" msgstr "Seriennummer für dieses Teil" -#: stock/models.py:1502 +#: stock/models.py:1512 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1519 +#: stock/models.py:1529 msgid "Test" msgstr "" -#: stock/models.py:1520 +#: stock/models.py:1530 #, fuzzy #| msgid "Part name" msgid "Test name" msgstr "Name des Teils" -#: stock/models.py:1525 +#: stock/models.py:1535 #, fuzzy #| msgid "Search Results" msgid "Result" msgstr "Suchergebnisse" -#: stock/models.py:1526 templates/js/table_filters.js:172 +#: stock/models.py:1536 templates/js/table_filters.js:172 msgid "Test result" msgstr "" -#: stock/models.py:1532 +#: stock/models.py:1542 msgid "Test output value" msgstr "" -#: stock/models.py:1538 +#: stock/models.py:1548 #, fuzzy #| msgid "Attachments" msgid "Attachment" msgstr "Anhänge" -#: stock/models.py:1539 +#: stock/models.py:1549 #, fuzzy #| msgid "Delete attachment" msgid "Test result attachment" msgstr "Anhang löschen" -#: stock/models.py:1545 +#: stock/models.py:1555 #, fuzzy #| msgid "Edit notes" msgid "Test notes" msgstr "Bermerkungen bearbeiten" -#: stock/templates/stock/item.html:11 +#: stock/templates/stock/item.html:16 msgid "Stock Tracking Information" msgstr "Informationen zum Lagerbestands-Tracking" -#: stock/templates/stock/item.html:18 +#: stock/templates/stock/item.html:25 #, fuzzy #| msgid "Category" msgid "New Entry" @@ -4723,31 +4766,37 @@ msgstr "Kategorie" msgid "Stock Item Attachments" msgstr "Lagerobjekt-Notizen" -#: stock/templates/stock/item_base.html:20 +#: stock/templates/stock/item_base.html:24 +msgid "" +"You are not in the list of owners of this item. This stock item cannot be " +"edited." +msgstr "" + +#: stock/templates/stock/item_base.html:31 #, fuzzy #| msgid "This stock item does not have any child items" msgid "This stock item is in production and cannot be edited." msgstr "Dieses Lagerobjekt hat keine Kinder" -#: stock/templates/stock/item_base.html:21 +#: stock/templates/stock/item_base.html:32 msgid "Edit the stock item from the build view." msgstr "" -#: stock/templates/stock/item_base.html:34 +#: stock/templates/stock/item_base.html:45 #, fuzzy #| msgid "This stock item does not have any child items" msgid "This stock item has not passed all required tests" msgstr "Dieses Lagerobjekt hat keine Kinder" -#: stock/templates/stock/item_base.html:40 +#: stock/templates/stock/item_base.html:51 msgid "This stock item is allocated to Sales Order" msgstr "Dieses Lagerobjekt ist dem Auftrag zugewiesen" -#: stock/templates/stock/item_base.html:46 +#: stock/templates/stock/item_base.html:57 msgid "This stock item is allocated to Build" msgstr "Dieses Lagerobjekt ist dem Bau zugewiesen" -#: stock/templates/stock/item_base.html:52 +#: stock/templates/stock/item_base.html:63 msgid "" "This stock item is serialized - it has a unique serial number and the " "quantity cannot be adjusted." @@ -4755,177 +4804,177 @@ msgstr "" "Dieses Lagerobjekt ist serialisiert. Es hat eine eindeutige Seriennummer und " "die Anzahl kann nicht angepasst werden." -#: stock/templates/stock/item_base.html:56 +#: stock/templates/stock/item_base.html:67 msgid "This stock item cannot be deleted as it has child items" msgstr "Dieses Lagerobjekt kann nicht gelöscht werden, da es Kinder besitzt" -#: stock/templates/stock/item_base.html:60 +#: stock/templates/stock/item_base.html:71 msgid "" "This stock item will be automatically deleted when all stock is depleted." msgstr "" "Dieses Lagerobjekt wird automatisch gelöscht wenn der Lagerbestand " "aufgebraucht ist." -#: stock/templates/stock/item_base.html:74 -#: stock/templates/stock/item_base.html:320 templates/js/table_filters.js:111 +#: stock/templates/stock/item_base.html:91 +#: stock/templates/stock/item_base.html:340 templates/js/table_filters.js:111 msgid "Expired" msgstr "" -#: stock/templates/stock/item_base.html:78 -#: stock/templates/stock/item_base.html:322 templates/js/table_filters.js:116 +#: stock/templates/stock/item_base.html:95 +#: stock/templates/stock/item_base.html:342 templates/js/table_filters.js:116 msgid "Stale" msgstr "" -#: stock/templates/stock/item_base.html:113 templates/js/barcode.js:283 +#: stock/templates/stock/item_base.html:130 templates/js/barcode.js:283 #: templates/js/barcode.js:288 msgid "Unlink Barcode" msgstr "" -#: stock/templates/stock/item_base.html:115 +#: stock/templates/stock/item_base.html:132 msgid "Link Barcode" msgstr "" -#: stock/templates/stock/item_base.html:123 +#: stock/templates/stock/item_base.html:140 #, fuzzy -#| msgid "Confirm stock adjustment" -msgid "Document actions" -msgstr "Bestands-Anpassung bestätigen" +#| msgid "Source Location" +msgid "Printing actions" +msgstr "Quell-Standort" -#: stock/templates/stock/item_base.html:129 +#: stock/templates/stock/item_base.html:146 #: stock/templates/stock/item_tests.html:25 msgid "Test Report" msgstr "" -#: stock/templates/stock/item_base.html:137 +#: stock/templates/stock/item_base.html:156 #, fuzzy #| msgid "Confirm stock adjustment" msgid "Stock adjustment actions" msgstr "Bestands-Anpassung bestätigen" -#: stock/templates/stock/item_base.html:141 -#: stock/templates/stock/location.html:41 templates/stock_table.html:24 +#: stock/templates/stock/item_base.html:160 +#: stock/templates/stock/location.html:57 templates/stock_table.html:40 msgid "Count stock" msgstr "Bestand zählen" -#: stock/templates/stock/item_base.html:142 templates/stock_table.html:22 +#: stock/templates/stock/item_base.html:161 templates/stock_table.html:38 msgid "Add stock" msgstr "Bestand hinzufügen" -#: stock/templates/stock/item_base.html:143 templates/stock_table.html:23 +#: stock/templates/stock/item_base.html:162 templates/stock_table.html:39 msgid "Remove stock" msgstr "Bestand entfernen" -#: stock/templates/stock/item_base.html:145 +#: stock/templates/stock/item_base.html:164 #, fuzzy #| msgid "Order stock" msgid "Transfer stock" msgstr "Bestand bestellen" -#: stock/templates/stock/item_base.html:147 +#: stock/templates/stock/item_base.html:166 #, fuzzy #| msgid "Serialize Stock" msgid "Serialize stock" msgstr "Lagerbestand erfassen" -#: stock/templates/stock/item_base.html:151 +#: stock/templates/stock/item_base.html:170 #, fuzzy #| msgid "Item assigned to customer?" msgid "Assign to customer" msgstr "Ist dieses Objekt einem Kunden zugeteilt?" -#: stock/templates/stock/item_base.html:154 +#: stock/templates/stock/item_base.html:173 #, fuzzy #| msgid "Count stock" msgid "Return to stock" msgstr "Bestand zählen" -#: stock/templates/stock/item_base.html:158 templates/js/stock.js:1131 +#: stock/templates/stock/item_base.html:177 templates/js/stock.js:1159 #, fuzzy #| msgid "Installed in Stock Item" msgid "Uninstall stock item" msgstr "In Lagerobjekt installiert" -#: stock/templates/stock/item_base.html:158 +#: stock/templates/stock/item_base.html:177 msgid "Uninstall" msgstr "" -#: stock/templates/stock/item_base.html:167 -#: stock/templates/stock/location.html:38 +#: stock/templates/stock/item_base.html:186 +#: stock/templates/stock/location.html:54 #, fuzzy #| msgid "Stock Locations" msgid "Stock actions" msgstr "Lagerobjekt-Standorte" -#: stock/templates/stock/item_base.html:170 +#: stock/templates/stock/item_base.html:189 #, fuzzy #| msgid "Count stock items" msgid "Convert to variant" msgstr "Lagerobjekte zählen" -#: stock/templates/stock/item_base.html:173 +#: stock/templates/stock/item_base.html:192 #, fuzzy #| msgid "Count stock items" msgid "Duplicate stock item" msgstr "Lagerobjekte zählen" -#: stock/templates/stock/item_base.html:175 +#: stock/templates/stock/item_base.html:194 #, fuzzy #| msgid "Edit Stock Item" msgid "Edit stock item" msgstr "Lagerobjekt bearbeiten" -#: stock/templates/stock/item_base.html:178 +#: stock/templates/stock/item_base.html:197 #, fuzzy #| msgid "Delete Stock Item" msgid "Delete stock item" msgstr "Lagerobjekt löschen" -#: stock/templates/stock/item_base.html:189 +#: stock/templates/stock/item_base.html:209 msgid "Stock Item Details" msgstr "Lagerbestands-Details" -#: stock/templates/stock/item_base.html:248 templates/js/build.js:442 +#: stock/templates/stock/item_base.html:268 templates/js/build.js:442 #, fuzzy #| msgid "No stock location set" msgid "No location set" msgstr "Kein Lagerort gesetzt" -#: stock/templates/stock/item_base.html:255 +#: stock/templates/stock/item_base.html:275 #, fuzzy #| msgid "Unique Identifier" msgid "Barcode Identifier" msgstr "Eindeutiger Bezeichner" -#: stock/templates/stock/item_base.html:269 templates/js/build.js:642 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:642 #: templates/navbar.html:25 msgid "Build" msgstr "Bau" -#: stock/templates/stock/item_base.html:290 +#: stock/templates/stock/item_base.html:310 msgid "Parent Item" msgstr "Elternposition" -#: stock/templates/stock/item_base.html:320 +#: stock/templates/stock/item_base.html:340 #, fuzzy #| msgid "This stock item is allocated to Build" msgid "This StockItem expired on" msgstr "Dieses Lagerobjekt ist dem Bau zugewiesen" -#: stock/templates/stock/item_base.html:322 +#: stock/templates/stock/item_base.html:342 #, fuzzy #| msgid "Child Stock Items" msgid "This StockItem expires on" msgstr "Kind-Lagerobjekte" -#: stock/templates/stock/item_base.html:329 +#: stock/templates/stock/item_base.html:349 templates/js/stock.js:618 msgid "Last Updated" msgstr "Zuletzt aktualisiert" -#: stock/templates/stock/item_base.html:334 +#: stock/templates/stock/item_base.html:354 msgid "Last Stocktake" msgstr "Letzte Inventur" -#: stock/templates/stock/item_base.html:338 +#: stock/templates/stock/item_base.html:358 msgid "No stocktake performed" msgstr "Keine Inventur ausgeführt" @@ -4993,64 +5042,70 @@ msgstr "Vorlage löschen" msgid "Add Test Data" msgstr "" -#: stock/templates/stock/location.html:18 +#: stock/templates/stock/location.html:13 +msgid "" +"You are not in the list of owners of this location. This stock location " +"cannot be edited." +msgstr "" + +#: stock/templates/stock/location.html:30 msgid "All stock items" msgstr "Alle Lagerobjekte" -#: stock/templates/stock/location.html:33 +#: stock/templates/stock/location.html:47 #, fuzzy #| msgid "Child Stock Items" msgid "Check-in Items" msgstr "Kind-Lagerobjekte" -#: stock/templates/stock/location.html:47 +#: stock/templates/stock/location.html:63 #, fuzzy #| msgid "Location Description" msgid "Location actions" msgstr "Standort-Beschreibung" -#: stock/templates/stock/location.html:49 +#: stock/templates/stock/location.html:65 #, fuzzy #| msgid "Edit stock location" msgid "Edit location" msgstr "Lagerort bearbeiten" -#: stock/templates/stock/location.html:51 +#: stock/templates/stock/location.html:67 #, fuzzy #| msgid "Delete stock location" msgid "Delete location" msgstr "Lagerort löschen" -#: stock/templates/stock/location.html:61 +#: stock/templates/stock/location.html:78 msgid "Location Details" msgstr "Standort-Details" -#: stock/templates/stock/location.html:66 +#: stock/templates/stock/location.html:83 msgid "Location Path" msgstr "Standord-Pfad" -#: stock/templates/stock/location.html:71 +#: stock/templates/stock/location.html:88 msgid "Location Description" msgstr "Standort-Beschreibung" -#: stock/templates/stock/location.html:76 +#: stock/templates/stock/location.html:93 msgid "Sublocations" msgstr "Sub-Standorte" -#: stock/templates/stock/location.html:81 -#: stock/templates/stock/location.html:96 +#: stock/templates/stock/location.html:98 +#: stock/templates/stock/location.html:113 #: templates/InvenTree/search_stock_items.html:6 templates/stats.html:48 -#: templates/stats.html:57 users/models.py:31 +#: templates/stats.html:57 users/models.py:35 msgid "Stock Items" msgstr "Lagerobjekte" -#: stock/templates/stock/location.html:86 +#: stock/templates/stock/location.html:103 msgid "Stock Details" msgstr "Objekt-Details" -#: stock/templates/stock/location.html:91 +#: stock/templates/stock/location.html:108 #: templates/InvenTree/search_stock_location.html:6 templates/stats.html:52 -#: users/models.py:30 +#: users/models.py:34 msgid "Stock Locations" msgstr "Lagerobjekt-Standorte" @@ -5066,7 +5121,7 @@ msgstr "Sind Sie sicher, dass Sie diesen Anhang löschen wollen?" msgid "The following stock items will be uninstalled" msgstr "Die folgenden Objekte werden erstellt" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1248 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1343 #, fuzzy #| msgid "Count Stock Items" msgid "Convert Stock Item" @@ -5104,231 +5159,224 @@ msgstr "Kinder" msgid "Installed Items" msgstr "Installiert in" -#: stock/views.py:122 +#: stock/views.py:125 msgid "Edit Stock Location" msgstr "Lagerobjekt-Standort bearbeiten" -#: stock/views.py:147 +#: stock/views.py:233 stock/views.py:1333 stock/views.py:1446 +#: stock/views.py:1813 +msgid "Owner is required (ownership control is enabled)" +msgstr "" + +#: stock/views.py:248 msgid "Stock Location QR code" msgstr "QR-Code für diesen Standort" -#: stock/views.py:166 +#: stock/views.py:267 #, fuzzy #| msgid "Add Attachment" msgid "Add Stock Item Attachment" msgstr "Anhang hinzufügen" -#: stock/views.py:213 +#: stock/views.py:314 #, fuzzy #| msgid "Edit Stock Item" msgid "Edit Stock Item Attachment" msgstr "Lagerobjekt bearbeiten" -#: stock/views.py:230 +#: stock/views.py:331 #, fuzzy #| msgid "Delete Part Attachment" msgid "Delete Stock Item Attachment" msgstr "Teilanhang löschen" -#: stock/views.py:247 +#: stock/views.py:348 #, fuzzy #| msgid "Item assigned to customer?" msgid "Assign to Customer" msgstr "Ist dieses Objekt einem Kunden zugeteilt?" -#: stock/views.py:257 +#: stock/views.py:358 msgid "Customer must be specified" msgstr "" -#: stock/views.py:281 +#: stock/views.py:382 #, fuzzy #| msgid "Part Stock" msgid "Return to Stock" msgstr "Teilbestand" -#: stock/views.py:291 +#: stock/views.py:392 #, fuzzy #| msgid "Include sublocations" msgid "Specify a valid location" msgstr "Unterlagerorte einschließen" -#: stock/views.py:302 +#: stock/views.py:403 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:313 +#: stock/views.py:414 #, fuzzy #| msgid "Delete Template" msgid "Delete All Test Data" msgstr "Vorlage löschen" -#: stock/views.py:329 +#: stock/views.py:430 #, fuzzy #| msgid "Confirm Part Deletion" msgid "Confirm test data deletion" msgstr "Löschen des Teils bestätigen" -#: stock/views.py:349 +#: stock/views.py:450 msgid "Add Test Result" msgstr "" -#: stock/views.py:390 +#: stock/views.py:491 #, fuzzy #| msgid "Edit Template" msgid "Edit Test Result" msgstr "Vorlage bearbeiten" -#: stock/views.py:408 +#: stock/views.py:509 #, fuzzy #| msgid "Delete Template" msgid "Delete Test Result" msgstr "Vorlage löschen" -#: stock/views.py:420 -#, fuzzy -#| msgid "Delete Template" -msgid "Select Test Report Template" -msgstr "Vorlage löschen" - -#: stock/views.py:450 -#, fuzzy -#| msgid "Select valid part" -msgid "Select valid template" -msgstr "Bitte ein gültiges Teil auswählen" - -#: stock/views.py:503 +#: stock/views.py:518 msgid "Stock Export Options" msgstr "Lagerbestandsexportoptionen" -#: stock/views.py:625 +#: stock/views.py:640 msgid "Stock Item QR Code" msgstr "Lagerobjekt-QR-Code" -#: stock/views.py:651 +#: stock/views.py:666 #, fuzzy #| msgid "Installed in Stock Item" msgid "Install Stock Item" msgstr "In Lagerobjekt installiert" -#: stock/views.py:751 +#: stock/views.py:766 #, fuzzy #| msgid "Installed in Stock Item" msgid "Uninstall Stock Items" msgstr "In Lagerobjekt installiert" -#: stock/views.py:859 +#: stock/views.py:874 #, fuzzy #| msgid "Installed in Stock Item" msgid "Uninstalled stock items" msgstr "In Lagerobjekt installiert" -#: stock/views.py:884 +#: stock/views.py:899 msgid "Adjust Stock" msgstr "Lagerbestand anpassen" -#: stock/views.py:994 +#: stock/views.py:1009 msgid "Move Stock Items" msgstr "Lagerobjekte bewegen" -#: stock/views.py:995 +#: stock/views.py:1010 msgid "Count Stock Items" msgstr "Lagerobjekte zählen" -#: stock/views.py:996 +#: stock/views.py:1011 msgid "Remove From Stock" msgstr "Aus Lagerbestand entfernen" -#: stock/views.py:997 +#: stock/views.py:1012 msgid "Add Stock Items" msgstr "Lagerobjekte hinzufügen" -#: stock/views.py:998 +#: stock/views.py:1013 msgid "Delete Stock Items" msgstr "Lagerobjekte löschen" -#: stock/views.py:1026 +#: stock/views.py:1041 msgid "Must enter integer value" msgstr "Nur Ganzzahl eingeben" -#: stock/views.py:1031 +#: stock/views.py:1046 msgid "Quantity must be positive" msgstr "Anzahl muss positiv sein" -#: stock/views.py:1038 +#: stock/views.py:1053 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "Anzahl darf {x} nicht überschreiten" -#: stock/views.py:1117 +#: stock/views.py:1132 #, python-brace-format msgid "Added stock to {n} items" msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt" -#: stock/views.py:1132 +#: stock/views.py:1147 #, python-brace-format msgid "Removed stock from {n} items" msgstr "Vorrat von {n} Lagerobjekten entfernt" -#: stock/views.py:1145 +#: stock/views.py:1160 #, python-brace-format msgid "Counted stock for {n} items" msgstr "Bestand für {n} Objekte erfasst" -#: stock/views.py:1173 +#: stock/views.py:1200 msgid "No items were moved" msgstr "Keine Lagerobjekte wurden bewegt" -#: stock/views.py:1176 +#: stock/views.py:1203 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "{n} Teile nach {dest} bewegt" -#: stock/views.py:1195 +#: stock/views.py:1222 #, python-brace-format msgid "Deleted {n} stock items" msgstr "{n} Teile im Lager gelöscht" -#: stock/views.py:1207 +#: stock/views.py:1234 msgid "Edit Stock Item" msgstr "Lagerobjekt bearbeiten" -#: stock/views.py:1298 +#: stock/views.py:1463 msgid "Serialize Stock" msgstr "Lagerbestand erfassen" -#: stock/views.py:1392 templates/js/build.js:210 +#: stock/views.py:1557 templates/js/build.js:210 msgid "Create new Stock Item" msgstr "Neues Lagerobjekt hinzufügen" -#: stock/views.py:1500 +#: stock/views.py:1700 #, fuzzy #| msgid "Count stock items" msgid "Duplicate Stock Item" msgstr "Lagerobjekte zählen" -#: stock/views.py:1577 +#: stock/views.py:1782 #, fuzzy #| msgid "Quantity must be greater than zero" msgid "Quantity cannot be negative" msgstr "Anzahl muss größer Null sein" -#: stock/views.py:1663 +#: stock/views.py:1882 msgid "Delete Stock Location" msgstr "Standort löschen" -#: stock/views.py:1677 +#: stock/views.py:1896 msgid "Delete Stock Item" msgstr "Lagerobjekt löschen" -#: stock/views.py:1689 +#: stock/views.py:1908 msgid "Delete Stock Tracking Entry" msgstr "Lagerbestands-Tracking-Eintrag löschen" -#: stock/views.py:1708 +#: stock/views.py:1927 msgid "Edit Stock Tracking Entry" msgstr "Lagerbestands-Tracking-Eintrag bearbeiten" -#: stock/views.py:1718 +#: stock/views.py:1937 msgid "Add Stock Tracking Entry" msgstr "Lagerbestands-Tracking-Eintrag hinzufügen" @@ -5541,7 +5589,7 @@ msgstr "Auftragsdetails" msgid "Stock Settings" msgstr "Lagerobjekt-Standorte" -#: templates/InvenTree/settings/stock.html:13 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:33 #, fuzzy #| msgid "Stock Locations" msgid "Stock Options" @@ -5688,23 +5736,23 @@ msgstr "Code auf GitHub ansehen" msgid "Submit Bug Report" msgstr "Fehlerbericht senden" -#: templates/attachment_table.html:7 +#: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "Anhang hinzufügen" -#: templates/attachment_table.html:17 +#: templates/attachment_table.html:15 msgid "File" msgstr "Datei" -#: templates/attachment_table.html:18 +#: templates/attachment_table.html:16 msgid "Comment" msgstr "Kommentar" -#: templates/attachment_table.html:19 +#: templates/attachment_table.html:17 msgid "Uploaded" msgstr "" -#: templates/attachment_table.html:37 +#: templates/attachment_table.html:35 msgid "Delete attachment" msgstr "Anhang löschen" @@ -5821,45 +5869,45 @@ msgstr "Unterbaugruppe öffnen" msgid "Optional" msgstr "Optionen" -#: templates/js/bom.js:252 +#: templates/js/bom.js:251 msgid "No pricing available" msgstr "Keine Preisinformation verfügbar" -#: templates/js/bom.js:304 templates/js/build.js:571 +#: templates/js/bom.js:302 templates/js/build.js:571 #, fuzzy #| msgid "Options" msgid "Actions" msgstr "Optionen" -#: templates/js/bom.js:312 +#: templates/js/bom.js:310 msgid "Validate BOM Item" msgstr "BOM-Position validieren" -#: templates/js/bom.js:314 +#: templates/js/bom.js:312 msgid "This line has been validated" msgstr "Diese Position wurde validiert" -#: templates/js/bom.js:316 +#: templates/js/bom.js:314 msgid "Edit BOM Item" msgstr "BOM-Position bearbeiten" -#: templates/js/bom.js:318 +#: templates/js/bom.js:316 msgid "Delete BOM Item" msgstr "BOM-Position löschen" -#: templates/js/bom.js:395 templates/js/build.js:305 +#: templates/js/bom.js:393 templates/js/build.js:305 msgid "No BOM items found" msgstr "Keine BOM-Einträge gefunden" -#: templates/js/bom.js:541 +#: templates/js/bom.js:539 msgid "INACTIVE" msgstr "INAKTIV" -#: templates/js/bom.js:555 +#: templates/js/bom.js:553 msgid "Uses" msgstr "" -#: templates/js/bom.js:566 +#: templates/js/bom.js:564 #, fuzzy #| msgid "No matching action found" msgid "No matching parts found" @@ -5889,7 +5937,7 @@ msgstr "Lagerbestand dem Bau zuweisen" msgid "Delete build output" msgstr "Bau entfernt" -#: templates/js/build.js:209 templates/stock_table.html:13 +#: templates/js/build.js:209 templates/stock_table.html:18 msgid "New Stock Item" msgstr "Neues Lagerobjekt" @@ -5911,7 +5959,7 @@ msgstr "Anzahl" msgid "Build stock" msgstr "Baue" -#: templates/js/build.js:582 templates/stock_table.html:26 +#: templates/js/build.js:582 templates/stock_table.html:42 msgid "Order stock" msgstr "Bestand bestellen" @@ -5961,7 +6009,7 @@ msgstr "Vorlagenteil" msgid "Assembled part" msgstr "Baugruppe" -#: templates/js/label.js:10 +#: templates/js/label.js:10 templates/js/report.js:89 #, fuzzy #| msgid "Delete Stock Items" msgid "Select Stock Items" @@ -5999,13 +6047,19 @@ msgstr "" msgid "No labels found which match selected stock location(s)" msgstr "" -#: templates/js/label.js:141 +#: templates/js/label.js:142 templates/js/report.js:38 +#, fuzzy +#| msgid "StockItem has been allocated" +msgid "stock items selected" +msgstr "Lagerobjekt wurde zugewiesen" + +#: templates/js/label.js:150 templates/js/report.js:46 #, fuzzy #| msgid "Select valid part" msgid "Select Label" msgstr "Bitte ein gültiges Teil auswählen" -#: templates/js/label.js:156 +#: templates/js/label.js:165 #, fuzzy #| msgid "Select valid part" msgid "Select Label Template" @@ -6127,7 +6181,7 @@ msgstr "Keine Bestellungen gefunden" msgid "Order is overdue" msgstr "Bau-Zuweisung ist vollständig" -#: templates/js/order.js:193 templates/js/stock.js:816 +#: templates/js/order.js:193 templates/js/stock.js:844 msgid "Date" msgstr "Datum" @@ -6170,7 +6224,7 @@ msgid "No parts found" msgstr "Keine Teile gefunden" #: templates/js/part.js:343 templates/js/stock.js:473 -#: templates/js/stock.js:1163 +#: templates/js/stock.js:1191 msgid "Select" msgstr "Auswählen" @@ -6216,6 +6270,30 @@ msgstr "Anhang löschen" msgid "This test is defined for a parent part" msgstr "" +#: templates/js/report.js:61 +#, fuzzy +#| msgid "Delete Template" +msgid "Select Test Report Template" +msgstr "Vorlage löschen" + +#: templates/js/report.js:90 +#, fuzzy +#| msgid "StockItem has been allocated" +msgid "Stock item(s) must be selected before printing reports" +msgstr "Lagerobjekt wurde zugewiesen" + +#: templates/js/report.js:107 +#, fuzzy +#| msgid "No parts found" +msgid "No Reports Found" +msgstr "Keine Teile gefunden" + +#: templates/js/report.js:108 +#, fuzzy +#| msgid "Remove selected BOM items" +msgid "No report templates found which match selected stock item(s)" +msgstr "Ausgewählte Stücklistenpositionen entfernen" + #: templates/js/stock.js:37 msgid "PASS" msgstr "" @@ -6344,51 +6422,51 @@ msgstr "Löschen" msgid "Stocktake" msgstr "Letzte Inventur" -#: templates/js/stock.js:732 +#: templates/js/stock.js:760 #, fuzzy #| msgid "Stock status" msgid "Stock Status" msgstr "Bestandsstatus" -#: templates/js/stock.js:747 +#: templates/js/stock.js:775 #, fuzzy #| msgid "Stock status" msgid "Set Stock Status" msgstr "Bestandsstatus" -#: templates/js/stock.js:761 +#: templates/js/stock.js:789 #, fuzzy #| msgid "Select part to build" msgid "Select Status Code" msgstr "Teil für den Bau wählen" -#: templates/js/stock.js:762 +#: templates/js/stock.js:790 #, fuzzy #| msgid "StockItem has been allocated" msgid "Status code must be selected" msgstr "Lagerobjekt wurde zugewiesen" -#: templates/js/stock.js:882 +#: templates/js/stock.js:910 msgid "No user information" msgstr "Keine Benutzerinformation" -#: templates/js/stock.js:1002 +#: templates/js/stock.js:1030 msgid "Create New Location" msgstr "Neuen Standort anlegen" -#: templates/js/stock.js:1101 +#: templates/js/stock.js:1129 #, fuzzy #| msgid "Serial Number" msgid "Serial" msgstr "Seriennummer" -#: templates/js/stock.js:1194 templates/js/table_filters.js:131 +#: templates/js/stock.js:1222 templates/js/table_filters.js:131 #, fuzzy #| msgid "Installed In" msgid "Installed" msgstr "Installiert in" -#: templates/js/stock.js:1219 +#: templates/js/stock.js:1247 #, fuzzy #| msgid "Installed In" msgid "Install item" @@ -6593,7 +6671,7 @@ msgstr "" msgid "InvenTree server issues detected" msgstr "" -#: templates/navbar.html:63 users/models.py:27 +#: templates/navbar.html:63 users/models.py:31 msgid "Admin" msgstr "Admin" @@ -6637,69 +6715,81 @@ msgstr "" msgid "Issues detected" msgstr "Bestellung aufgeben" -#: templates/stock_table.html:6 +#: templates/stock_table.html:12 #, fuzzy #| msgid "Edit Stock Location" msgid "Export Stock Information" msgstr "Lagerobjekt-Standort bearbeiten" -#: templates/stock_table.html:20 +#: templates/stock_table.html:23 +#, fuzzy +#| msgid "Source Location" +msgid "Printing Actions" +msgstr "Quell-Standort" + +#: templates/stock_table.html:27 msgid "Print labels" msgstr "" -#: templates/stock_table.html:22 +#: templates/stock_table.html:28 +#, fuzzy +#| msgid "Parameter Template" +msgid "Print test reports" +msgstr "Parameter Vorlage" + +#: templates/stock_table.html:38 #, fuzzy #| msgid "Added stock to {n} items" msgid "Add to selected stock items" msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt" -#: templates/stock_table.html:23 +#: templates/stock_table.html:39 #, fuzzy #| msgid "Remove selected BOM items" msgid "Remove from selected stock items" msgstr "Ausgewählte Stücklistenpositionen entfernen" -#: templates/stock_table.html:24 +#: templates/stock_table.html:40 #, fuzzy #| msgid "Delete Stock Item" msgid "Stocktake selected stock items" msgstr "Lagerobjekt löschen" -#: templates/stock_table.html:25 +#: templates/stock_table.html:41 #, fuzzy #| msgid "Delete Stock Item" msgid "Move selected stock items" msgstr "Lagerobjekt löschen" -#: templates/stock_table.html:25 +#: templates/stock_table.html:41 msgid "Move stock" msgstr "Bestand bewegen" -#: templates/stock_table.html:26 +#: templates/stock_table.html:42 #, fuzzy #| msgid "Remove selected BOM items" msgid "Order selected items" msgstr "Ausgewählte Stücklistenpositionen entfernen" -#: templates/stock_table.html:27 +#: templates/stock_table.html:43 #, fuzzy #| msgid "Settings" msgid "Change status" msgstr "Einstellungen" -#: templates/stock_table.html:27 +#: templates/stock_table.html:43 #, fuzzy #| msgid "Stock status" msgid "Change stock status" msgstr "Bestandsstatus" -#: templates/stock_table.html:30 +#: templates/stock_table.html:46 #, fuzzy #| msgid "Delete line item" msgid "Delete selected items" msgstr "Position löschen" -#: templates/stock_table.html:30 +#: templates/stock_table.html:46 msgid "Delete Stock" msgstr "Bestand löschen" @@ -6735,46 +6825,56 @@ msgstr "Revision" msgid "Important dates" msgstr "Stückliste importieren" -#: users/models.py:142 +#: users/models.py:147 msgid "Permission set" msgstr "" -#: users/models.py:150 +#: users/models.py:155 msgid "Group" msgstr "" -#: users/models.py:153 +#: users/models.py:158 msgid "View" msgstr "" -#: users/models.py:153 +#: users/models.py:158 msgid "Permission to view items" msgstr "" -#: users/models.py:155 +#: users/models.py:160 #, fuzzy #| msgid "Address" msgid "Add" msgstr "Adresse" -#: users/models.py:155 +#: users/models.py:160 msgid "Permission to add items" msgstr "" -#: users/models.py:157 +#: users/models.py:162 msgid "Change" msgstr "" -#: users/models.py:157 +#: users/models.py:162 msgid "Permissions to edit items" msgstr "" -#: users/models.py:159 +#: users/models.py:164 #, fuzzy #| msgid "Remove selected BOM items" msgid "Permission to delete items" msgstr "Ausgewählte Stücklistenpositionen entfernen" +#, fuzzy +#~| msgid "Confirm stock adjustment" +#~ msgid "Document actions" +#~ msgstr "Bestands-Anpassung bestätigen" + +#, fuzzy +#~| msgid "Select valid part" +#~ msgid "Select valid template" +#~ msgstr "Bitte ein gültiges Teil auswählen" + #~ msgid "Database Statistics" #~ msgstr "Datenbankstatistiken" diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po index 7389af937b..b983bde6a4 100644 --- a/InvenTree/locale/en/LC_MESSAGES/django.po +++ b/InvenTree/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-14 23:57+1100\n" +"POT-Creation-Date: 2021-01-18 23:24+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -55,7 +55,7 @@ msgid "Select Category" msgstr "" #: InvenTree/helpers.py:361 order/models.py:232 order/models.py:330 -#: stock/views.py:1573 +#: stock/views.py:1778 msgid "Invalid quantity provided" msgstr "" @@ -95,7 +95,7 @@ msgstr "" msgid "File comment" msgstr "" -#: InvenTree/models.py:68 templates/js/stock.js:873 +#: InvenTree/models.py:68 templates/js/stock.js:901 msgid "User" msgstr "" @@ -108,22 +108,26 @@ msgstr "" msgid "Description (optional)" msgstr "" -#: InvenTree/settings.py:439 +#: InvenTree/settings.py:454 msgid "English" msgstr "" -#: InvenTree/settings.py:440 -msgid "German" -msgstr "" - -#: InvenTree/settings.py:441 +#: InvenTree/settings.py:455 msgid "French" msgstr "" -#: InvenTree/settings.py:442 +#: InvenTree/settings.py:456 +msgid "German" +msgstr "" + +#: InvenTree/settings.py:457 msgid "Polish" msgstr "" +#: InvenTree/settings.py:458 +msgid "Turkish" +msgstr "" + #: InvenTree/status.py:24 msgid "Celery worker check failed" msgstr "" @@ -302,7 +306,7 @@ msgstr "" #: build/forms.py:78 build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:83 -#: build/templates/build/detail.html:29 common/models.py:596 +#: build/templates/build/detail.html:29 common/models.py:603 #: company/forms.py:112 company/templates/company/supplier_part_pricing.html:75 #: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:179 @@ -310,13 +314,13 @@ msgstr "" #: order/templates/order/sales_order_detail.html:156 #: part/templates/part/allocation.html:16 #: part/templates/part/allocation.html:49 -#: part/templates/part/sale_prices.html:82 stock/forms.py:304 -#: stock/templates/stock/item_base.html:40 -#: stock/templates/stock/item_base.html:46 -#: stock/templates/stock/item_base.html:214 +#: part/templates/part/sale_prices.html:82 stock/forms.py:306 +#: stock/templates/stock/item_base.html:51 +#: stock/templates/stock/item_base.html:57 +#: stock/templates/stock/item_base.html:234 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:338 -#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:864 -#: templates/js/stock.js:1103 +#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:892 +#: templates/js/stock.js:1131 msgid "Quantity" msgstr "" @@ -324,7 +328,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:83 stock/forms.py:116 +#: build/forms.py:83 stock/forms.py:117 msgid "Serial numbers" msgstr "" @@ -381,7 +385,7 @@ msgstr "" #: build/models.py:62 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:11 #: order/templates/order/so_tabs.html:9 part/templates/part/tabs.html:31 -#: templates/InvenTree/settings/tabs.html:28 users/models.py:32 +#: templates/InvenTree/settings/tabs.html:28 users/models.py:36 msgid "Build Orders" msgstr "" @@ -402,10 +406,10 @@ msgstr "" #: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 #: templates/InvenTree/search.html:147 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:180 -#: templates/js/bom.js:549 templates/js/build.js:664 templates/js/company.js:56 +#: templates/js/bom.js:547 templates/js/build.js:664 templates/js/company.js:56 #: templates/js/order.js:180 templates/js/order.js:274 templates/js/part.js:188 #: templates/js/part.js:271 templates/js/part.js:391 templates/js/part.js:572 -#: templates/js/stock.js:511 templates/js/stock.js:845 +#: templates/js/stock.js:511 templates/js/stock.js:873 msgid "Description" msgstr "" @@ -430,10 +434,10 @@ msgstr "" #: order/templates/order/receive_parts.html:19 part/models.py:316 #: part/templates/part/part_app_base.html:7 part/templates/part/related.html:26 #: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133 -#: templates/js/barcode.js:336 templates/js/bom.js:153 templates/js/bom.js:534 +#: templates/js/barcode.js:336 templates/js/bom.js:153 templates/js/bom.js:532 #: templates/js/build.js:669 templates/js/company.js:138 #: templates/js/part.js:252 templates/js/part.js:357 templates/js/stock.js:485 -#: templates/js/stock.js:1175 +#: templates/js/stock.js:1203 msgid "Part" msgstr "" @@ -491,7 +495,7 @@ msgstr "" msgid "Build status code" msgstr "" -#: build/models.py:194 stock/models.py:412 +#: build/models.py:194 stock/models.py:418 msgid "Batch Code" msgstr "" @@ -507,11 +511,11 @@ msgstr "" #: company/templates/company/supplier_part_base.html:68 #: company/templates/company/supplier_part_detail.html:24 #: part/templates/part/detail.html:80 part/templates/part/part_base.html:102 -#: stock/models.py:406 stock/templates/stock/item_base.html:297 +#: stock/models.py:412 stock/templates/stock/item_base.html:317 msgid "External Link" msgstr "" -#: build/models.py:220 part/models.py:705 stock/models.py:408 +#: build/models.py:220 part/models.py:705 stock/models.py:414 msgid "Link to external URL" msgstr "" @@ -519,10 +523,10 @@ msgstr "" #: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18 #: order/templates/order/purchase_order_detail.html:213 #: order/templates/order/so_tabs.html:23 part/models.py:831 -#: part/templates/part/tabs.html:73 stock/forms.py:313 stock/forms.py:345 -#: stock/forms.py:373 stock/models.py:478 stock/models.py:1544 +#: part/templates/part/tabs.html:73 stock/forms.py:315 stock/forms.py:347 +#: stock/forms.py:375 stock/models.py:484 stock/models.py:1554 #: stock/templates/stock/tabs.html:26 templates/js/barcode.js:391 -#: templates/js/bom.js:295 templates/js/stock.js:127 templates/js/stock.js:618 +#: templates/js/bom.js:293 templates/js/stock.js:127 templates/js/stock.js:623 msgid "Notes" msgstr "" @@ -653,8 +657,8 @@ msgid "" "The following stock items will be allocated to the specified build output" msgstr "" -#: build/templates/build/auto_allocate.html:18 stock/forms.py:343 -#: stock/templates/stock/item_base.html:244 +#: build/templates/build/auto_allocate.html:18 stock/forms.py:345 +#: stock/templates/stock/item_base.html:264 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:183 templates/js/barcode.js:337 #: templates/js/build.js:434 templates/js/stock.js:597 @@ -682,8 +686,8 @@ msgstr "" #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:35 #: part/templates/part/category.html:13 part/templates/part/part_base.html:32 -#: stock/templates/stock/item_base.html:97 -#: stock/templates/stock/location.html:12 +#: stock/templates/stock/item_base.html:114 +#: stock/templates/stock/location.html:24 msgid "Admin view" msgstr "" @@ -721,10 +725,10 @@ msgstr "" #: build/templates/build/build_base.html:88 #: build/templates/build/detail.html:57 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:343 templates/InvenTree/search.html:175 +#: stock/templates/stock/item_base.html:363 templates/InvenTree/search.html:175 #: templates/js/barcode.js:42 templates/js/build.js:697 #: templates/js/order.js:185 templates/js/order.js:279 -#: templates/js/stock.js:584 templates/js/stock.js:1111 +#: templates/js/stock.js:584 templates/js/stock.js:1139 msgid "Status" msgstr "" @@ -752,7 +756,7 @@ msgstr "" #: order/templates/order/sales_order_notes.html:10 #: order/templates/order/sales_order_ship.html:25 #: part/templates/part/allocation.html:27 -#: stock/templates/stock/item_base.html:238 templates/js/order.js:240 +#: stock/templates/stock/item_base.html:258 templates/js/order.js:240 msgid "Sales Order" msgstr "" @@ -844,7 +848,7 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:44 stock/forms.py:371 +#: build/templates/build/detail.html:44 stock/forms.py:373 msgid "Destination" msgstr "" @@ -853,8 +857,8 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:68 -#: stock/templates/stock/item_base.html:262 templates/js/stock.js:592 -#: templates/js/stock.js:1118 templates/js/table_filters.js:80 +#: stock/templates/stock/item_base.html:282 templates/js/stock.js:592 +#: templates/js/stock.js:1146 templates/js/table_filters.js:80 #: templates/js/table_filters.js:161 msgid "Batch" msgstr "" @@ -953,7 +957,7 @@ msgstr "" msgid "Create Build Output" msgstr "" -#: build/views.py:207 stock/models.py:887 stock/views.py:1594 +#: build/views.py:207 stock/models.py:897 stock/views.py:1804 msgid "Serial numbers already exist" msgstr "" @@ -969,7 +973,7 @@ msgstr "" msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:303 build/views.py:388 stock/views.py:330 +#: build/views.py:303 build/views.py:388 stock/views.py:431 msgid "Check the confirmation box" msgstr "" @@ -1041,7 +1045,7 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:847 templates/js/bom.js:221 templates/js/build.js:519 +#: build/views.py:847 templates/js/bom.js:220 templates/js/build.js:519 #: templates/js/build.js:758 msgid "Available" msgstr "" @@ -1063,7 +1067,7 @@ msgid "Add Build Order Attachment" msgstr "" #: build/views.py:1060 order/views.py:113 order/views.py:166 part/views.py:170 -#: stock/views.py:179 +#: stock/views.py:280 msgid "Added attachment" msgstr "" @@ -1079,7 +1083,7 @@ msgstr "" msgid "Delete Attachment" msgstr "" -#: build/views.py:1123 order/views.py:242 order/views.py:257 stock/views.py:237 +#: build/views.py:1123 order/views.py:242 order/views.py:257 stock/views.py:338 msgid "Deleted attachment" msgstr "" @@ -1155,7 +1159,7 @@ msgstr "" msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:115 part/templates/part/detail.html:155 stock/forms.py:255 +#: common/models.py:115 part/templates/part/detail.html:155 stock/forms.py:257 #: templates/js/table_filters.js:23 templates/js/table_filters.js:270 msgid "Template" msgstr "" @@ -1262,71 +1266,79 @@ msgid "Allow building with expired stock" msgstr "" #: common/models.py:200 -msgid "Build Order Reference Prefix" +msgid "Stock Ownership Control" msgstr "" #: common/models.py:201 -msgid "Prefix value for build order reference" -msgstr "" - -#: common/models.py:206 -msgid "Build Order Reference Regex" +msgid "Enable ownership control over stock locations and items" msgstr "" #: common/models.py:207 +msgid "Build Order Reference Prefix" +msgstr "" + +#: common/models.py:208 +msgid "Prefix value for build order reference" +msgstr "" + +#: common/models.py:213 +msgid "Build Order Reference Regex" +msgstr "" + +#: common/models.py:214 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:211 +#: common/models.py:218 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:212 +#: common/models.py:219 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:217 +#: common/models.py:224 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:218 +#: common/models.py:225 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:441 +#: common/models.py:448 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:443 +#: common/models.py:450 msgid "Settings value" msgstr "" -#: common/models.py:500 +#: common/models.py:507 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:510 +#: common/models.py:517 msgid "Value must be an integer value" msgstr "" -#: common/models.py:524 +#: common/models.py:531 msgid "Key string must be unique" msgstr "" -#: common/models.py:597 company/forms.py:113 +#: common/models.py:604 company/forms.py:113 msgid "Price break quantity" msgstr "" -#: common/models.py:605 company/templates/company/supplier_part_pricing.html:80 -#: part/templates/part/sale_prices.html:87 templates/js/bom.js:246 +#: common/models.py:612 company/templates/company/supplier_part_pricing.html:80 +#: part/templates/part/sale_prices.html:87 templates/js/bom.js:245 msgid "Price" msgstr "" -#: common/models.py:606 +#: common/models.py:613 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:629 +#: common/models.py:636 msgid "Default" msgstr "" @@ -1427,8 +1439,8 @@ msgstr "" msgid "Currency" msgstr "" -#: company/models.py:313 stock/models.py:360 -#: stock/templates/stock/item_base.html:194 +#: company/models.py:313 stock/models.py:366 +#: stock/templates/stock/item_base.html:214 msgid "Base Part" msgstr "" @@ -1441,7 +1453,7 @@ msgstr "" #: company/templates/company/supplier_part_detail.html:21 #: order/templates/order/order_base.html:89 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170 -#: stock/templates/stock/item_base.html:304 templates/js/company.js:48 +#: stock/templates/stock/item_base.html:324 templates/js/company.js:48 #: templates/js/company.js:164 templates/js/order.js:167 msgid "Supplier" msgstr "" @@ -1537,8 +1549,8 @@ msgid "Uses default currency" msgstr "" #: company/templates/company/detail.html:62 -#: order/templates/order/sales_order_base.html:89 stock/models.py:395 -#: stock/models.py:396 stock/templates/stock/item_base.html:221 +#: order/templates/order/sales_order_base.html:89 stock/models.py:401 +#: stock/models.py:402 stock/templates/stock/item_base.html:241 #: templates/js/company.js:40 templates/js/order.js:261 msgid "Customer" msgstr "" @@ -1554,13 +1566,12 @@ msgstr "" #: company/templates/company/detail_part.html:18 #: order/templates/order/purchase_order_detail.html:68 -#: part/templates/part/supplier.html:14 templates/js/stock.js:995 +#: part/templates/part/supplier.html:14 templates/js/stock.js:1023 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_part.html:23 #: part/templates/part/category.html:120 part/templates/part/supplier.html:17 -#: templates/stock_table.html:18 msgid "Options" msgstr "" @@ -1578,7 +1589,8 @@ msgid "Delete Parts" msgstr "" #: company/templates/company/detail_part.html:63 -#: part/templates/part/category.html:116 templates/js/stock.js:989 +#: part/templates/part/bom.html:182 part/templates/part/category.html:116 +#: templates/js/stock.js:1017 msgid "New Part" msgstr "" @@ -1612,7 +1624,6 @@ msgstr "" #: company/templates/company/supplier_part_stock.html:33 #: part/templates/part/bom.html:63 part/templates/part/category.html:112 #: part/templates/part/category.html:126 part/templates/part/stock.html:51 -#: templates/stock_table.html:7 msgid "Export" msgstr "" @@ -1635,7 +1646,7 @@ msgstr "" #: order/templates/order/purchase_orders.html:13 #: part/templates/part/orders.html:9 part/templates/part/tabs.html:48 #: templates/InvenTree/settings/tabs.html:31 templates/navbar.html:33 -#: users/models.py:33 +#: users/models.py:37 msgid "Purchase Orders" msgstr "" @@ -1655,7 +1666,7 @@ msgstr "" #: order/templates/order/sales_orders.html:13 #: part/templates/part/sales_orders.html:9 part/templates/part/tabs.html:56 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:42 -#: users/models.py:34 +#: users/models.py:38 msgid "Sales Orders" msgstr "" @@ -1670,8 +1681,8 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:6 -#: company/templates/company/supplier_part_base.html:19 stock/models.py:369 -#: stock/templates/stock/item_base.html:309 templates/js/company.js:180 +#: company/templates/company/supplier_part_base.html:19 stock/models.py:375 +#: stock/templates/stock/item_base.html:329 templates/js/company.js:180 msgid "Supplier Part" msgstr "" @@ -1712,7 +1723,7 @@ msgid "Pricing Information" msgstr "" #: company/templates/company/supplier_part_pricing.html:17 company/views.py:486 -#: part/templates/part/sale_prices.html:14 part/views.py:2565 +#: part/templates/part/sale_prices.html:14 part/views.py:2558 msgid "Add Price Break" msgstr "" @@ -1741,7 +1752,7 @@ msgstr "" #: company/templates/company/supplier_part_tabs.html:8 #: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18 -#: stock/templates/stock/location.html:17 templates/InvenTree/search.html:155 +#: stock/templates/stock/location.html:29 templates/InvenTree/search.html:155 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:192 #: templates/js/part.js:418 templates/js/stock.js:519 templates/navbar.html:22 msgid "Stock" @@ -1756,7 +1767,7 @@ msgstr "" #: part/templates/part/cat_link.html:7 part/templates/part/category.html:94 #: part/templates/part/category_tabs.html:6 #: templates/InvenTree/settings/tabs.html:22 templates/navbar.html:19 -#: templates/stats.html:35 templates/stats.html:44 users/models.py:29 +#: templates/stats.html:35 templates/stats.html:44 users/models.py:33 msgid "Parts" msgstr "" @@ -1825,7 +1836,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:295 templates/js/stock.js:996 +#: company/views.py:295 templates/js/stock.js:1024 msgid "Create new Supplier Part" msgstr "" @@ -1833,19 +1844,19 @@ msgstr "" msgid "Delete Supplier Part" msgstr "" -#: company/views.py:492 part/views.py:2571 +#: company/views.py:492 part/views.py:2564 msgid "Added new price break" msgstr "" -#: company/views.py:548 part/views.py:2615 +#: company/views.py:548 part/views.py:2608 msgid "Edit Price Break" msgstr "" -#: company/views.py:564 part/views.py:2631 +#: company/views.py:564 part/views.py:2624 msgid "Delete Price Break" msgstr "" -#: label/api.py:171 +#: label/api.py:171 report/api.py:161 msgid "Must provide valid StockItem(s)" msgstr "" @@ -1865,7 +1876,7 @@ msgstr "" msgid "Label description" msgstr "" -#: label/models.py:83 stock/forms.py:198 +#: label/models.py:83 stock/forms.py:200 msgid "Label" msgstr "" @@ -1980,8 +1991,8 @@ msgstr "" msgid "Date order was completed" msgstr "" -#: order/models.py:230 order/models.py:328 part/views.py:1504 -#: stock/models.py:259 stock/models.py:871 +#: order/models.py:230 order/models.py:328 part/views.py:1506 +#: stock/models.py:265 stock/models.py:881 msgid "Quantity must be greater than zero" msgstr "" @@ -2019,7 +2030,7 @@ msgstr "" #: order/models.py:607 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 -#: stock/templates/stock/item_base.html:276 templates/js/order.js:145 +#: stock/templates/stock/item_base.html:296 templates/js/order.js:145 msgid "Purchase Order" msgstr "" @@ -2031,8 +2042,8 @@ msgstr "" msgid "Number of items received" msgstr "" -#: order/models.py:630 stock/models.py:488 -#: stock/templates/stock/item_base.html:283 +#: order/models.py:630 stock/models.py:494 +#: stock/templates/stock/item_base.html:303 msgid "Purchase Price" msgstr "" @@ -2190,13 +2201,13 @@ msgstr "" #: order/templates/order/purchase_order_detail.html:39 #: order/templates/order/purchase_order_detail.html:119 #: part/templates/part/category.html:173 part/templates/part/category.html:215 -#: templates/js/stock.js:642 templates/js/stock.js:1001 +#: templates/js/stock.js:657 templates/js/stock.js:1029 msgid "New Location" msgstr "" #: order/templates/order/purchase_order_detail.html:40 #: order/templates/order/purchase_order_detail.html:120 -#: stock/templates/stock/location.html:22 +#: stock/templates/stock/location.html:35 msgid "Create new stock location" msgstr "" @@ -2275,8 +2286,8 @@ msgid "Sales Order Items" msgstr "" #: order/templates/order/sales_order_detail.html:72 -#: order/templates/order/sales_order_detail.html:154 stock/models.py:400 -#: stock/templates/stock/item_base.html:208 templates/js/build.js:418 +#: order/templates/order/sales_order_detail.html:154 stock/models.py:406 +#: stock/templates/stock/item_base.html:228 templates/js/build.js:418 msgid "Serial Number" msgstr "" @@ -2508,11 +2519,11 @@ msgstr "" msgid "Error reading BOM file (incorrect row size)" msgstr "" -#: part/forms.py:71 stock/forms.py:261 +#: part/forms.py:71 stock/forms.py:263 msgid "File Format" msgstr "" -#: part/forms.py:71 stock/forms.py:261 +#: part/forms.py:71 stock/forms.py:263 msgid "Select output file format" msgstr "" @@ -2643,7 +2654,7 @@ msgstr "" #: part/models.py:78 part/templates/part/category.html:18 #: part/templates/part/category.html:89 templates/stats.html:39 -#: users/models.py:28 +#: users/models.py:32 msgid "Part Categories" msgstr "" @@ -2885,56 +2896,56 @@ msgstr "" msgid "Default Parameter Value" msgstr "" -#: part/models.py:1865 +#: part/models.py:1862 msgid "Select parent part" msgstr "" -#: part/models.py:1873 +#: part/models.py:1870 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:1879 +#: part/models.py:1876 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:1881 +#: part/models.py:1878 msgid "This BOM item is optional" msgstr "" -#: part/models.py:1884 +#: part/models.py:1881 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:1887 +#: part/models.py:1884 msgid "BOM item reference" msgstr "" -#: part/models.py:1890 +#: part/models.py:1887 msgid "BOM item notes" msgstr "" -#: part/models.py:1892 +#: part/models.py:1889 msgid "BOM line checksum" msgstr "" -#: part/models.py:1963 part/views.py:1510 part/views.py:1562 -#: stock/models.py:249 +#: part/models.py:1960 part/views.py:1512 part/views.py:1564 +#: stock/models.py:255 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:1972 part/models.py:1974 +#: part/models.py:1969 part/models.py:1971 msgid "Sub part must be specified" msgstr "" -#: part/models.py:1977 +#: part/models.py:1974 msgid "BOM Item" msgstr "" -#: part/models.py:2098 +#: part/models.py:2095 msgid "Select Related Part" msgstr "" -#: part/models.py:2130 +#: part/models.py:2127 msgid "" "Error creating relationship: check that the part is not related to itself " "and that the relationship is unique" @@ -2954,10 +2965,10 @@ msgstr "" #: part/templates/part/allocation.html:28 #: part/templates/part/allocation.html:45 #: stock/templates/stock/item_base.html:8 -#: stock/templates/stock/item_base.html:72 -#: stock/templates/stock/item_base.html:291 +#: stock/templates/stock/item_base.html:89 +#: stock/templates/stock/item_base.html:311 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:751 -#: templates/js/stock.js:834 templates/js/stock.js:1094 +#: templates/js/stock.js:862 templates/js/stock.js:1122 msgid "Stock Item" msgstr "" @@ -2965,6 +2976,14 @@ msgstr "" msgid "Part Attachments" msgstr "" +#: part/templates/part/bom-delete.html:6 +msgid "Are you sure you want to delete this BOM item?" +msgstr "" + +#: part/templates/part/bom-delete.html:8 +msgid "Deleting this entry will remove the BOM row from the following part" +msgstr "" + #: part/templates/part/bom.html:13 msgid "Bill of Materials" msgstr "" @@ -3022,7 +3041,7 @@ msgstr "" msgid "Validate" msgstr "" -#: part/templates/part/bom.html:62 part/views.py:1801 +#: part/templates/part/bom.html:62 part/views.py:1803 msgid "Export Bill of Materials" msgstr "" @@ -3034,6 +3053,11 @@ msgstr "" msgid "All selected BOM items will be deleted" msgstr "" +#: part/templates/part/bom.html:183 part/views.py:594 +#: templates/js/stock.js:1018 +msgid "Create New Part" +msgstr "" + #: part/templates/part/bom_duplicate.html:13 msgid "This part already has a Bill of Materials" msgstr "" @@ -3089,6 +3113,15 @@ msgstr "" msgid "Select Part" msgstr "" +#: part/templates/part/bom_upload/select_parts.html:52 +msgid "Remove row" +msgstr "" + +#: part/templates/part/bom_upload/select_parts.html:59 +#: part/templates/part/category.html:115 +msgid "Create new part" +msgstr "" + #: part/templates/part/bom_upload/upload_file.html:13 msgid "Step 1 - Select BOM File" msgstr "" @@ -3122,7 +3155,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:24 part/views.py:2192 +#: part/templates/part/category.html:24 part/views.py:2194 msgid "Create new part category" msgstr "" @@ -3158,10 +3191,6 @@ msgstr "" msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:115 -msgid "Create new part" -msgstr "" - #: part/templates/part/category.html:123 msgid "Set category" msgstr "" @@ -3174,7 +3203,7 @@ msgstr "" msgid "Export Data" msgstr "" -#: part/templates/part/category.html:174 templates/js/stock.js:643 +#: part/templates/part/category.html:174 templates/js/stock.js:658 msgid "Create new location" msgstr "" @@ -3190,7 +3219,7 @@ msgstr "" msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:216 stock/views.py:1276 +#: part/templates/part/category.html:216 stock/views.py:1371 msgid "Create new Stock Location" msgstr "" @@ -3198,10 +3227,12 @@ msgstr "" msgid "Parametric Table" msgstr "" +#: part/templates/part/copy_part.html:14 #: part/templates/part/create_part.html:11 msgid "Possible Matching Parts" msgstr "" +#: part/templates/part/copy_part.html:15 #: part/templates/part/create_part.html:12 msgid "The new part may be a duplicate of these existing parts" msgstr "" @@ -3316,13 +3347,13 @@ msgstr "" msgid "New Parameter" msgstr "" -#: part/templates/part/params.html:25 stock/models.py:1531 +#: part/templates/part/params.html:25 stock/models.py:1541 #: templates/InvenTree/settings/header.html:8 templates/js/stock.js:123 msgid "Value" msgstr "" #: part/templates/part/params.html:41 part/templates/part/related.html:41 -#: part/templates/part/supplier.html:19 users/models.py:159 +#: part/templates/part/supplier.html:19 users/models.py:164 msgid "Delete" msgstr "" @@ -3352,20 +3383,20 @@ msgid "Star this part" msgstr "" #: part/templates/part/part_base.html:49 -#: stock/templates/stock/item_base.html:108 -#: stock/templates/stock/location.html:29 +#: stock/templates/stock/item_base.html:125 +#: stock/templates/stock/location.html:43 msgid "Barcode actions" msgstr "" #: part/templates/part/part_base.html:51 -#: stock/templates/stock/item_base.html:110 -#: stock/templates/stock/location.html:31 +#: stock/templates/stock/item_base.html:127 +#: stock/templates/stock/location.html:45 msgid "Show QR Code" msgstr "" #: part/templates/part/part_base.html:52 -#: stock/templates/stock/item_base.html:126 -#: stock/templates/stock/location.html:32 +#: stock/templates/stock/item_base.html:143 +#: stock/templates/stock/location.html:46 msgid "Print Label" msgstr "" @@ -3405,7 +3436,7 @@ msgstr "" msgid "Allocated to Sales Orders" msgstr "" -#: part/templates/part/part_base.html:160 templates/js/bom.js:262 +#: part/templates/part/part_base.html:160 templates/js/bom.js:260 msgid "Can Build" msgstr "" @@ -3461,7 +3492,7 @@ msgstr "" msgid "Part Stock" msgstr "" -#: part/templates/part/stock_count.html:7 templates/js/bom.js:230 +#: part/templates/part/stock_count.html:7 templates/js/bom.js:229 #: templates/js/part.js:442 msgid "No Stock" msgstr "" @@ -3502,7 +3533,7 @@ msgstr "" msgid "Used In" msgstr "" -#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:349 +#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:369 msgid "Tests" msgstr "" @@ -3518,6 +3549,14 @@ msgstr "" msgid "Assemblies" msgstr "" +#: part/templates/part/variant_part.html:9 +msgid "Create new part variant" +msgstr "" + +#: part/templates/part/variant_part.html:10 +msgid "Create a new variant of template" +msgstr "" + #: part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" @@ -3542,7 +3581,7 @@ msgstr "" msgid "Add part attachment" msgstr "" -#: part/views.py:209 templates/attachment_table.html:34 +#: part/views.py:209 templates/attachment_table.html:32 msgid "Edit attachment" msgstr "" @@ -3591,159 +3630,155 @@ msgstr "" msgid "Copied part" msgstr "" -#: part/views.py:529 part/views.py:667 +#: part/views.py:529 part/views.py:669 msgid "Possible matches exist - confirm creation of new part" msgstr "" -#: part/views.py:594 templates/js/stock.js:990 -msgid "Create New Part" -msgstr "" - #: part/views.py:601 msgid "Created new part" msgstr "" -#: part/views.py:836 +#: part/views.py:838 msgid "Part QR Code" msgstr "" -#: part/views.py:855 +#: part/views.py:857 msgid "Upload Part Image" msgstr "" -#: part/views.py:863 part/views.py:900 +#: part/views.py:865 part/views.py:902 msgid "Updated part image" msgstr "" -#: part/views.py:872 +#: part/views.py:874 msgid "Select Part Image" msgstr "" -#: part/views.py:903 +#: part/views.py:905 msgid "Part image not found" msgstr "" -#: part/views.py:914 +#: part/views.py:916 msgid "Edit Part Properties" msgstr "" -#: part/views.py:945 +#: part/views.py:947 msgid "Duplicate BOM" msgstr "" -#: part/views.py:976 +#: part/views.py:978 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:997 +#: part/views.py:999 msgid "Validate BOM" msgstr "" -#: part/views.py:1020 +#: part/views.py:1022 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1031 +#: part/views.py:1033 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1165 +#: part/views.py:1167 msgid "No BOM file provided" msgstr "" -#: part/views.py:1513 +#: part/views.py:1515 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1538 part/views.py:1541 +#: part/views.py:1540 part/views.py:1543 msgid "Select valid part" msgstr "" -#: part/views.py:1547 +#: part/views.py:1549 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1585 +#: part/views.py:1587 msgid "Select a part" msgstr "" -#: part/views.py:1591 +#: part/views.py:1593 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1595 +#: part/views.py:1597 msgid "Specify quantity" msgstr "" -#: part/views.py:1851 +#: part/views.py:1853 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:1860 +#: part/views.py:1862 msgid "Part was deleted" msgstr "" -#: part/views.py:1869 +#: part/views.py:1871 msgid "Part Pricing" msgstr "" -#: part/views.py:1983 +#: part/views.py:1985 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:1993 +#: part/views.py:1995 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2002 +#: part/views.py:2004 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2012 +#: part/views.py:2014 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2064 +#: part/views.py:2066 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2080 +#: part/views.py:2082 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2139 +#: part/views.py:2141 msgid "Edit Part Category" msgstr "" -#: part/views.py:2176 +#: part/views.py:2178 msgid "Delete Part Category" msgstr "" -#: part/views.py:2184 +#: part/views.py:2186 msgid "Part category was deleted" msgstr "" -#: part/views.py:2240 +#: part/views.py:2242 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2343 +#: part/views.py:2345 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2401 +#: part/views.py:2403 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2426 +#: part/views.py:2419 msgid "Create BOM Item" msgstr "" -#: part/views.py:2498 +#: part/views.py:2491 msgid "Edit BOM item" msgstr "" -#: part/views.py:2555 +#: part/views.py:2548 msgid "Confim BOM item deletion" msgstr "" @@ -3775,309 +3810,309 @@ msgstr "" msgid "Asset file description" msgstr "" -#: stock/forms.py:116 +#: stock/forms.py:117 msgid "Enter unique serial numbers (or leave blank)" msgstr "" -#: stock/forms.py:199 stock/forms.py:255 +#: stock/forms.py:201 stock/forms.py:257 msgid "Select test report template" msgstr "" -#: stock/forms.py:263 +#: stock/forms.py:265 msgid "Include stock items in sub locations" msgstr "" -#: stock/forms.py:298 +#: stock/forms.py:300 msgid "Stock item to install" msgstr "" -#: stock/forms.py:305 +#: stock/forms.py:307 msgid "Stock quantity to assign" msgstr "" -#: stock/forms.py:333 +#: stock/forms.py:335 msgid "Must not exceed available quantity" msgstr "" -#: stock/forms.py:343 +#: stock/forms.py:345 msgid "Destination location for uninstalled items" msgstr "" -#: stock/forms.py:345 +#: stock/forms.py:347 msgid "Add transaction note (optional)" msgstr "" -#: stock/forms.py:347 +#: stock/forms.py:349 msgid "Confirm uninstall" msgstr "" -#: stock/forms.py:347 +#: stock/forms.py:349 msgid "Confirm removal of installed stock items" msgstr "" -#: stock/forms.py:371 +#: stock/forms.py:373 msgid "Destination stock location" msgstr "" -#: stock/forms.py:373 +#: stock/forms.py:375 msgid "Add note (required)" msgstr "" -#: stock/forms.py:377 stock/views.py:848 stock/views.py:1046 +#: stock/forms.py:379 stock/views.py:863 stock/views.py:1061 msgid "Confirm stock adjustment" msgstr "" -#: stock/forms.py:377 +#: stock/forms.py:379 msgid "Confirm movement of stock items" msgstr "" -#: stock/forms.py:379 +#: stock/forms.py:381 msgid "Set Default Location" msgstr "" -#: stock/forms.py:379 +#: stock/forms.py:381 msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:194 +#: stock/models.py:200 msgid "Created stock item" msgstr "" -#: stock/models.py:230 +#: stock/models.py:236 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:266 +#: stock/models.py:272 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:276 stock/models.py:285 +#: stock/models.py:282 stock/models.py:291 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:277 +#: stock/models.py:283 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:299 +#: stock/models.py:305 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:305 +#: stock/models.py:311 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:312 +#: stock/models.py:318 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:352 +#: stock/models.py:358 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:361 +#: stock/models.py:367 msgid "Base part" msgstr "" -#: stock/models.py:370 +#: stock/models.py:376 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:375 stock/templates/stock/stock_app_base.html:7 +#: stock/models.py:381 stock/templates/stock/stock_app_base.html:7 msgid "Stock Location" msgstr "" -#: stock/models.py:378 +#: stock/models.py:384 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:383 stock/templates/stock/item_base.html:229 +#: stock/models.py:389 stock/templates/stock/item_base.html:249 msgid "Installed In" msgstr "" -#: stock/models.py:386 +#: stock/models.py:392 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:402 +#: stock/models.py:408 msgid "Serial number for this item" msgstr "" -#: stock/models.py:414 +#: stock/models.py:420 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:418 +#: stock/models.py:424 msgid "Stock Quantity" msgstr "" -#: stock/models.py:427 +#: stock/models.py:433 msgid "Source Build" msgstr "" -#: stock/models.py:429 +#: stock/models.py:435 msgid "Build for this stock item" msgstr "" -#: stock/models.py:440 +#: stock/models.py:446 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:443 +#: stock/models.py:449 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:449 +#: stock/models.py:455 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:455 stock/templates/stock/item_base.html:316 +#: stock/models.py:461 stock/templates/stock/item_base.html:336 #: templates/js/stock.js:612 msgid "Expiry Date" msgstr "" -#: stock/models.py:456 +#: stock/models.py:462 msgid "" "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:469 +#: stock/models.py:475 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:479 stock/templates/stock/item_notes.html:14 +#: stock/models.py:485 stock/templates/stock/item_notes.html:14 #: stock/templates/stock/item_notes.html:30 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:489 +#: stock/models.py:495 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:589 +#: stock/models.py:599 msgid "Assigned to Customer" msgstr "" -#: stock/models.py:591 +#: stock/models.py:601 msgid "Manually assigned to customer" msgstr "" -#: stock/models.py:604 +#: stock/models.py:614 msgid "Returned from customer" msgstr "" -#: stock/models.py:606 +#: stock/models.py:616 msgid "Returned to location" msgstr "" -#: stock/models.py:731 +#: stock/models.py:741 msgid "Installed into stock item" msgstr "" -#: stock/models.py:739 +#: stock/models.py:749 msgid "Installed stock item" msgstr "" -#: stock/models.py:763 +#: stock/models.py:773 msgid "Uninstalled stock item" msgstr "" -#: stock/models.py:782 +#: stock/models.py:792 msgid "Uninstalled into location" msgstr "" -#: stock/models.py:862 +#: stock/models.py:872 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:868 +#: stock/models.py:878 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:874 +#: stock/models.py:884 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:877 +#: stock/models.py:887 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:880 +#: stock/models.py:890 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:912 +#: stock/models.py:922 msgid "Add serial number" msgstr "" -#: stock/models.py:915 +#: stock/models.py:925 #, python-brace-format msgid "Serialized {n} items" msgstr "" -#: stock/models.py:1026 +#: stock/models.py:1036 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1432 +#: stock/models.py:1442 msgid "Tracking entry title" msgstr "" -#: stock/models.py:1434 +#: stock/models.py:1444 msgid "Entry notes" msgstr "" -#: stock/models.py:1436 +#: stock/models.py:1446 msgid "Link to external page for further information" msgstr "" -#: stock/models.py:1496 +#: stock/models.py:1506 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1502 +#: stock/models.py:1512 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1519 +#: stock/models.py:1529 msgid "Test" msgstr "" -#: stock/models.py:1520 +#: stock/models.py:1530 msgid "Test name" msgstr "" -#: stock/models.py:1525 +#: stock/models.py:1535 msgid "Result" msgstr "" -#: stock/models.py:1526 templates/js/table_filters.js:172 +#: stock/models.py:1536 templates/js/table_filters.js:172 msgid "Test result" msgstr "" -#: stock/models.py:1532 +#: stock/models.py:1542 msgid "Test output value" msgstr "" -#: stock/models.py:1538 +#: stock/models.py:1548 msgid "Attachment" msgstr "" -#: stock/models.py:1539 +#: stock/models.py:1549 msgid "Test result attachment" msgstr "" -#: stock/models.py:1545 +#: stock/models.py:1555 msgid "Test notes" msgstr "" -#: stock/templates/stock/item.html:11 +#: stock/templates/stock/item.html:16 msgid "Stock Tracking Information" msgstr "" -#: stock/templates/stock/item.html:18 +#: stock/templates/stock/item.html:25 msgid "New Entry" msgstr "" @@ -4085,169 +4120,175 @@ msgstr "" msgid "Stock Item Attachments" msgstr "" -#: stock/templates/stock/item_base.html:20 +#: stock/templates/stock/item_base.html:24 +msgid "" +"You are not in the list of owners of this item. This stock item cannot be " +"edited." +msgstr "" + +#: stock/templates/stock/item_base.html:31 msgid "This stock item is in production and cannot be edited." msgstr "" -#: stock/templates/stock/item_base.html:21 +#: stock/templates/stock/item_base.html:32 msgid "Edit the stock item from the build view." msgstr "" -#: stock/templates/stock/item_base.html:34 +#: stock/templates/stock/item_base.html:45 msgid "This stock item has not passed all required tests" msgstr "" -#: stock/templates/stock/item_base.html:40 +#: stock/templates/stock/item_base.html:51 msgid "This stock item is allocated to Sales Order" msgstr "" -#: stock/templates/stock/item_base.html:46 +#: stock/templates/stock/item_base.html:57 msgid "This stock item is allocated to Build" msgstr "" -#: stock/templates/stock/item_base.html:52 +#: stock/templates/stock/item_base.html:63 msgid "" "This stock item is serialized - it has a unique serial number and the " "quantity cannot be adjusted." msgstr "" -#: stock/templates/stock/item_base.html:56 +#: stock/templates/stock/item_base.html:67 msgid "This stock item cannot be deleted as it has child items" msgstr "" -#: stock/templates/stock/item_base.html:60 +#: stock/templates/stock/item_base.html:71 msgid "" "This stock item will be automatically deleted when all stock is depleted." msgstr "" -#: stock/templates/stock/item_base.html:74 -#: stock/templates/stock/item_base.html:320 templates/js/table_filters.js:111 +#: stock/templates/stock/item_base.html:91 +#: stock/templates/stock/item_base.html:340 templates/js/table_filters.js:111 msgid "Expired" msgstr "" -#: stock/templates/stock/item_base.html:78 -#: stock/templates/stock/item_base.html:322 templates/js/table_filters.js:116 +#: stock/templates/stock/item_base.html:95 +#: stock/templates/stock/item_base.html:342 templates/js/table_filters.js:116 msgid "Stale" msgstr "" -#: stock/templates/stock/item_base.html:113 templates/js/barcode.js:283 +#: stock/templates/stock/item_base.html:130 templates/js/barcode.js:283 #: templates/js/barcode.js:288 msgid "Unlink Barcode" msgstr "" -#: stock/templates/stock/item_base.html:115 +#: stock/templates/stock/item_base.html:132 msgid "Link Barcode" msgstr "" -#: stock/templates/stock/item_base.html:123 -msgid "Document actions" +#: stock/templates/stock/item_base.html:140 +msgid "Printing actions" msgstr "" -#: stock/templates/stock/item_base.html:129 +#: stock/templates/stock/item_base.html:146 #: stock/templates/stock/item_tests.html:25 msgid "Test Report" msgstr "" -#: stock/templates/stock/item_base.html:137 +#: stock/templates/stock/item_base.html:156 msgid "Stock adjustment actions" msgstr "" -#: stock/templates/stock/item_base.html:141 -#: stock/templates/stock/location.html:41 templates/stock_table.html:24 +#: stock/templates/stock/item_base.html:160 +#: stock/templates/stock/location.html:57 templates/stock_table.html:40 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:142 templates/stock_table.html:22 +#: stock/templates/stock/item_base.html:161 templates/stock_table.html:38 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:143 templates/stock_table.html:23 +#: stock/templates/stock/item_base.html:162 templates/stock_table.html:39 msgid "Remove stock" msgstr "" -#: stock/templates/stock/item_base.html:145 +#: stock/templates/stock/item_base.html:164 msgid "Transfer stock" msgstr "" -#: stock/templates/stock/item_base.html:147 +#: stock/templates/stock/item_base.html:166 msgid "Serialize stock" msgstr "" -#: stock/templates/stock/item_base.html:151 +#: stock/templates/stock/item_base.html:170 msgid "Assign to customer" msgstr "" -#: stock/templates/stock/item_base.html:154 +#: stock/templates/stock/item_base.html:173 msgid "Return to stock" msgstr "" -#: stock/templates/stock/item_base.html:158 templates/js/stock.js:1131 +#: stock/templates/stock/item_base.html:177 templates/js/stock.js:1159 msgid "Uninstall stock item" msgstr "" -#: stock/templates/stock/item_base.html:158 +#: stock/templates/stock/item_base.html:177 msgid "Uninstall" msgstr "" -#: stock/templates/stock/item_base.html:167 -#: stock/templates/stock/location.html:38 +#: stock/templates/stock/item_base.html:186 +#: stock/templates/stock/location.html:54 msgid "Stock actions" msgstr "" -#: stock/templates/stock/item_base.html:170 +#: stock/templates/stock/item_base.html:189 msgid "Convert to variant" msgstr "" -#: stock/templates/stock/item_base.html:173 +#: stock/templates/stock/item_base.html:192 msgid "Duplicate stock item" msgstr "" -#: stock/templates/stock/item_base.html:175 +#: stock/templates/stock/item_base.html:194 msgid "Edit stock item" msgstr "" -#: stock/templates/stock/item_base.html:178 +#: stock/templates/stock/item_base.html:197 msgid "Delete stock item" msgstr "" -#: stock/templates/stock/item_base.html:189 +#: stock/templates/stock/item_base.html:209 msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:248 templates/js/build.js:442 +#: stock/templates/stock/item_base.html:268 templates/js/build.js:442 msgid "No location set" msgstr "" -#: stock/templates/stock/item_base.html:255 +#: stock/templates/stock/item_base.html:275 msgid "Barcode Identifier" msgstr "" -#: stock/templates/stock/item_base.html:269 templates/js/build.js:642 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:642 #: templates/navbar.html:25 msgid "Build" msgstr "" -#: stock/templates/stock/item_base.html:290 +#: stock/templates/stock/item_base.html:310 msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:320 +#: stock/templates/stock/item_base.html:340 msgid "This StockItem expired on" msgstr "" -#: stock/templates/stock/item_base.html:322 +#: stock/templates/stock/item_base.html:342 msgid "This StockItem expires on" msgstr "" -#: stock/templates/stock/item_base.html:329 +#: stock/templates/stock/item_base.html:349 templates/js/stock.js:618 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:334 +#: stock/templates/stock/item_base.html:354 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:338 +#: stock/templates/stock/item_base.html:358 msgid "No stocktake performed" msgstr "" @@ -4303,56 +4344,62 @@ msgstr "" msgid "Add Test Data" msgstr "" -#: stock/templates/stock/location.html:18 +#: stock/templates/stock/location.html:13 +msgid "" +"You are not in the list of owners of this location. This stock location " +"cannot be edited." +msgstr "" + +#: stock/templates/stock/location.html:30 msgid "All stock items" msgstr "" -#: stock/templates/stock/location.html:33 +#: stock/templates/stock/location.html:47 msgid "Check-in Items" msgstr "" -#: stock/templates/stock/location.html:47 +#: stock/templates/stock/location.html:63 msgid "Location actions" msgstr "" -#: stock/templates/stock/location.html:49 +#: stock/templates/stock/location.html:65 msgid "Edit location" msgstr "" -#: stock/templates/stock/location.html:51 +#: stock/templates/stock/location.html:67 msgid "Delete location" msgstr "" -#: stock/templates/stock/location.html:61 +#: stock/templates/stock/location.html:78 msgid "Location Details" msgstr "" -#: stock/templates/stock/location.html:66 +#: stock/templates/stock/location.html:83 msgid "Location Path" msgstr "" -#: stock/templates/stock/location.html:71 +#: stock/templates/stock/location.html:88 msgid "Location Description" msgstr "" -#: stock/templates/stock/location.html:76 +#: stock/templates/stock/location.html:93 msgid "Sublocations" msgstr "" -#: stock/templates/stock/location.html:81 -#: stock/templates/stock/location.html:96 +#: stock/templates/stock/location.html:98 +#: stock/templates/stock/location.html:113 #: templates/InvenTree/search_stock_items.html:6 templates/stats.html:48 -#: templates/stats.html:57 users/models.py:31 +#: templates/stats.html:57 users/models.py:35 msgid "Stock Items" msgstr "" -#: stock/templates/stock/location.html:86 +#: stock/templates/stock/location.html:103 msgid "Stock Details" msgstr "" -#: stock/templates/stock/location.html:91 +#: stock/templates/stock/location.html:108 #: templates/InvenTree/search_stock_location.html:6 templates/stats.html:52 -#: users/models.py:30 +#: users/models.py:34 msgid "Stock Locations" msgstr "" @@ -4364,7 +4411,7 @@ msgstr "" msgid "The following stock items will be uninstalled" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1248 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1343 msgid "Convert Stock Item" msgstr "" @@ -4396,197 +4443,194 @@ msgstr "" msgid "Installed Items" msgstr "" -#: stock/views.py:122 +#: stock/views.py:125 msgid "Edit Stock Location" msgstr "" -#: stock/views.py:147 +#: stock/views.py:233 stock/views.py:1333 stock/views.py:1446 +#: stock/views.py:1813 +msgid "Owner is required (ownership control is enabled)" +msgstr "" + +#: stock/views.py:248 msgid "Stock Location QR code" msgstr "" -#: stock/views.py:166 +#: stock/views.py:267 msgid "Add Stock Item Attachment" msgstr "" -#: stock/views.py:213 +#: stock/views.py:314 msgid "Edit Stock Item Attachment" msgstr "" -#: stock/views.py:230 +#: stock/views.py:331 msgid "Delete Stock Item Attachment" msgstr "" -#: stock/views.py:247 +#: stock/views.py:348 msgid "Assign to Customer" msgstr "" -#: stock/views.py:257 +#: stock/views.py:358 msgid "Customer must be specified" msgstr "" -#: stock/views.py:281 +#: stock/views.py:382 msgid "Return to Stock" msgstr "" -#: stock/views.py:291 +#: stock/views.py:392 msgid "Specify a valid location" msgstr "" -#: stock/views.py:302 +#: stock/views.py:403 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:313 +#: stock/views.py:414 msgid "Delete All Test Data" msgstr "" -#: stock/views.py:329 +#: stock/views.py:430 msgid "Confirm test data deletion" msgstr "" -#: stock/views.py:349 +#: stock/views.py:450 msgid "Add Test Result" msgstr "" -#: stock/views.py:390 +#: stock/views.py:491 msgid "Edit Test Result" msgstr "" -#: stock/views.py:408 +#: stock/views.py:509 msgid "Delete Test Result" msgstr "" -#: stock/views.py:420 -msgid "Select Test Report Template" -msgstr "" - -#: stock/views.py:450 -msgid "Select valid template" -msgstr "" - -#: stock/views.py:503 +#: stock/views.py:518 msgid "Stock Export Options" msgstr "" -#: stock/views.py:625 +#: stock/views.py:640 msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:651 +#: stock/views.py:666 msgid "Install Stock Item" msgstr "" -#: stock/views.py:751 +#: stock/views.py:766 msgid "Uninstall Stock Items" msgstr "" -#: stock/views.py:859 +#: stock/views.py:874 msgid "Uninstalled stock items" msgstr "" -#: stock/views.py:884 +#: stock/views.py:899 msgid "Adjust Stock" msgstr "" -#: stock/views.py:994 +#: stock/views.py:1009 msgid "Move Stock Items" msgstr "" -#: stock/views.py:995 +#: stock/views.py:1010 msgid "Count Stock Items" msgstr "" -#: stock/views.py:996 +#: stock/views.py:1011 msgid "Remove From Stock" msgstr "" -#: stock/views.py:997 +#: stock/views.py:1012 msgid "Add Stock Items" msgstr "" -#: stock/views.py:998 +#: stock/views.py:1013 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:1026 +#: stock/views.py:1041 msgid "Must enter integer value" msgstr "" -#: stock/views.py:1031 +#: stock/views.py:1046 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:1038 +#: stock/views.py:1053 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:1117 +#: stock/views.py:1132 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:1132 +#: stock/views.py:1147 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:1145 +#: stock/views.py:1160 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:1173 +#: stock/views.py:1200 msgid "No items were moved" msgstr "" -#: stock/views.py:1176 +#: stock/views.py:1203 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1195 +#: stock/views.py:1222 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1207 +#: stock/views.py:1234 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1298 +#: stock/views.py:1463 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1392 templates/js/build.js:210 +#: stock/views.py:1557 templates/js/build.js:210 msgid "Create new Stock Item" msgstr "" -#: stock/views.py:1500 +#: stock/views.py:1700 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1577 +#: stock/views.py:1782 msgid "Quantity cannot be negative" msgstr "" -#: stock/views.py:1663 +#: stock/views.py:1882 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1677 +#: stock/views.py:1896 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1689 +#: stock/views.py:1908 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1708 +#: stock/views.py:1927 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1718 +#: stock/views.py:1937 msgid "Add Stock Tracking Entry" msgstr "" @@ -4745,7 +4789,7 @@ msgstr "" msgid "Stock Settings" msgstr "" -#: templates/InvenTree/settings/stock.html:13 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:33 msgid "Stock Options" msgstr "" @@ -4864,23 +4908,23 @@ msgstr "" msgid "Submit Bug Report" msgstr "" -#: templates/attachment_table.html:7 +#: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "" -#: templates/attachment_table.html:17 +#: templates/attachment_table.html:15 msgid "File" msgstr "" -#: templates/attachment_table.html:18 +#: templates/attachment_table.html:16 msgid "Comment" msgstr "" -#: templates/attachment_table.html:19 +#: templates/attachment_table.html:17 msgid "Uploaded" msgstr "" -#: templates/attachment_table.html:37 +#: templates/attachment_table.html:35 msgid "Delete attachment" msgstr "" @@ -4969,43 +5013,43 @@ msgstr "" msgid "Optional" msgstr "" -#: templates/js/bom.js:252 +#: templates/js/bom.js:251 msgid "No pricing available" msgstr "" -#: templates/js/bom.js:304 templates/js/build.js:571 +#: templates/js/bom.js:302 templates/js/build.js:571 msgid "Actions" msgstr "" -#: templates/js/bom.js:312 +#: templates/js/bom.js:310 msgid "Validate BOM Item" msgstr "" -#: templates/js/bom.js:314 +#: templates/js/bom.js:312 msgid "This line has been validated" msgstr "" -#: templates/js/bom.js:316 +#: templates/js/bom.js:314 msgid "Edit BOM Item" msgstr "" -#: templates/js/bom.js:318 +#: templates/js/bom.js:316 msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:395 templates/js/build.js:305 +#: templates/js/bom.js:393 templates/js/build.js:305 msgid "No BOM items found" msgstr "" -#: templates/js/bom.js:541 +#: templates/js/bom.js:539 msgid "INACTIVE" msgstr "" -#: templates/js/bom.js:555 +#: templates/js/bom.js:553 msgid "Uses" msgstr "" -#: templates/js/bom.js:566 +#: templates/js/bom.js:564 msgid "No matching parts found" msgstr "" @@ -5025,7 +5069,7 @@ msgstr "" msgid "Delete build output" msgstr "" -#: templates/js/build.js:209 templates/stock_table.html:13 +#: templates/js/build.js:209 templates/stock_table.html:18 msgid "New Stock Item" msgstr "" @@ -5041,7 +5085,7 @@ msgstr "" msgid "Build stock" msgstr "" -#: templates/js/build.js:582 templates/stock_table.html:26 +#: templates/js/build.js:582 templates/stock_table.html:42 msgid "Order stock" msgstr "" @@ -5085,7 +5129,7 @@ msgstr "" msgid "Assembled part" msgstr "" -#: templates/js/label.js:10 +#: templates/js/label.js:10 templates/js/report.js:89 msgid "Select Stock Items" msgstr "" @@ -5113,11 +5157,15 @@ msgstr "" msgid "No labels found which match selected stock location(s)" msgstr "" -#: templates/js/label.js:141 +#: templates/js/label.js:142 templates/js/report.js:38 +msgid "stock items selected" +msgstr "" + +#: templates/js/label.js:150 templates/js/report.js:46 msgid "Select Label" msgstr "" -#: templates/js/label.js:156 +#: templates/js/label.js:165 msgid "Select Label Template" msgstr "" @@ -5223,7 +5271,7 @@ msgstr "" msgid "Order is overdue" msgstr "" -#: templates/js/order.js:193 templates/js/stock.js:816 +#: templates/js/order.js:193 templates/js/stock.js:844 msgid "Date" msgstr "" @@ -5260,7 +5308,7 @@ msgid "No parts found" msgstr "" #: templates/js/part.js:343 templates/js/stock.js:473 -#: templates/js/stock.js:1163 +#: templates/js/stock.js:1191 msgid "Select" msgstr "" @@ -5300,6 +5348,22 @@ msgstr "" msgid "This test is defined for a parent part" msgstr "" +#: templates/js/report.js:61 +msgid "Select Test Report Template" +msgstr "" + +#: templates/js/report.js:90 +msgid "Stock item(s) must be selected before printing reports" +msgstr "" + +#: templates/js/report.js:107 +msgid "No Reports Found" +msgstr "" + +#: templates/js/report.js:108 +msgid "No report templates found which match selected stock item(s)" +msgstr "" + #: templates/js/stock.js:37 msgid "PASS" msgstr "" @@ -5392,39 +5456,39 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:732 +#: templates/js/stock.js:760 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:747 +#: templates/js/stock.js:775 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:761 +#: templates/js/stock.js:789 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:762 +#: templates/js/stock.js:790 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:882 +#: templates/js/stock.js:910 msgid "No user information" msgstr "" -#: templates/js/stock.js:1002 +#: templates/js/stock.js:1030 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1101 +#: templates/js/stock.js:1129 msgid "Serial" msgstr "" -#: templates/js/stock.js:1194 templates/js/table_filters.js:131 +#: templates/js/stock.js:1222 templates/js/table_filters.js:131 msgid "Installed" msgstr "" -#: templates/js/stock.js:1219 +#: templates/js/stock.js:1247 msgid "Install item" msgstr "" @@ -5593,7 +5657,7 @@ msgstr "" msgid "InvenTree server issues detected" msgstr "" -#: templates/navbar.html:63 users/models.py:27 +#: templates/navbar.html:63 users/models.py:31 msgid "Admin" msgstr "" @@ -5633,51 +5697,59 @@ msgstr "" msgid "Issues detected" msgstr "" -#: templates/stock_table.html:6 +#: templates/stock_table.html:12 msgid "Export Stock Information" msgstr "" -#: templates/stock_table.html:20 +#: templates/stock_table.html:23 +msgid "Printing Actions" +msgstr "" + +#: templates/stock_table.html:27 msgid "Print labels" msgstr "" -#: templates/stock_table.html:22 +#: templates/stock_table.html:28 +msgid "Print test reports" +msgstr "" + +#: templates/stock_table.html:38 msgid "Add to selected stock items" msgstr "" -#: templates/stock_table.html:23 +#: templates/stock_table.html:39 msgid "Remove from selected stock items" msgstr "" -#: templates/stock_table.html:24 +#: templates/stock_table.html:40 msgid "Stocktake selected stock items" msgstr "" -#: templates/stock_table.html:25 +#: templates/stock_table.html:41 msgid "Move selected stock items" msgstr "" -#: templates/stock_table.html:25 +#: templates/stock_table.html:41 msgid "Move stock" msgstr "" -#: templates/stock_table.html:26 +#: templates/stock_table.html:42 msgid "Order selected items" msgstr "" -#: templates/stock_table.html:27 +#: templates/stock_table.html:43 msgid "Change status" msgstr "" -#: templates/stock_table.html:27 +#: templates/stock_table.html:43 msgid "Change stock status" msgstr "" -#: templates/stock_table.html:30 +#: templates/stock_table.html:46 msgid "Delete selected items" msgstr "" -#: templates/stock_table.html:30 +#: templates/stock_table.html:46 msgid "Delete Stock" msgstr "" @@ -5705,38 +5777,38 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:142 +#: users/models.py:147 msgid "Permission set" msgstr "" -#: users/models.py:150 +#: users/models.py:155 msgid "Group" msgstr "" -#: users/models.py:153 +#: users/models.py:158 msgid "View" msgstr "" -#: users/models.py:153 +#: users/models.py:158 msgid "Permission to view items" msgstr "" -#: users/models.py:155 +#: users/models.py:160 msgid "Add" msgstr "" -#: users/models.py:155 +#: users/models.py:160 msgid "Permission to add items" msgstr "" -#: users/models.py:157 +#: users/models.py:162 msgid "Change" msgstr "" -#: users/models.py:157 +#: users/models.py:162 msgid "Permissions to edit items" msgstr "" -#: users/models.py:159 +#: users/models.py:164 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po index 7389af937b..b983bde6a4 100644 --- a/InvenTree/locale/es/LC_MESSAGES/django.po +++ b/InvenTree/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-14 23:57+1100\n" +"POT-Creation-Date: 2021-01-18 23:24+1100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -55,7 +55,7 @@ msgid "Select Category" msgstr "" #: InvenTree/helpers.py:361 order/models.py:232 order/models.py:330 -#: stock/views.py:1573 +#: stock/views.py:1778 msgid "Invalid quantity provided" msgstr "" @@ -95,7 +95,7 @@ msgstr "" msgid "File comment" msgstr "" -#: InvenTree/models.py:68 templates/js/stock.js:873 +#: InvenTree/models.py:68 templates/js/stock.js:901 msgid "User" msgstr "" @@ -108,22 +108,26 @@ msgstr "" msgid "Description (optional)" msgstr "" -#: InvenTree/settings.py:439 +#: InvenTree/settings.py:454 msgid "English" msgstr "" -#: InvenTree/settings.py:440 -msgid "German" -msgstr "" - -#: InvenTree/settings.py:441 +#: InvenTree/settings.py:455 msgid "French" msgstr "" -#: InvenTree/settings.py:442 +#: InvenTree/settings.py:456 +msgid "German" +msgstr "" + +#: InvenTree/settings.py:457 msgid "Polish" msgstr "" +#: InvenTree/settings.py:458 +msgid "Turkish" +msgstr "" + #: InvenTree/status.py:24 msgid "Celery worker check failed" msgstr "" @@ -302,7 +306,7 @@ msgstr "" #: build/forms.py:78 build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:83 -#: build/templates/build/detail.html:29 common/models.py:596 +#: build/templates/build/detail.html:29 common/models.py:603 #: company/forms.py:112 company/templates/company/supplier_part_pricing.html:75 #: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:179 @@ -310,13 +314,13 @@ msgstr "" #: order/templates/order/sales_order_detail.html:156 #: part/templates/part/allocation.html:16 #: part/templates/part/allocation.html:49 -#: part/templates/part/sale_prices.html:82 stock/forms.py:304 -#: stock/templates/stock/item_base.html:40 -#: stock/templates/stock/item_base.html:46 -#: stock/templates/stock/item_base.html:214 +#: part/templates/part/sale_prices.html:82 stock/forms.py:306 +#: stock/templates/stock/item_base.html:51 +#: stock/templates/stock/item_base.html:57 +#: stock/templates/stock/item_base.html:234 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:338 -#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:864 -#: templates/js/stock.js:1103 +#: templates/js/bom.js:195 templates/js/build.js:420 templates/js/stock.js:892 +#: templates/js/stock.js:1131 msgid "Quantity" msgstr "" @@ -324,7 +328,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:83 stock/forms.py:116 +#: build/forms.py:83 stock/forms.py:117 msgid "Serial numbers" msgstr "" @@ -381,7 +385,7 @@ msgstr "" #: build/models.py:62 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:11 #: order/templates/order/so_tabs.html:9 part/templates/part/tabs.html:31 -#: templates/InvenTree/settings/tabs.html:28 users/models.py:32 +#: templates/InvenTree/settings/tabs.html:28 users/models.py:36 msgid "Build Orders" msgstr "" @@ -402,10 +406,10 @@ msgstr "" #: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 #: templates/InvenTree/search.html:147 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:180 -#: templates/js/bom.js:549 templates/js/build.js:664 templates/js/company.js:56 +#: templates/js/bom.js:547 templates/js/build.js:664 templates/js/company.js:56 #: templates/js/order.js:180 templates/js/order.js:274 templates/js/part.js:188 #: templates/js/part.js:271 templates/js/part.js:391 templates/js/part.js:572 -#: templates/js/stock.js:511 templates/js/stock.js:845 +#: templates/js/stock.js:511 templates/js/stock.js:873 msgid "Description" msgstr "" @@ -430,10 +434,10 @@ msgstr "" #: order/templates/order/receive_parts.html:19 part/models.py:316 #: part/templates/part/part_app_base.html:7 part/templates/part/related.html:26 #: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133 -#: templates/js/barcode.js:336 templates/js/bom.js:153 templates/js/bom.js:534 +#: templates/js/barcode.js:336 templates/js/bom.js:153 templates/js/bom.js:532 #: templates/js/build.js:669 templates/js/company.js:138 #: templates/js/part.js:252 templates/js/part.js:357 templates/js/stock.js:485 -#: templates/js/stock.js:1175 +#: templates/js/stock.js:1203 msgid "Part" msgstr "" @@ -491,7 +495,7 @@ msgstr "" msgid "Build status code" msgstr "" -#: build/models.py:194 stock/models.py:412 +#: build/models.py:194 stock/models.py:418 msgid "Batch Code" msgstr "" @@ -507,11 +511,11 @@ msgstr "" #: company/templates/company/supplier_part_base.html:68 #: company/templates/company/supplier_part_detail.html:24 #: part/templates/part/detail.html:80 part/templates/part/part_base.html:102 -#: stock/models.py:406 stock/templates/stock/item_base.html:297 +#: stock/models.py:412 stock/templates/stock/item_base.html:317 msgid "External Link" msgstr "" -#: build/models.py:220 part/models.py:705 stock/models.py:408 +#: build/models.py:220 part/models.py:705 stock/models.py:414 msgid "Link to external URL" msgstr "" @@ -519,10 +523,10 @@ msgstr "" #: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18 #: order/templates/order/purchase_order_detail.html:213 #: order/templates/order/so_tabs.html:23 part/models.py:831 -#: part/templates/part/tabs.html:73 stock/forms.py:313 stock/forms.py:345 -#: stock/forms.py:373 stock/models.py:478 stock/models.py:1544 +#: part/templates/part/tabs.html:73 stock/forms.py:315 stock/forms.py:347 +#: stock/forms.py:375 stock/models.py:484 stock/models.py:1554 #: stock/templates/stock/tabs.html:26 templates/js/barcode.js:391 -#: templates/js/bom.js:295 templates/js/stock.js:127 templates/js/stock.js:618 +#: templates/js/bom.js:293 templates/js/stock.js:127 templates/js/stock.js:623 msgid "Notes" msgstr "" @@ -653,8 +657,8 @@ msgid "" "The following stock items will be allocated to the specified build output" msgstr "" -#: build/templates/build/auto_allocate.html:18 stock/forms.py:343 -#: stock/templates/stock/item_base.html:244 +#: build/templates/build/auto_allocate.html:18 stock/forms.py:345 +#: stock/templates/stock/item_base.html:264 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:183 templates/js/barcode.js:337 #: templates/js/build.js:434 templates/js/stock.js:597 @@ -682,8 +686,8 @@ msgstr "" #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:35 #: part/templates/part/category.html:13 part/templates/part/part_base.html:32 -#: stock/templates/stock/item_base.html:97 -#: stock/templates/stock/location.html:12 +#: stock/templates/stock/item_base.html:114 +#: stock/templates/stock/location.html:24 msgid "Admin view" msgstr "" @@ -721,10 +725,10 @@ msgstr "" #: build/templates/build/build_base.html:88 #: build/templates/build/detail.html:57 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:343 templates/InvenTree/search.html:175 +#: stock/templates/stock/item_base.html:363 templates/InvenTree/search.html:175 #: templates/js/barcode.js:42 templates/js/build.js:697 #: templates/js/order.js:185 templates/js/order.js:279 -#: templates/js/stock.js:584 templates/js/stock.js:1111 +#: templates/js/stock.js:584 templates/js/stock.js:1139 msgid "Status" msgstr "" @@ -752,7 +756,7 @@ msgstr "" #: order/templates/order/sales_order_notes.html:10 #: order/templates/order/sales_order_ship.html:25 #: part/templates/part/allocation.html:27 -#: stock/templates/stock/item_base.html:238 templates/js/order.js:240 +#: stock/templates/stock/item_base.html:258 templates/js/order.js:240 msgid "Sales Order" msgstr "" @@ -844,7 +848,7 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:44 stock/forms.py:371 +#: build/templates/build/detail.html:44 stock/forms.py:373 msgid "Destination" msgstr "" @@ -853,8 +857,8 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:68 -#: stock/templates/stock/item_base.html:262 templates/js/stock.js:592 -#: templates/js/stock.js:1118 templates/js/table_filters.js:80 +#: stock/templates/stock/item_base.html:282 templates/js/stock.js:592 +#: templates/js/stock.js:1146 templates/js/table_filters.js:80 #: templates/js/table_filters.js:161 msgid "Batch" msgstr "" @@ -953,7 +957,7 @@ msgstr "" msgid "Create Build Output" msgstr "" -#: build/views.py:207 stock/models.py:887 stock/views.py:1594 +#: build/views.py:207 stock/models.py:897 stock/views.py:1804 msgid "Serial numbers already exist" msgstr "" @@ -969,7 +973,7 @@ msgstr "" msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:303 build/views.py:388 stock/views.py:330 +#: build/views.py:303 build/views.py:388 stock/views.py:431 msgid "Check the confirmation box" msgstr "" @@ -1041,7 +1045,7 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:847 templates/js/bom.js:221 templates/js/build.js:519 +#: build/views.py:847 templates/js/bom.js:220 templates/js/build.js:519 #: templates/js/build.js:758 msgid "Available" msgstr "" @@ -1063,7 +1067,7 @@ msgid "Add Build Order Attachment" msgstr "" #: build/views.py:1060 order/views.py:113 order/views.py:166 part/views.py:170 -#: stock/views.py:179 +#: stock/views.py:280 msgid "Added attachment" msgstr "" @@ -1079,7 +1083,7 @@ msgstr "" msgid "Delete Attachment" msgstr "" -#: build/views.py:1123 order/views.py:242 order/views.py:257 stock/views.py:237 +#: build/views.py:1123 order/views.py:242 order/views.py:257 stock/views.py:338 msgid "Deleted attachment" msgstr "" @@ -1155,7 +1159,7 @@ msgstr "" msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:115 part/templates/part/detail.html:155 stock/forms.py:255 +#: common/models.py:115 part/templates/part/detail.html:155 stock/forms.py:257 #: templates/js/table_filters.js:23 templates/js/table_filters.js:270 msgid "Template" msgstr "" @@ -1262,71 +1266,79 @@ msgid "Allow building with expired stock" msgstr "" #: common/models.py:200 -msgid "Build Order Reference Prefix" +msgid "Stock Ownership Control" msgstr "" #: common/models.py:201 -msgid "Prefix value for build order reference" -msgstr "" - -#: common/models.py:206 -msgid "Build Order Reference Regex" +msgid "Enable ownership control over stock locations and items" msgstr "" #: common/models.py:207 +msgid "Build Order Reference Prefix" +msgstr "" + +#: common/models.py:208 +msgid "Prefix value for build order reference" +msgstr "" + +#: common/models.py:213 +msgid "Build Order Reference Regex" +msgstr "" + +#: common/models.py:214 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:211 +#: common/models.py:218 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:212 +#: common/models.py:219 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:217 +#: common/models.py:224 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:218 +#: common/models.py:225 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:441 +#: common/models.py:448 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:443 +#: common/models.py:450 msgid "Settings value" msgstr "" -#: common/models.py:500 +#: common/models.py:507 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:510 +#: common/models.py:517 msgid "Value must be an integer value" msgstr "" -#: common/models.py:524 +#: common/models.py:531 msgid "Key string must be unique" msgstr "" -#: common/models.py:597 company/forms.py:113 +#: common/models.py:604 company/forms.py:113 msgid "Price break quantity" msgstr "" -#: common/models.py:605 company/templates/company/supplier_part_pricing.html:80 -#: part/templates/part/sale_prices.html:87 templates/js/bom.js:246 +#: common/models.py:612 company/templates/company/supplier_part_pricing.html:80 +#: part/templates/part/sale_prices.html:87 templates/js/bom.js:245 msgid "Price" msgstr "" -#: common/models.py:606 +#: common/models.py:613 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:629 +#: common/models.py:636 msgid "Default" msgstr "" @@ -1427,8 +1439,8 @@ msgstr "" msgid "Currency" msgstr "" -#: company/models.py:313 stock/models.py:360 -#: stock/templates/stock/item_base.html:194 +#: company/models.py:313 stock/models.py:366 +#: stock/templates/stock/item_base.html:214 msgid "Base Part" msgstr "" @@ -1441,7 +1453,7 @@ msgstr "" #: company/templates/company/supplier_part_detail.html:21 #: order/templates/order/order_base.html:89 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170 -#: stock/templates/stock/item_base.html:304 templates/js/company.js:48 +#: stock/templates/stock/item_base.html:324 templates/js/company.js:48 #: templates/js/company.js:164 templates/js/order.js:167 msgid "Supplier" msgstr "" @@ -1537,8 +1549,8 @@ msgid "Uses default currency" msgstr "" #: company/templates/company/detail.html:62 -#: order/templates/order/sales_order_base.html:89 stock/models.py:395 -#: stock/models.py:396 stock/templates/stock/item_base.html:221 +#: order/templates/order/sales_order_base.html:89 stock/models.py:401 +#: stock/models.py:402 stock/templates/stock/item_base.html:241 #: templates/js/company.js:40 templates/js/order.js:261 msgid "Customer" msgstr "" @@ -1554,13 +1566,12 @@ msgstr "" #: company/templates/company/detail_part.html:18 #: order/templates/order/purchase_order_detail.html:68 -#: part/templates/part/supplier.html:14 templates/js/stock.js:995 +#: part/templates/part/supplier.html:14 templates/js/stock.js:1023 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_part.html:23 #: part/templates/part/category.html:120 part/templates/part/supplier.html:17 -#: templates/stock_table.html:18 msgid "Options" msgstr "" @@ -1578,7 +1589,8 @@ msgid "Delete Parts" msgstr "" #: company/templates/company/detail_part.html:63 -#: part/templates/part/category.html:116 templates/js/stock.js:989 +#: part/templates/part/bom.html:182 part/templates/part/category.html:116 +#: templates/js/stock.js:1017 msgid "New Part" msgstr "" @@ -1612,7 +1624,6 @@ msgstr "" #: company/templates/company/supplier_part_stock.html:33 #: part/templates/part/bom.html:63 part/templates/part/category.html:112 #: part/templates/part/category.html:126 part/templates/part/stock.html:51 -#: templates/stock_table.html:7 msgid "Export" msgstr "" @@ -1635,7 +1646,7 @@ msgstr "" #: order/templates/order/purchase_orders.html:13 #: part/templates/part/orders.html:9 part/templates/part/tabs.html:48 #: templates/InvenTree/settings/tabs.html:31 templates/navbar.html:33 -#: users/models.py:33 +#: users/models.py:37 msgid "Purchase Orders" msgstr "" @@ -1655,7 +1666,7 @@ msgstr "" #: order/templates/order/sales_orders.html:13 #: part/templates/part/sales_orders.html:9 part/templates/part/tabs.html:56 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:42 -#: users/models.py:34 +#: users/models.py:38 msgid "Sales Orders" msgstr "" @@ -1670,8 +1681,8 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:6 -#: company/templates/company/supplier_part_base.html:19 stock/models.py:369 -#: stock/templates/stock/item_base.html:309 templates/js/company.js:180 +#: company/templates/company/supplier_part_base.html:19 stock/models.py:375 +#: stock/templates/stock/item_base.html:329 templates/js/company.js:180 msgid "Supplier Part" msgstr "" @@ -1712,7 +1723,7 @@ msgid "Pricing Information" msgstr "" #: company/templates/company/supplier_part_pricing.html:17 company/views.py:486 -#: part/templates/part/sale_prices.html:14 part/views.py:2565 +#: part/templates/part/sale_prices.html:14 part/views.py:2558 msgid "Add Price Break" msgstr "" @@ -1741,7 +1752,7 @@ msgstr "" #: company/templates/company/supplier_part_tabs.html:8 #: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18 -#: stock/templates/stock/location.html:17 templates/InvenTree/search.html:155 +#: stock/templates/stock/location.html:29 templates/InvenTree/search.html:155 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:192 #: templates/js/part.js:418 templates/js/stock.js:519 templates/navbar.html:22 msgid "Stock" @@ -1756,7 +1767,7 @@ msgstr "" #: part/templates/part/cat_link.html:7 part/templates/part/category.html:94 #: part/templates/part/category_tabs.html:6 #: templates/InvenTree/settings/tabs.html:22 templates/navbar.html:19 -#: templates/stats.html:35 templates/stats.html:44 users/models.py:29 +#: templates/stats.html:35 templates/stats.html:44 users/models.py:33 msgid "Parts" msgstr "" @@ -1825,7 +1836,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:295 templates/js/stock.js:996 +#: company/views.py:295 templates/js/stock.js:1024 msgid "Create new Supplier Part" msgstr "" @@ -1833,19 +1844,19 @@ msgstr "" msgid "Delete Supplier Part" msgstr "" -#: company/views.py:492 part/views.py:2571 +#: company/views.py:492 part/views.py:2564 msgid "Added new price break" msgstr "" -#: company/views.py:548 part/views.py:2615 +#: company/views.py:548 part/views.py:2608 msgid "Edit Price Break" msgstr "" -#: company/views.py:564 part/views.py:2631 +#: company/views.py:564 part/views.py:2624 msgid "Delete Price Break" msgstr "" -#: label/api.py:171 +#: label/api.py:171 report/api.py:161 msgid "Must provide valid StockItem(s)" msgstr "" @@ -1865,7 +1876,7 @@ msgstr "" msgid "Label description" msgstr "" -#: label/models.py:83 stock/forms.py:198 +#: label/models.py:83 stock/forms.py:200 msgid "Label" msgstr "" @@ -1980,8 +1991,8 @@ msgstr "" msgid "Date order was completed" msgstr "" -#: order/models.py:230 order/models.py:328 part/views.py:1504 -#: stock/models.py:259 stock/models.py:871 +#: order/models.py:230 order/models.py:328 part/views.py:1506 +#: stock/models.py:265 stock/models.py:881 msgid "Quantity must be greater than zero" msgstr "" @@ -2019,7 +2030,7 @@ msgstr "" #: order/models.py:607 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 -#: stock/templates/stock/item_base.html:276 templates/js/order.js:145 +#: stock/templates/stock/item_base.html:296 templates/js/order.js:145 msgid "Purchase Order" msgstr "" @@ -2031,8 +2042,8 @@ msgstr "" msgid "Number of items received" msgstr "" -#: order/models.py:630 stock/models.py:488 -#: stock/templates/stock/item_base.html:283 +#: order/models.py:630 stock/models.py:494 +#: stock/templates/stock/item_base.html:303 msgid "Purchase Price" msgstr "" @@ -2190,13 +2201,13 @@ msgstr "" #: order/templates/order/purchase_order_detail.html:39 #: order/templates/order/purchase_order_detail.html:119 #: part/templates/part/category.html:173 part/templates/part/category.html:215 -#: templates/js/stock.js:642 templates/js/stock.js:1001 +#: templates/js/stock.js:657 templates/js/stock.js:1029 msgid "New Location" msgstr "" #: order/templates/order/purchase_order_detail.html:40 #: order/templates/order/purchase_order_detail.html:120 -#: stock/templates/stock/location.html:22 +#: stock/templates/stock/location.html:35 msgid "Create new stock location" msgstr "" @@ -2275,8 +2286,8 @@ msgid "Sales Order Items" msgstr "" #: order/templates/order/sales_order_detail.html:72 -#: order/templates/order/sales_order_detail.html:154 stock/models.py:400 -#: stock/templates/stock/item_base.html:208 templates/js/build.js:418 +#: order/templates/order/sales_order_detail.html:154 stock/models.py:406 +#: stock/templates/stock/item_base.html:228 templates/js/build.js:418 msgid "Serial Number" msgstr "" @@ -2508,11 +2519,11 @@ msgstr "" msgid "Error reading BOM file (incorrect row size)" msgstr "" -#: part/forms.py:71 stock/forms.py:261 +#: part/forms.py:71 stock/forms.py:263 msgid "File Format" msgstr "" -#: part/forms.py:71 stock/forms.py:261 +#: part/forms.py:71 stock/forms.py:263 msgid "Select output file format" msgstr "" @@ -2643,7 +2654,7 @@ msgstr "" #: part/models.py:78 part/templates/part/category.html:18 #: part/templates/part/category.html:89 templates/stats.html:39 -#: users/models.py:28 +#: users/models.py:32 msgid "Part Categories" msgstr "" @@ -2885,56 +2896,56 @@ msgstr "" msgid "Default Parameter Value" msgstr "" -#: part/models.py:1865 +#: part/models.py:1862 msgid "Select parent part" msgstr "" -#: part/models.py:1873 +#: part/models.py:1870 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:1879 +#: part/models.py:1876 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:1881 +#: part/models.py:1878 msgid "This BOM item is optional" msgstr "" -#: part/models.py:1884 +#: part/models.py:1881 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:1887 +#: part/models.py:1884 msgid "BOM item reference" msgstr "" -#: part/models.py:1890 +#: part/models.py:1887 msgid "BOM item notes" msgstr "" -#: part/models.py:1892 +#: part/models.py:1889 msgid "BOM line checksum" msgstr "" -#: part/models.py:1963 part/views.py:1510 part/views.py:1562 -#: stock/models.py:249 +#: part/models.py:1960 part/views.py:1512 part/views.py:1564 +#: stock/models.py:255 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:1972 part/models.py:1974 +#: part/models.py:1969 part/models.py:1971 msgid "Sub part must be specified" msgstr "" -#: part/models.py:1977 +#: part/models.py:1974 msgid "BOM Item" msgstr "" -#: part/models.py:2098 +#: part/models.py:2095 msgid "Select Related Part" msgstr "" -#: part/models.py:2130 +#: part/models.py:2127 msgid "" "Error creating relationship: check that the part is not related to itself " "and that the relationship is unique" @@ -2954,10 +2965,10 @@ msgstr "" #: part/templates/part/allocation.html:28 #: part/templates/part/allocation.html:45 #: stock/templates/stock/item_base.html:8 -#: stock/templates/stock/item_base.html:72 -#: stock/templates/stock/item_base.html:291 +#: stock/templates/stock/item_base.html:89 +#: stock/templates/stock/item_base.html:311 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:751 -#: templates/js/stock.js:834 templates/js/stock.js:1094 +#: templates/js/stock.js:862 templates/js/stock.js:1122 msgid "Stock Item" msgstr "" @@ -2965,6 +2976,14 @@ msgstr "" msgid "Part Attachments" msgstr "" +#: part/templates/part/bom-delete.html:6 +msgid "Are you sure you want to delete this BOM item?" +msgstr "" + +#: part/templates/part/bom-delete.html:8 +msgid "Deleting this entry will remove the BOM row from the following part" +msgstr "" + #: part/templates/part/bom.html:13 msgid "Bill of Materials" msgstr "" @@ -3022,7 +3041,7 @@ msgstr "" msgid "Validate" msgstr "" -#: part/templates/part/bom.html:62 part/views.py:1801 +#: part/templates/part/bom.html:62 part/views.py:1803 msgid "Export Bill of Materials" msgstr "" @@ -3034,6 +3053,11 @@ msgstr "" msgid "All selected BOM items will be deleted" msgstr "" +#: part/templates/part/bom.html:183 part/views.py:594 +#: templates/js/stock.js:1018 +msgid "Create New Part" +msgstr "" + #: part/templates/part/bom_duplicate.html:13 msgid "This part already has a Bill of Materials" msgstr "" @@ -3089,6 +3113,15 @@ msgstr "" msgid "Select Part" msgstr "" +#: part/templates/part/bom_upload/select_parts.html:52 +msgid "Remove row" +msgstr "" + +#: part/templates/part/bom_upload/select_parts.html:59 +#: part/templates/part/category.html:115 +msgid "Create new part" +msgstr "" + #: part/templates/part/bom_upload/upload_file.html:13 msgid "Step 1 - Select BOM File" msgstr "" @@ -3122,7 +3155,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:24 part/views.py:2192 +#: part/templates/part/category.html:24 part/views.py:2194 msgid "Create new part category" msgstr "" @@ -3158,10 +3191,6 @@ msgstr "" msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:115 -msgid "Create new part" -msgstr "" - #: part/templates/part/category.html:123 msgid "Set category" msgstr "" @@ -3174,7 +3203,7 @@ msgstr "" msgid "Export Data" msgstr "" -#: part/templates/part/category.html:174 templates/js/stock.js:643 +#: part/templates/part/category.html:174 templates/js/stock.js:658 msgid "Create new location" msgstr "" @@ -3190,7 +3219,7 @@ msgstr "" msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:216 stock/views.py:1276 +#: part/templates/part/category.html:216 stock/views.py:1371 msgid "Create new Stock Location" msgstr "" @@ -3198,10 +3227,12 @@ msgstr "" msgid "Parametric Table" msgstr "" +#: part/templates/part/copy_part.html:14 #: part/templates/part/create_part.html:11 msgid "Possible Matching Parts" msgstr "" +#: part/templates/part/copy_part.html:15 #: part/templates/part/create_part.html:12 msgid "The new part may be a duplicate of these existing parts" msgstr "" @@ -3316,13 +3347,13 @@ msgstr "" msgid "New Parameter" msgstr "" -#: part/templates/part/params.html:25 stock/models.py:1531 +#: part/templates/part/params.html:25 stock/models.py:1541 #: templates/InvenTree/settings/header.html:8 templates/js/stock.js:123 msgid "Value" msgstr "" #: part/templates/part/params.html:41 part/templates/part/related.html:41 -#: part/templates/part/supplier.html:19 users/models.py:159 +#: part/templates/part/supplier.html:19 users/models.py:164 msgid "Delete" msgstr "" @@ -3352,20 +3383,20 @@ msgid "Star this part" msgstr "" #: part/templates/part/part_base.html:49 -#: stock/templates/stock/item_base.html:108 -#: stock/templates/stock/location.html:29 +#: stock/templates/stock/item_base.html:125 +#: stock/templates/stock/location.html:43 msgid "Barcode actions" msgstr "" #: part/templates/part/part_base.html:51 -#: stock/templates/stock/item_base.html:110 -#: stock/templates/stock/location.html:31 +#: stock/templates/stock/item_base.html:127 +#: stock/templates/stock/location.html:45 msgid "Show QR Code" msgstr "" #: part/templates/part/part_base.html:52 -#: stock/templates/stock/item_base.html:126 -#: stock/templates/stock/location.html:32 +#: stock/templates/stock/item_base.html:143 +#: stock/templates/stock/location.html:46 msgid "Print Label" msgstr "" @@ -3405,7 +3436,7 @@ msgstr "" msgid "Allocated to Sales Orders" msgstr "" -#: part/templates/part/part_base.html:160 templates/js/bom.js:262 +#: part/templates/part/part_base.html:160 templates/js/bom.js:260 msgid "Can Build" msgstr "" @@ -3461,7 +3492,7 @@ msgstr "" msgid "Part Stock" msgstr "" -#: part/templates/part/stock_count.html:7 templates/js/bom.js:230 +#: part/templates/part/stock_count.html:7 templates/js/bom.js:229 #: templates/js/part.js:442 msgid "No Stock" msgstr "" @@ -3502,7 +3533,7 @@ msgstr "" msgid "Used In" msgstr "" -#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:349 +#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:369 msgid "Tests" msgstr "" @@ -3518,6 +3549,14 @@ msgstr "" msgid "Assemblies" msgstr "" +#: part/templates/part/variant_part.html:9 +msgid "Create new part variant" +msgstr "" + +#: part/templates/part/variant_part.html:10 +msgid "Create a new variant of template" +msgstr "" + #: part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" @@ -3542,7 +3581,7 @@ msgstr "" msgid "Add part attachment" msgstr "" -#: part/views.py:209 templates/attachment_table.html:34 +#: part/views.py:209 templates/attachment_table.html:32 msgid "Edit attachment" msgstr "" @@ -3591,159 +3630,155 @@ msgstr "" msgid "Copied part" msgstr "" -#: part/views.py:529 part/views.py:667 +#: part/views.py:529 part/views.py:669 msgid "Possible matches exist - confirm creation of new part" msgstr "" -#: part/views.py:594 templates/js/stock.js:990 -msgid "Create New Part" -msgstr "" - #: part/views.py:601 msgid "Created new part" msgstr "" -#: part/views.py:836 +#: part/views.py:838 msgid "Part QR Code" msgstr "" -#: part/views.py:855 +#: part/views.py:857 msgid "Upload Part Image" msgstr "" -#: part/views.py:863 part/views.py:900 +#: part/views.py:865 part/views.py:902 msgid "Updated part image" msgstr "" -#: part/views.py:872 +#: part/views.py:874 msgid "Select Part Image" msgstr "" -#: part/views.py:903 +#: part/views.py:905 msgid "Part image not found" msgstr "" -#: part/views.py:914 +#: part/views.py:916 msgid "Edit Part Properties" msgstr "" -#: part/views.py:945 +#: part/views.py:947 msgid "Duplicate BOM" msgstr "" -#: part/views.py:976 +#: part/views.py:978 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:997 +#: part/views.py:999 msgid "Validate BOM" msgstr "" -#: part/views.py:1020 +#: part/views.py:1022 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1031 +#: part/views.py:1033 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1165 +#: part/views.py:1167 msgid "No BOM file provided" msgstr "" -#: part/views.py:1513 +#: part/views.py:1515 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1538 part/views.py:1541 +#: part/views.py:1540 part/views.py:1543 msgid "Select valid part" msgstr "" -#: part/views.py:1547 +#: part/views.py:1549 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1585 +#: part/views.py:1587 msgid "Select a part" msgstr "" -#: part/views.py:1591 +#: part/views.py:1593 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1595 +#: part/views.py:1597 msgid "Specify quantity" msgstr "" -#: part/views.py:1851 +#: part/views.py:1853 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:1860 +#: part/views.py:1862 msgid "Part was deleted" msgstr "" -#: part/views.py:1869 +#: part/views.py:1871 msgid "Part Pricing" msgstr "" -#: part/views.py:1983 +#: part/views.py:1985 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:1993 +#: part/views.py:1995 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2002 +#: part/views.py:2004 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2012 +#: part/views.py:2014 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2064 +#: part/views.py:2066 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2080 +#: part/views.py:2082 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2139 +#: part/views.py:2141 msgid "Edit Part Category" msgstr "" -#: part/views.py:2176 +#: part/views.py:2178 msgid "Delete Part Category" msgstr "" -#: part/views.py:2184 +#: part/views.py:2186 msgid "Part category was deleted" msgstr "" -#: part/views.py:2240 +#: part/views.py:2242 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2343 +#: part/views.py:2345 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2401 +#: part/views.py:2403 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2426 +#: part/views.py:2419 msgid "Create BOM Item" msgstr "" -#: part/views.py:2498 +#: part/views.py:2491 msgid "Edit BOM item" msgstr "" -#: part/views.py:2555 +#: part/views.py:2548 msgid "Confim BOM item deletion" msgstr "" @@ -3775,309 +3810,309 @@ msgstr "" msgid "Asset file description" msgstr "" -#: stock/forms.py:116 +#: stock/forms.py:117 msgid "Enter unique serial numbers (or leave blank)" msgstr "" -#: stock/forms.py:199 stock/forms.py:255 +#: stock/forms.py:201 stock/forms.py:257 msgid "Select test report template" msgstr "" -#: stock/forms.py:263 +#: stock/forms.py:265 msgid "Include stock items in sub locations" msgstr "" -#: stock/forms.py:298 +#: stock/forms.py:300 msgid "Stock item to install" msgstr "" -#: stock/forms.py:305 +#: stock/forms.py:307 msgid "Stock quantity to assign" msgstr "" -#: stock/forms.py:333 +#: stock/forms.py:335 msgid "Must not exceed available quantity" msgstr "" -#: stock/forms.py:343 +#: stock/forms.py:345 msgid "Destination location for uninstalled items" msgstr "" -#: stock/forms.py:345 +#: stock/forms.py:347 msgid "Add transaction note (optional)" msgstr "" -#: stock/forms.py:347 +#: stock/forms.py:349 msgid "Confirm uninstall" msgstr "" -#: stock/forms.py:347 +#: stock/forms.py:349 msgid "Confirm removal of installed stock items" msgstr "" -#: stock/forms.py:371 +#: stock/forms.py:373 msgid "Destination stock location" msgstr "" -#: stock/forms.py:373 +#: stock/forms.py:375 msgid "Add note (required)" msgstr "" -#: stock/forms.py:377 stock/views.py:848 stock/views.py:1046 +#: stock/forms.py:379 stock/views.py:863 stock/views.py:1061 msgid "Confirm stock adjustment" msgstr "" -#: stock/forms.py:377 +#: stock/forms.py:379 msgid "Confirm movement of stock items" msgstr "" -#: stock/forms.py:379 +#: stock/forms.py:381 msgid "Set Default Location" msgstr "" -#: stock/forms.py:379 +#: stock/forms.py:381 msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:194 +#: stock/models.py:200 msgid "Created stock item" msgstr "" -#: stock/models.py:230 +#: stock/models.py:236 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:266 +#: stock/models.py:272 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:276 stock/models.py:285 +#: stock/models.py:282 stock/models.py:291 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:277 +#: stock/models.py:283 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:299 +#: stock/models.py:305 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:305 +#: stock/models.py:311 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:312 +#: stock/models.py:318 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:352 +#: stock/models.py:358 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:361 +#: stock/models.py:367 msgid "Base part" msgstr "" -#: stock/models.py:370 +#: stock/models.py:376 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:375 stock/templates/stock/stock_app_base.html:7 +#: stock/models.py:381 stock/templates/stock/stock_app_base.html:7 msgid "Stock Location" msgstr "" -#: stock/models.py:378 +#: stock/models.py:384 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:383 stock/templates/stock/item_base.html:229 +#: stock/models.py:389 stock/templates/stock/item_base.html:249 msgid "Installed In" msgstr "" -#: stock/models.py:386 +#: stock/models.py:392 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:402 +#: stock/models.py:408 msgid "Serial number for this item" msgstr "" -#: stock/models.py:414 +#: stock/models.py:420 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:418 +#: stock/models.py:424 msgid "Stock Quantity" msgstr "" -#: stock/models.py:427 +#: stock/models.py:433 msgid "Source Build" msgstr "" -#: stock/models.py:429 +#: stock/models.py:435 msgid "Build for this stock item" msgstr "" -#: stock/models.py:440 +#: stock/models.py:446 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:443 +#: stock/models.py:449 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:449 +#: stock/models.py:455 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:455 stock/templates/stock/item_base.html:316 +#: stock/models.py:461 stock/templates/stock/item_base.html:336 #: templates/js/stock.js:612 msgid "Expiry Date" msgstr "" -#: stock/models.py:456 +#: stock/models.py:462 msgid "" "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:469 +#: stock/models.py:475 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:479 stock/templates/stock/item_notes.html:14 +#: stock/models.py:485 stock/templates/stock/item_notes.html:14 #: stock/templates/stock/item_notes.html:30 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:489 +#: stock/models.py:495 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:589 +#: stock/models.py:599 msgid "Assigned to Customer" msgstr "" -#: stock/models.py:591 +#: stock/models.py:601 msgid "Manually assigned to customer" msgstr "" -#: stock/models.py:604 +#: stock/models.py:614 msgid "Returned from customer" msgstr "" -#: stock/models.py:606 +#: stock/models.py:616 msgid "Returned to location" msgstr "" -#: stock/models.py:731 +#: stock/models.py:741 msgid "Installed into stock item" msgstr "" -#: stock/models.py:739 +#: stock/models.py:749 msgid "Installed stock item" msgstr "" -#: stock/models.py:763 +#: stock/models.py:773 msgid "Uninstalled stock item" msgstr "" -#: stock/models.py:782 +#: stock/models.py:792 msgid "Uninstalled into location" msgstr "" -#: stock/models.py:862 +#: stock/models.py:872 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:868 +#: stock/models.py:878 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:874 +#: stock/models.py:884 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:877 +#: stock/models.py:887 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:880 +#: stock/models.py:890 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:912 +#: stock/models.py:922 msgid "Add serial number" msgstr "" -#: stock/models.py:915 +#: stock/models.py:925 #, python-brace-format msgid "Serialized {n} items" msgstr "" -#: stock/models.py:1026 +#: stock/models.py:1036 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1432 +#: stock/models.py:1442 msgid "Tracking entry title" msgstr "" -#: stock/models.py:1434 +#: stock/models.py:1444 msgid "Entry notes" msgstr "" -#: stock/models.py:1436 +#: stock/models.py:1446 msgid "Link to external page for further information" msgstr "" -#: stock/models.py:1496 +#: stock/models.py:1506 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1502 +#: stock/models.py:1512 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1519 +#: stock/models.py:1529 msgid "Test" msgstr "" -#: stock/models.py:1520 +#: stock/models.py:1530 msgid "Test name" msgstr "" -#: stock/models.py:1525 +#: stock/models.py:1535 msgid "Result" msgstr "" -#: stock/models.py:1526 templates/js/table_filters.js:172 +#: stock/models.py:1536 templates/js/table_filters.js:172 msgid "Test result" msgstr "" -#: stock/models.py:1532 +#: stock/models.py:1542 msgid "Test output value" msgstr "" -#: stock/models.py:1538 +#: stock/models.py:1548 msgid "Attachment" msgstr "" -#: stock/models.py:1539 +#: stock/models.py:1549 msgid "Test result attachment" msgstr "" -#: stock/models.py:1545 +#: stock/models.py:1555 msgid "Test notes" msgstr "" -#: stock/templates/stock/item.html:11 +#: stock/templates/stock/item.html:16 msgid "Stock Tracking Information" msgstr "" -#: stock/templates/stock/item.html:18 +#: stock/templates/stock/item.html:25 msgid "New Entry" msgstr "" @@ -4085,169 +4120,175 @@ msgstr "" msgid "Stock Item Attachments" msgstr "" -#: stock/templates/stock/item_base.html:20 +#: stock/templates/stock/item_base.html:24 +msgid "" +"You are not in the list of owners of this item. This stock item cannot be " +"edited." +msgstr "" + +#: stock/templates/stock/item_base.html:31 msgid "This stock item is in production and cannot be edited." msgstr "" -#: stock/templates/stock/item_base.html:21 +#: stock/templates/stock/item_base.html:32 msgid "Edit the stock item from the build view." msgstr "" -#: stock/templates/stock/item_base.html:34 +#: stock/templates/stock/item_base.html:45 msgid "This stock item has not passed all required tests" msgstr "" -#: stock/templates/stock/item_base.html:40 +#: stock/templates/stock/item_base.html:51 msgid "This stock item is allocated to Sales Order" msgstr "" -#: stock/templates/stock/item_base.html:46 +#: stock/templates/stock/item_base.html:57 msgid "This stock item is allocated to Build" msgstr "" -#: stock/templates/stock/item_base.html:52 +#: stock/templates/stock/item_base.html:63 msgid "" "This stock item is serialized - it has a unique serial number and the " "quantity cannot be adjusted." msgstr "" -#: stock/templates/stock/item_base.html:56 +#: stock/templates/stock/item_base.html:67 msgid "This stock item cannot be deleted as it has child items" msgstr "" -#: stock/templates/stock/item_base.html:60 +#: stock/templates/stock/item_base.html:71 msgid "" "This stock item will be automatically deleted when all stock is depleted." msgstr "" -#: stock/templates/stock/item_base.html:74 -#: stock/templates/stock/item_base.html:320 templates/js/table_filters.js:111 +#: stock/templates/stock/item_base.html:91 +#: stock/templates/stock/item_base.html:340 templates/js/table_filters.js:111 msgid "Expired" msgstr "" -#: stock/templates/stock/item_base.html:78 -#: stock/templates/stock/item_base.html:322 templates/js/table_filters.js:116 +#: stock/templates/stock/item_base.html:95 +#: stock/templates/stock/item_base.html:342 templates/js/table_filters.js:116 msgid "Stale" msgstr "" -#: stock/templates/stock/item_base.html:113 templates/js/barcode.js:283 +#: stock/templates/stock/item_base.html:130 templates/js/barcode.js:283 #: templates/js/barcode.js:288 msgid "Unlink Barcode" msgstr "" -#: stock/templates/stock/item_base.html:115 +#: stock/templates/stock/item_base.html:132 msgid "Link Barcode" msgstr "" -#: stock/templates/stock/item_base.html:123 -msgid "Document actions" +#: stock/templates/stock/item_base.html:140 +msgid "Printing actions" msgstr "" -#: stock/templates/stock/item_base.html:129 +#: stock/templates/stock/item_base.html:146 #: stock/templates/stock/item_tests.html:25 msgid "Test Report" msgstr "" -#: stock/templates/stock/item_base.html:137 +#: stock/templates/stock/item_base.html:156 msgid "Stock adjustment actions" msgstr "" -#: stock/templates/stock/item_base.html:141 -#: stock/templates/stock/location.html:41 templates/stock_table.html:24 +#: stock/templates/stock/item_base.html:160 +#: stock/templates/stock/location.html:57 templates/stock_table.html:40 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:142 templates/stock_table.html:22 +#: stock/templates/stock/item_base.html:161 templates/stock_table.html:38 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:143 templates/stock_table.html:23 +#: stock/templates/stock/item_base.html:162 templates/stock_table.html:39 msgid "Remove stock" msgstr "" -#: stock/templates/stock/item_base.html:145 +#: stock/templates/stock/item_base.html:164 msgid "Transfer stock" msgstr "" -#: stock/templates/stock/item_base.html:147 +#: stock/templates/stock/item_base.html:166 msgid "Serialize stock" msgstr "" -#: stock/templates/stock/item_base.html:151 +#: stock/templates/stock/item_base.html:170 msgid "Assign to customer" msgstr "" -#: stock/templates/stock/item_base.html:154 +#: stock/templates/stock/item_base.html:173 msgid "Return to stock" msgstr "" -#: stock/templates/stock/item_base.html:158 templates/js/stock.js:1131 +#: stock/templates/stock/item_base.html:177 templates/js/stock.js:1159 msgid "Uninstall stock item" msgstr "" -#: stock/templates/stock/item_base.html:158 +#: stock/templates/stock/item_base.html:177 msgid "Uninstall" msgstr "" -#: stock/templates/stock/item_base.html:167 -#: stock/templates/stock/location.html:38 +#: stock/templates/stock/item_base.html:186 +#: stock/templates/stock/location.html:54 msgid "Stock actions" msgstr "" -#: stock/templates/stock/item_base.html:170 +#: stock/templates/stock/item_base.html:189 msgid "Convert to variant" msgstr "" -#: stock/templates/stock/item_base.html:173 +#: stock/templates/stock/item_base.html:192 msgid "Duplicate stock item" msgstr "" -#: stock/templates/stock/item_base.html:175 +#: stock/templates/stock/item_base.html:194 msgid "Edit stock item" msgstr "" -#: stock/templates/stock/item_base.html:178 +#: stock/templates/stock/item_base.html:197 msgid "Delete stock item" msgstr "" -#: stock/templates/stock/item_base.html:189 +#: stock/templates/stock/item_base.html:209 msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:248 templates/js/build.js:442 +#: stock/templates/stock/item_base.html:268 templates/js/build.js:442 msgid "No location set" msgstr "" -#: stock/templates/stock/item_base.html:255 +#: stock/templates/stock/item_base.html:275 msgid "Barcode Identifier" msgstr "" -#: stock/templates/stock/item_base.html:269 templates/js/build.js:642 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:642 #: templates/navbar.html:25 msgid "Build" msgstr "" -#: stock/templates/stock/item_base.html:290 +#: stock/templates/stock/item_base.html:310 msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:320 +#: stock/templates/stock/item_base.html:340 msgid "This StockItem expired on" msgstr "" -#: stock/templates/stock/item_base.html:322 +#: stock/templates/stock/item_base.html:342 msgid "This StockItem expires on" msgstr "" -#: stock/templates/stock/item_base.html:329 +#: stock/templates/stock/item_base.html:349 templates/js/stock.js:618 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:334 +#: stock/templates/stock/item_base.html:354 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:338 +#: stock/templates/stock/item_base.html:358 msgid "No stocktake performed" msgstr "" @@ -4303,56 +4344,62 @@ msgstr "" msgid "Add Test Data" msgstr "" -#: stock/templates/stock/location.html:18 +#: stock/templates/stock/location.html:13 +msgid "" +"You are not in the list of owners of this location. This stock location " +"cannot be edited." +msgstr "" + +#: stock/templates/stock/location.html:30 msgid "All stock items" msgstr "" -#: stock/templates/stock/location.html:33 +#: stock/templates/stock/location.html:47 msgid "Check-in Items" msgstr "" -#: stock/templates/stock/location.html:47 +#: stock/templates/stock/location.html:63 msgid "Location actions" msgstr "" -#: stock/templates/stock/location.html:49 +#: stock/templates/stock/location.html:65 msgid "Edit location" msgstr "" -#: stock/templates/stock/location.html:51 +#: stock/templates/stock/location.html:67 msgid "Delete location" msgstr "" -#: stock/templates/stock/location.html:61 +#: stock/templates/stock/location.html:78 msgid "Location Details" msgstr "" -#: stock/templates/stock/location.html:66 +#: stock/templates/stock/location.html:83 msgid "Location Path" msgstr "" -#: stock/templates/stock/location.html:71 +#: stock/templates/stock/location.html:88 msgid "Location Description" msgstr "" -#: stock/templates/stock/location.html:76 +#: stock/templates/stock/location.html:93 msgid "Sublocations" msgstr "" -#: stock/templates/stock/location.html:81 -#: stock/templates/stock/location.html:96 +#: stock/templates/stock/location.html:98 +#: stock/templates/stock/location.html:113 #: templates/InvenTree/search_stock_items.html:6 templates/stats.html:48 -#: templates/stats.html:57 users/models.py:31 +#: templates/stats.html:57 users/models.py:35 msgid "Stock Items" msgstr "" -#: stock/templates/stock/location.html:86 +#: stock/templates/stock/location.html:103 msgid "Stock Details" msgstr "" -#: stock/templates/stock/location.html:91 +#: stock/templates/stock/location.html:108 #: templates/InvenTree/search_stock_location.html:6 templates/stats.html:52 -#: users/models.py:30 +#: users/models.py:34 msgid "Stock Locations" msgstr "" @@ -4364,7 +4411,7 @@ msgstr "" msgid "The following stock items will be uninstalled" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1248 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1343 msgid "Convert Stock Item" msgstr "" @@ -4396,197 +4443,194 @@ msgstr "" msgid "Installed Items" msgstr "" -#: stock/views.py:122 +#: stock/views.py:125 msgid "Edit Stock Location" msgstr "" -#: stock/views.py:147 +#: stock/views.py:233 stock/views.py:1333 stock/views.py:1446 +#: stock/views.py:1813 +msgid "Owner is required (ownership control is enabled)" +msgstr "" + +#: stock/views.py:248 msgid "Stock Location QR code" msgstr "" -#: stock/views.py:166 +#: stock/views.py:267 msgid "Add Stock Item Attachment" msgstr "" -#: stock/views.py:213 +#: stock/views.py:314 msgid "Edit Stock Item Attachment" msgstr "" -#: stock/views.py:230 +#: stock/views.py:331 msgid "Delete Stock Item Attachment" msgstr "" -#: stock/views.py:247 +#: stock/views.py:348 msgid "Assign to Customer" msgstr "" -#: stock/views.py:257 +#: stock/views.py:358 msgid "Customer must be specified" msgstr "" -#: stock/views.py:281 +#: stock/views.py:382 msgid "Return to Stock" msgstr "" -#: stock/views.py:291 +#: stock/views.py:392 msgid "Specify a valid location" msgstr "" -#: stock/views.py:302 +#: stock/views.py:403 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:313 +#: stock/views.py:414 msgid "Delete All Test Data" msgstr "" -#: stock/views.py:329 +#: stock/views.py:430 msgid "Confirm test data deletion" msgstr "" -#: stock/views.py:349 +#: stock/views.py:450 msgid "Add Test Result" msgstr "" -#: stock/views.py:390 +#: stock/views.py:491 msgid "Edit Test Result" msgstr "" -#: stock/views.py:408 +#: stock/views.py:509 msgid "Delete Test Result" msgstr "" -#: stock/views.py:420 -msgid "Select Test Report Template" -msgstr "" - -#: stock/views.py:450 -msgid "Select valid template" -msgstr "" - -#: stock/views.py:503 +#: stock/views.py:518 msgid "Stock Export Options" msgstr "" -#: stock/views.py:625 +#: stock/views.py:640 msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:651 +#: stock/views.py:666 msgid "Install Stock Item" msgstr "" -#: stock/views.py:751 +#: stock/views.py:766 msgid "Uninstall Stock Items" msgstr "" -#: stock/views.py:859 +#: stock/views.py:874 msgid "Uninstalled stock items" msgstr "" -#: stock/views.py:884 +#: stock/views.py:899 msgid "Adjust Stock" msgstr "" -#: stock/views.py:994 +#: stock/views.py:1009 msgid "Move Stock Items" msgstr "" -#: stock/views.py:995 +#: stock/views.py:1010 msgid "Count Stock Items" msgstr "" -#: stock/views.py:996 +#: stock/views.py:1011 msgid "Remove From Stock" msgstr "" -#: stock/views.py:997 +#: stock/views.py:1012 msgid "Add Stock Items" msgstr "" -#: stock/views.py:998 +#: stock/views.py:1013 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:1026 +#: stock/views.py:1041 msgid "Must enter integer value" msgstr "" -#: stock/views.py:1031 +#: stock/views.py:1046 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:1038 +#: stock/views.py:1053 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:1117 +#: stock/views.py:1132 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:1132 +#: stock/views.py:1147 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:1145 +#: stock/views.py:1160 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:1173 +#: stock/views.py:1200 msgid "No items were moved" msgstr "" -#: stock/views.py:1176 +#: stock/views.py:1203 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1195 +#: stock/views.py:1222 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1207 +#: stock/views.py:1234 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1298 +#: stock/views.py:1463 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1392 templates/js/build.js:210 +#: stock/views.py:1557 templates/js/build.js:210 msgid "Create new Stock Item" msgstr "" -#: stock/views.py:1500 +#: stock/views.py:1700 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1577 +#: stock/views.py:1782 msgid "Quantity cannot be negative" msgstr "" -#: stock/views.py:1663 +#: stock/views.py:1882 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1677 +#: stock/views.py:1896 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1689 +#: stock/views.py:1908 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1708 +#: stock/views.py:1927 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1718 +#: stock/views.py:1937 msgid "Add Stock Tracking Entry" msgstr "" @@ -4745,7 +4789,7 @@ msgstr "" msgid "Stock Settings" msgstr "" -#: templates/InvenTree/settings/stock.html:13 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:33 msgid "Stock Options" msgstr "" @@ -4864,23 +4908,23 @@ msgstr "" msgid "Submit Bug Report" msgstr "" -#: templates/attachment_table.html:7 +#: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "" -#: templates/attachment_table.html:17 +#: templates/attachment_table.html:15 msgid "File" msgstr "" -#: templates/attachment_table.html:18 +#: templates/attachment_table.html:16 msgid "Comment" msgstr "" -#: templates/attachment_table.html:19 +#: templates/attachment_table.html:17 msgid "Uploaded" msgstr "" -#: templates/attachment_table.html:37 +#: templates/attachment_table.html:35 msgid "Delete attachment" msgstr "" @@ -4969,43 +5013,43 @@ msgstr "" msgid "Optional" msgstr "" -#: templates/js/bom.js:252 +#: templates/js/bom.js:251 msgid "No pricing available" msgstr "" -#: templates/js/bom.js:304 templates/js/build.js:571 +#: templates/js/bom.js:302 templates/js/build.js:571 msgid "Actions" msgstr "" -#: templates/js/bom.js:312 +#: templates/js/bom.js:310 msgid "Validate BOM Item" msgstr "" -#: templates/js/bom.js:314 +#: templates/js/bom.js:312 msgid "This line has been validated" msgstr "" -#: templates/js/bom.js:316 +#: templates/js/bom.js:314 msgid "Edit BOM Item" msgstr "" -#: templates/js/bom.js:318 +#: templates/js/bom.js:316 msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:395 templates/js/build.js:305 +#: templates/js/bom.js:393 templates/js/build.js:305 msgid "No BOM items found" msgstr "" -#: templates/js/bom.js:541 +#: templates/js/bom.js:539 msgid "INACTIVE" msgstr "" -#: templates/js/bom.js:555 +#: templates/js/bom.js:553 msgid "Uses" msgstr "" -#: templates/js/bom.js:566 +#: templates/js/bom.js:564 msgid "No matching parts found" msgstr "" @@ -5025,7 +5069,7 @@ msgstr "" msgid "Delete build output" msgstr "" -#: templates/js/build.js:209 templates/stock_table.html:13 +#: templates/js/build.js:209 templates/stock_table.html:18 msgid "New Stock Item" msgstr "" @@ -5041,7 +5085,7 @@ msgstr "" msgid "Build stock" msgstr "" -#: templates/js/build.js:582 templates/stock_table.html:26 +#: templates/js/build.js:582 templates/stock_table.html:42 msgid "Order stock" msgstr "" @@ -5085,7 +5129,7 @@ msgstr "" msgid "Assembled part" msgstr "" -#: templates/js/label.js:10 +#: templates/js/label.js:10 templates/js/report.js:89 msgid "Select Stock Items" msgstr "" @@ -5113,11 +5157,15 @@ msgstr "" msgid "No labels found which match selected stock location(s)" msgstr "" -#: templates/js/label.js:141 +#: templates/js/label.js:142 templates/js/report.js:38 +msgid "stock items selected" +msgstr "" + +#: templates/js/label.js:150 templates/js/report.js:46 msgid "Select Label" msgstr "" -#: templates/js/label.js:156 +#: templates/js/label.js:165 msgid "Select Label Template" msgstr "" @@ -5223,7 +5271,7 @@ msgstr "" msgid "Order is overdue" msgstr "" -#: templates/js/order.js:193 templates/js/stock.js:816 +#: templates/js/order.js:193 templates/js/stock.js:844 msgid "Date" msgstr "" @@ -5260,7 +5308,7 @@ msgid "No parts found" msgstr "" #: templates/js/part.js:343 templates/js/stock.js:473 -#: templates/js/stock.js:1163 +#: templates/js/stock.js:1191 msgid "Select" msgstr "" @@ -5300,6 +5348,22 @@ msgstr "" msgid "This test is defined for a parent part" msgstr "" +#: templates/js/report.js:61 +msgid "Select Test Report Template" +msgstr "" + +#: templates/js/report.js:90 +msgid "Stock item(s) must be selected before printing reports" +msgstr "" + +#: templates/js/report.js:107 +msgid "No Reports Found" +msgstr "" + +#: templates/js/report.js:108 +msgid "No report templates found which match selected stock item(s)" +msgstr "" + #: templates/js/stock.js:37 msgid "PASS" msgstr "" @@ -5392,39 +5456,39 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:732 +#: templates/js/stock.js:760 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:747 +#: templates/js/stock.js:775 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:761 +#: templates/js/stock.js:789 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:762 +#: templates/js/stock.js:790 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:882 +#: templates/js/stock.js:910 msgid "No user information" msgstr "" -#: templates/js/stock.js:1002 +#: templates/js/stock.js:1030 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1101 +#: templates/js/stock.js:1129 msgid "Serial" msgstr "" -#: templates/js/stock.js:1194 templates/js/table_filters.js:131 +#: templates/js/stock.js:1222 templates/js/table_filters.js:131 msgid "Installed" msgstr "" -#: templates/js/stock.js:1219 +#: templates/js/stock.js:1247 msgid "Install item" msgstr "" @@ -5593,7 +5657,7 @@ msgstr "" msgid "InvenTree server issues detected" msgstr "" -#: templates/navbar.html:63 users/models.py:27 +#: templates/navbar.html:63 users/models.py:31 msgid "Admin" msgstr "" @@ -5633,51 +5697,59 @@ msgstr "" msgid "Issues detected" msgstr "" -#: templates/stock_table.html:6 +#: templates/stock_table.html:12 msgid "Export Stock Information" msgstr "" -#: templates/stock_table.html:20 +#: templates/stock_table.html:23 +msgid "Printing Actions" +msgstr "" + +#: templates/stock_table.html:27 msgid "Print labels" msgstr "" -#: templates/stock_table.html:22 +#: templates/stock_table.html:28 +msgid "Print test reports" +msgstr "" + +#: templates/stock_table.html:38 msgid "Add to selected stock items" msgstr "" -#: templates/stock_table.html:23 +#: templates/stock_table.html:39 msgid "Remove from selected stock items" msgstr "" -#: templates/stock_table.html:24 +#: templates/stock_table.html:40 msgid "Stocktake selected stock items" msgstr "" -#: templates/stock_table.html:25 +#: templates/stock_table.html:41 msgid "Move selected stock items" msgstr "" -#: templates/stock_table.html:25 +#: templates/stock_table.html:41 msgid "Move stock" msgstr "" -#: templates/stock_table.html:26 +#: templates/stock_table.html:42 msgid "Order selected items" msgstr "" -#: templates/stock_table.html:27 +#: templates/stock_table.html:43 msgid "Change status" msgstr "" -#: templates/stock_table.html:27 +#: templates/stock_table.html:43 msgid "Change stock status" msgstr "" -#: templates/stock_table.html:30 +#: templates/stock_table.html:46 msgid "Delete selected items" msgstr "" -#: templates/stock_table.html:30 +#: templates/stock_table.html:46 msgid "Delete Stock" msgstr "" @@ -5705,38 +5777,38 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:142 +#: users/models.py:147 msgid "Permission set" msgstr "" -#: users/models.py:150 +#: users/models.py:155 msgid "Group" msgstr "" -#: users/models.py:153 +#: users/models.py:158 msgid "View" msgstr "" -#: users/models.py:153 +#: users/models.py:158 msgid "Permission to view items" msgstr "" -#: users/models.py:155 +#: users/models.py:160 msgid "Add" msgstr "" -#: users/models.py:155 +#: users/models.py:160 msgid "Permission to add items" msgstr "" -#: users/models.py:157 +#: users/models.py:162 msgid "Change" msgstr "" -#: users/models.py:157 +#: users/models.py:162 msgid "Permissions to edit items" msgstr "" -#: users/models.py:159 +#: users/models.py:164 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index a45220c7ab..f35cc98d39 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -1856,9 +1856,6 @@ class BomItem(models.Model): self.clean() super().save(*args, **kwargs) - def get_absolute_url(self): - return reverse('bom-item-detail', kwargs={'pk': self.id}) - # A link to the parent part # Each part will get a reverse lookup field 'bom_items' part = models.ForeignKey(Part, on_delete=models.CASCADE, related_name='bom_items', diff --git a/InvenTree/part/templates/part/bom-delete.html b/InvenTree/part/templates/part/bom-delete.html index ffaf2c57e5..c2db77c040 100644 --- a/InvenTree/part/templates/part/bom-delete.html +++ b/InvenTree/part/templates/part/bom-delete.html @@ -1,10 +1,11 @@ {% extends "modal_delete_form.html" %} +{% load i18n %} {% block pre_form_content %} -Are you sure you want to delete this BOM item? +{% trans "Are you sure you want to delete this BOM item?" %}
-Deleting this entry will remove the BOM row from the following part: +{% trans "Deleting this entry will remove the BOM row from the following part" %}:
  • diff --git a/InvenTree/part/templates/part/bom-detail.html b/InvenTree/part/templates/part/bom-detail.html deleted file mode 100644 index 2c4fb7e09d..0000000000 --- a/InvenTree/part/templates/part/bom-detail.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends "base.html" %} - -{% block content %} - -

    BOM Item

    - - - - -
    Parent{{ item.part.full_name }}
    Child{{ item.sub_part.full_name }}
    Quantity{{ item.quantity }}
    - - - -{% endblock %} \ No newline at end of file diff --git a/InvenTree/part/templates/part/bom.html b/InvenTree/part/templates/part/bom.html index 0b24582220..515cae37a0 100644 --- a/InvenTree/part/templates/part/bom.html +++ b/InvenTree/part/templates/part/bom.html @@ -63,9 +63,9 @@ {% trans "Export" %} {% endif %} - -
    - +
    + +
    @@ -179,8 +179,8 @@ secondary: [ { field: 'sub_part', - label: 'New Part', - title: 'Create New Part', + label: '{% trans "New Part" %}', + title: '{% trans "Create New Part" %}', url: "{% url 'part-create' %}", }, ] diff --git a/InvenTree/part/templates/part/bom_upload/select_parts.html b/InvenTree/part/templates/part/bom_upload/select_parts.html index 1ee5e8821b..c36f828271 100644 --- a/InvenTree/part/templates/part/bom_upload/select_parts.html +++ b/InvenTree/part/templates/part/bom_upload/select_parts.html @@ -49,14 +49,14 @@ {% for row in bom_rows %} - {% add row.index 1 %} - + ${report_list} + + + + `; + + openModal({ + modal: modal, + }); + + modalEnable(modal, true); + modalSetTitle(modal, '{% trans "Select Test Report Template" %}'); + modalSetContent(modal, html); + + attachSelect(modal); + + modalSubmit(modal, function() { + + var label = $(modal).find('#id_report'); + + var pk = label.val(); + + closeModal(modal); + + if (options.success) { + options.success(pk); + } + }); + +} + + +function printTestReports(items, options={}) { + /** + * Print test reports for the provided stock item(s) + */ + + if (items.length == 0) { + showAlertDialog( + '{% trans "Select Stock Items" %}', + '{% trans "Stock item(s) must be selected before printing reports" %}' + ); + + return; + } + + // Request available labels from the server + inventreeGet( + '{% url "api-stockitem-testreport-list" %}', + { + enabled: true, + items: items, + }, + { + success: function(response) { + if (response.length == 0) { + showAlertDialog( + '{% trans "No Reports Found" %}', + '{% trans "No report templates found which match selected stock item(s)" %}', + ); + + return; + } + + // Select report template to print + selectTestReport( + response, + items, + { + success: function(pk) { + var href = `/api/report/test/${pk}/print/?`; + + items.forEach(function(item) { + href += `items[]=${item}&`; + }); + + window.location.href = href; + } + } + ); + } + } + ); +} \ No newline at end of file diff --git a/InvenTree/templates/js/stock.js b/InvenTree/templates/js/stock.js index 276be131f0..6c7bc3d873 100644 --- a/InvenTree/templates/js/stock.js +++ b/InvenTree/templates/js/stock.js @@ -625,9 +625,19 @@ function loadStockTable(table, options) { ], }); + /* if (options.buttons) { linkButtonsToSelection(table, options.buttons); } + */ + + linkButtonsToSelection( + table, + [ + '#stock-print-options', + '#stock-options', + ] + ); function stockAdjustment(action) { var items = $("#stock-table").bootstrapTable("getSelections"); @@ -665,6 +675,7 @@ function loadStockTable(table, options) { } // Automatically link button callbacks + $('#multi-item-print-label').click(function() { var selections = $('#stock-table').bootstrapTable('getSelections'); @@ -677,6 +688,18 @@ function loadStockTable(table, options) { printStockItemLabels(items); }); + $('#multi-item-print-test-report').click(function() { + var selections = $('#stock-table').bootstrapTable('getSelections'); + + var items = []; + + selections.forEach(function(item) { + items.push(item.pk); + }); + + printTestReports(items); + }) + $('#multi-item-stocktake').click(function() { stockAdjustment('count'); }); diff --git a/InvenTree/templates/stock_table.html b/InvenTree/templates/stock_table.html index 6731f8f69c..0542afef4d 100644 --- a/InvenTree/templates/stock_table.html +++ b/InvenTree/templates/stock_table.html @@ -1,23 +1,39 @@ {% load i18n %} +{% load inventree_extras %} + +{% setting_object 'STOCK_OWNERSHIP_CONTROL' as owner_control %} +{% if owner_control.value == "True" %} + {% authorized_owners location.owner as owners %} +{% endif %}
    - {% if read_only %} - {% else %} + + {% if owner_control.value == "True" and user in owners or user.is_superuser or owner_control.value == "False" %} {% if roles.stock.add %} - {% endif %} + {% if roles.stock.change or roles.stock.delete %}
    - + +
+ + {% endif %} + {% endif %} +
+
- {% endif %} - {% endif %} - -
-
diff --git a/InvenTree/users/admin.py b/InvenTree/users/admin.py index c84f1310ce..d8406bfddd 100644 --- a/InvenTree/users/admin.py +++ b/InvenTree/users/admin.py @@ -11,7 +11,7 @@ from django.contrib.auth.models import Group from django.contrib.auth.admin import UserAdmin from django.utils.safestring import mark_safe -from users.models import RuleSet +from users.models import RuleSet, Owner User = get_user_model() @@ -215,8 +215,17 @@ class InvenTreeUserAdmin(UserAdmin): ) +class OwnerAdmin(admin.ModelAdmin): + """ + Custom admin interface for the Owner model + """ + pass + + admin.site.unregister(Group) admin.site.register(Group, RoleGroupAdmin) admin.site.unregister(User) admin.site.register(User, InvenTreeUserAdmin) + +admin.site.register(Owner, OwnerAdmin) diff --git a/InvenTree/users/apps.py b/InvenTree/users/apps.py index 07e303c1be..1541b1aed4 100644 --- a/InvenTree/users/apps.py +++ b/InvenTree/users/apps.py @@ -16,6 +16,11 @@ class UsersConfig(AppConfig): except (OperationalError, ProgrammingError): pass + try: + self.update_owners() + except (OperationalError, ProgrammingError): + pass + def assign_permissions(self): from django.contrib.auth.models import Group @@ -31,3 +36,17 @@ class UsersConfig(AppConfig): for group in Group.objects.all(): update_group_roles(group) + + def update_owners(self): + + from django.contrib.auth import get_user_model + from django.contrib.auth.models import Group + from users.models import Owner + + # Create group owners + for group in Group.objects.all(): + Owner.create(group) + + # Create user owners + for user in get_user_model().objects.all(): + Owner.create(user) diff --git a/InvenTree/users/migrations/0005_owner_model.py b/InvenTree/users/migrations/0005_owner_model.py new file mode 100644 index 0000000000..01ef66d9a3 --- /dev/null +++ b/InvenTree/users/migrations/0005_owner_model.py @@ -0,0 +1,27 @@ +# Generated by Django 3.0.7 on 2021-01-11 18:54 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('users', '0004_auto_20210113_1909'), + ] + + operations = [ + migrations.CreateModel( + name='Owner', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('owner_id', models.PositiveIntegerField(blank=True, null=True)), + ('owner_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ], + ), + migrations.AddConstraint( + model_name='owner', + constraint=models.UniqueConstraint(fields=('owner_type', 'owner_id'), name='unique_owner'), + ), + ] diff --git a/InvenTree/users/models.py b/InvenTree/users/models.py index c9862e3aff..57cee2774f 100644 --- a/InvenTree/users/models.py +++ b/InvenTree/users/models.py @@ -1,12 +1,16 @@ # -*- coding: utf-8 -*- +from django.contrib.auth import get_user_model from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType +from django.db.models import UniqueConstraint, Q +from django.db.utils import IntegrityError from django.db import models from django.utils.translation import gettext_lazy as _ from django.dispatch import receiver -from django.db.models.signals import post_save +from django.db.models.signals import post_save, post_delete class RuleSet(models.Model): @@ -116,6 +120,7 @@ class RuleSet(models.Model): 'report_reportasset', 'report_testreport', 'part_partstar', + 'users_owner', # Third-party tables 'error_report_error', @@ -350,7 +355,7 @@ def update_group_roles(group, debug=False): print(f"Removing permission {perm} from group {group.name}") -@receiver(post_save, sender=Group) +@receiver(post_save, sender=Group, dispatch_uid='create_missing_rule_sets') def create_missing_rule_sets(sender, instance, **kwargs): """ Called *after* a Group object is saved. @@ -392,3 +397,151 @@ def check_user_role(user, role, permission): # No matching permissions found return False + + +class Owner(models.Model): + """ + The Owner class is a proxy for a Group or User instance. + Owner can be associated to any InvenTree model (part, stock, build, etc.) + + owner_type: Model type (Group or User) + owner_id: Group or User instance primary key + owner: Returns the Group or User instance combining the owner_type and owner_id fields + """ + + class Meta: + # Ensure all owners are unique + constraints = [ + UniqueConstraint(fields=['owner_type', 'owner_id'], + name='unique_owner') + ] + + owner_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True, blank=True) + + owner_id = models.PositiveIntegerField(null=True, blank=True) + + owner = GenericForeignKey('owner_type', 'owner_id') + + def __str__(self): + """ Defines the owner string representation """ + return f'{self.owner} ({self.owner_type.name})' + + @classmethod + def create(cls, obj): + """ Check if owner exist then create new owner entry """ + + # Check for existing owner + existing_owner = cls.get_owner(obj) + + if not existing_owner: + # Create new owner + try: + return cls.objects.create(owner=obj) + except IntegrityError: + return None + + return existing_owner + + @classmethod + def get_owner(cls, user_or_group): + """ Get owner instance for a group or user """ + + user_model = get_user_model() + owner = None + content_type_id = 0 + content_type_id_list = [ContentType.objects.get_for_model(Group).id, + ContentType.objects.get_for_model(user_model).id] + + # If instance type is obvious: set content type + if type(user_or_group) is Group: + content_type_id = content_type_id_list[0] + elif type(user_or_group) is get_user_model(): + content_type_id = content_type_id_list[1] + + if content_type_id: + try: + owner = Owner.objects.get(owner_id=user_or_group.id, + owner_type=content_type_id) + except Owner.DoesNotExist: + pass + else: + # Check whether user_or_group is a Group instance + try: + group = Group.objects.get(pk=user_or_group.id) + except Group.DoesNotExist: + group = None + + if group: + try: + owner = Owner.objects.get(owner_id=user_or_group.id, + owner_type=content_type_id_list[0]) + except Owner.DoesNotExist: + pass + + return owner + + # Check whether user_or_group is a User instance + try: + user = user_model.objects.get(pk=user_or_group.id) + except user_model.DoesNotExist: + user = None + + if user: + try: + owner = Owner.objects.get(owner_id=user_or_group.id, + owner_type=content_type_id_list[1]) + except Owner.DoesNotExist: + pass + + return owner + + return owner + + def get_related_owners(self, include_group=False): + """ + Get all owners "related" to an owner. + This method is useful to retrieve all "user-type" owners linked to a "group-type" owner + """ + + user_model = get_user_model() + related_owners = None + + if type(self.owner) is Group: + users = user_model.objects.filter(groups__name=self.owner.name) + + if include_group: + # Include "group-type" owner in the query + query = Q(owner_id__in=users, owner_type=ContentType.objects.get_for_model(user_model).id) | \ + Q(owner_id=self.owner.id, owner_type=ContentType.objects.get_for_model(Group).id) + else: + query = Q(owner_id__in=users, owner_type=ContentType.objects.get_for_model(user_model).id) + + related_owners = Owner.objects.filter(query) + + elif type(self.owner) is user_model: + related_owners = [self] + + return related_owners + + +@receiver(post_save, sender=Group, dispatch_uid='create_owner') +@receiver(post_save, sender=get_user_model(), dispatch_uid='create_owner') +def create_owner(sender, instance, **kwargs): + """ + Callback function to create a new owner instance + after either a new group or user instance is saved. + """ + + Owner.create(obj=instance) + + +@receiver(post_delete, sender=Group, dispatch_uid='delete_owner') +@receiver(post_delete, sender=get_user_model(), dispatch_uid='delete_owner') +def delete_owner(sender, instance, **kwargs): + """ + Callback function to delete an owner instance + after either a new group or user instance is deleted. + """ + + owner = Owner.get_owner(instance) + owner.delete() diff --git a/InvenTree/users/tests.py b/InvenTree/users/tests.py index e277422f71..895d0a84af 100644 --- a/InvenTree/users/tests.py +++ b/InvenTree/users/tests.py @@ -3,9 +3,10 @@ from __future__ import unicode_literals from django.test import TestCase from django.apps import apps +from django.contrib.auth import get_user_model from django.contrib.auth.models import Group -from users.models import RuleSet +from users.models import RuleSet, Owner class RuleSetModelTest(TestCase): @@ -157,3 +158,48 @@ class RuleSetModelTest(TestCase): # There should now not be any permissions assigned to this group self.assertEqual(group.permissions.count(), 0) + + +class OwnerModelTest(TestCase): + """ + Some simplistic tests to ensure the Owner model is setup correctly. + """ + + def setUp(self): + """ Add users and groups """ + + # Create a new user + self.user = get_user_model().objects.create_user( + username='john', + email='john@email.com', + password='custom123', + ) + + # Put the user into a new group + self.group = Group.objects.create(name='new_group') + self.user.groups.add(self.group) + + def test_owner(self): + + # Check that owner was created for user + user_as_owner = Owner.get_owner(self.user) + self.assertEqual(type(user_as_owner), Owner) + + # Check that owner was created for group + group_as_owner = Owner.get_owner(self.group) + self.assertEqual(type(group_as_owner), Owner) + + # Get related owners (user + group) + related_owners = group_as_owner.get_related_owners(include_group=True) + self.assertTrue(user_as_owner in related_owners) + self.assertTrue(group_as_owner in related_owners) + + # Delete user and verify owner was deleted too + self.user.delete() + user_as_owner = Owner.get_owner(self.user) + self.assertEqual(user_as_owner, None) + + # Delete group and verify owner was deleted too + self.group.delete() + group_as_owner = Owner.get_owner(self.group) + self.assertEqual(group_as_owner, None) diff --git a/tasks.py b/tasks.py index 69c53b83d4..77604eaf3a 100644 --- a/tasks.py +++ b/tasks.py @@ -186,6 +186,10 @@ def translate(c): manage(c, "makemessages -e py -e html -e js") manage(c, "compilemessages") + path = os.path.join('InvenTree', 'script', 'translation_stats.py') + + c.run(f'python {path}') + @task def style(c): """