diff --git a/InvenTree/InvenTree/context.py b/InvenTree/InvenTree/context.py index 3e9af2f751..e072f5a5ea 100644 --- a/InvenTree/InvenTree/context.py +++ b/InvenTree/InvenTree/context.py @@ -32,6 +32,7 @@ def health_status(request): status = { 'django_q_running': InvenTree.status.is_worker_running(), + 'email_configured': InvenTree.status.is_email_configured(), } all_healthy = True diff --git a/InvenTree/InvenTree/middleware.py b/InvenTree/InvenTree/middleware.py index a34df4b7bd..f30d77ad3b 100644 --- a/InvenTree/InvenTree/middleware.py +++ b/InvenTree/InvenTree/middleware.py @@ -52,6 +52,10 @@ class AuthRequiredMiddleware(object): if request.path_info.startswith('/static/'): authorized = True + # Unauthorized users can access the login page + elif request.path_info.startswith('/accounts/'): + authorized = True + elif 'Authorization' in request.headers.keys(): auth = request.headers['Authorization'].strip() diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 8b5400e374..1b84f0c51a 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -495,6 +495,51 @@ CURRENCIES = CONFIG.get( # TODO - Allow live web-based backends in the future EXCHANGE_BACKEND = 'InvenTree.exchange.InvenTreeManualExchangeBackend' +# Extract email settings from the config file +email_config = CONFIG.get('email', {}) + +EMAIL_BACKEND = get_setting( + 'django.core.mail.backends.smtp.EmailBackend', + email_config.get('backend', '') +) + +# Email backend settings +EMAIL_HOST = get_setting( + 'INVENTREE_EMAIL_HOST', + email_config.get('host', '') +) + +EMAIL_PORT = get_setting( + 'INVENTREE_EMAIL_PORT', + email_config.get('port', 25) +) + +EMAIL_HOST_USER = get_setting( + 'INVENTREE_EMAIL_USERNAME', + email_config.get('username', ''), +) + +EMAIL_HOST_PASSWORD = get_setting( + 'INVENTREE_EMAIL_PASSWORD', + email_config.get('password', ''), +) + +EMAIL_SUBJECT_PREFIX = '[InvenTree] ' + +EMAIL_USE_LOCALTIME = False + +EMAIL_USE_TLS = get_setting( + 'INVENTREE_EMAIL_TLS', + email_config.get('tls', False), +) + +EMAIL_USE_SSL = get_setting( + 'INVENTREE_EMAIL_SSL', + email_config.get('ssl', False), +) + +EMAIL_TIMEOUT = 60 + LOCALE_PATHS = ( os.path.join(BASE_DIR, 'locale/'), ) diff --git a/InvenTree/InvenTree/status.py b/InvenTree/InvenTree/status.py index 88acc69a7a..e9846e445a 100644 --- a/InvenTree/InvenTree/status.py +++ b/InvenTree/InvenTree/status.py @@ -11,6 +11,9 @@ from datetime import datetime, timedelta from django_q.models import Success from django_q.monitor import Stat +from django.conf import settings + + logger = logging.getLogger("inventree") @@ -43,6 +46,30 @@ def is_worker_running(**kwargs): return results.exists() +def is_email_configured(): + """ + Check if email backend is configured. + + NOTE: This does not check if the configuration is valid! + """ + + configured = True + + if not settings.EMAIL_HOST: + logger.warning("EMAIL_HOST is not configured") + configured = False + + if not settings.EMAIL_HOST_USER: + logger.warning("EMAIL_HOST_USER is not configured") + configured = False + + if not settings.EMAIL_HOST_PASSWORD: + logger.warning("EMAIL_HOST_PASSWORD is not configured") + configured = False + + return configured + + def check_system_health(**kwargs): """ Check that the InvenTree system is running OK. @@ -56,6 +83,10 @@ def check_system_health(**kwargs): result = False logger.warning(_("Background worker check failed")) + if not is_email_configured(): + result = False + logger.warning(_("Email backend not configured")) + if not result: logger.warning(_("InvenTree system health checks failed")) diff --git a/InvenTree/InvenTree/tasks.py b/InvenTree/InvenTree/tasks.py index 4829514f19..6c01e03aa6 100644 --- a/InvenTree/InvenTree/tasks.py +++ b/InvenTree/InvenTree/tasks.py @@ -51,6 +51,24 @@ def schedule_task(taskname, **kwargs): pass +def offload_task(taskname, *args, **kwargs): + """ + Create an AsyncTask. + This is different to a 'scheduled' task, + in that it only runs once! + """ + + try: + from django_q.tasks import AsyncTask + except (AppRegistryNotReady): + logger.warning("Could not offload task - app registry not ready") + return + + task = AsyncTask(taskname, *args, **kwargs) + + task.run() + + def heartbeat(): """ Simple task which runs at 5 minute intervals, @@ -141,3 +159,20 @@ def check_for_updates(): tag, None ) + + +def send_email(subject, body, recipients, from_email=None): + """ + Send an email with the specified subject and body, + to the specified recipients list. + """ + + if type(recipients) == str: + recipients = [recipients] + + offload_task( + 'django.core.mail.send_mail', + subject, body, + from_email, + recipients, + ) diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index 7c22639e65..88160e76c1 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -133,7 +133,7 @@ urlpatterns = [ url(r'^auth/', include('rest_framework.urls', namespace='rest_framework')), url(r'^login/?', auth_views.LoginView.as_view(), name='login'), - url(r'^logout/', auth_views.LogoutView.as_view(template_name='registration/logout.html'), name='logout'), + url(r'^logout/', auth_views.LogoutView.as_view(template_name='registration/logged_out.html'), name='logout'), url(r'^settings/', include(settings_urls)), @@ -143,6 +143,7 @@ urlpatterns = [ url(r'^admin/error_log/', include('error_report.urls')), url(r'^admin/shell/', include('django_admin_shell.urls')), url(r'^admin/', admin.site.urls, name='inventree-admin'), + url(r'accounts/', include('django.contrib.auth.urls')), url(r'^index/', IndexView.as_view(), name='index'), url(r'^search/', SearchView.as_view(), name='search'), diff --git a/InvenTree/config_template.yaml b/InvenTree/config_template.yaml index a64e6d42c0..e9f32f382e 100644 --- a/InvenTree/config_template.yaml +++ b/InvenTree/config_template.yaml @@ -63,6 +63,31 @@ currencies: - NZD - USD +# Email backend configuration +# Ref: https://docs.djangoproject.com/en/dev/topics/email/ +# Available options: +# host: Email server host address +# port: Email port +# username: Account username +# password: Account password +# prefix: Email subject prefix +# tls: Enable TLS support +# ssl: Enable SSL support + +# Alternatively, these options can all be set using environment variables, +# with the INVENTREE_EMAIL_ prefix: +# e.g. INVENTREE_EMAIL_HOST / INVENTREE_EMAIL_PORT / INVENTREE_EMAIL_USERNAME +# Refer to the InvenTree documentation for more information + +email: + # backend: 'django.core.mail.backends.smtp.EmailBackend' + host: '' + port: 25 + username: '' + password: '' + tls: False + ssl: False + # Set debug to False to run in production mode # Use the environment variable INVENTREE_DEBUG debug: True diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po index 41a8cc7ab5..e5368acac8 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-04-04 20:24+0000\n" +"POT-Creation-Date: 2021-04-11 22:07+0000\n" "PO-Revision-Date: 2021-03-28 17:47+0200\n" "Last-Translator: Andreas Kaiser , Matthias " "MAIR\n" @@ -18,15 +18,15 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.4.2\n" -#: InvenTree/api.py:62 +#: InvenTree/api.py:64 msgid "API endpoint not found" msgstr "API-Endpunkt nicht gefunden" -#: InvenTree/api.py:108 +#: InvenTree/api.py:110 msgid "No action specified" msgstr "Keine Aktion angegeben" -#: InvenTree/api.py:122 +#: InvenTree/api.py:124 msgid "No matching action found" msgstr "Keine passende Aktion gefunden" @@ -126,7 +126,7 @@ msgstr "Datei-Kommentar" #: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1888 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:960 +#: templates/js/stock.js:964 msgid "User" msgstr "Benutzer" @@ -142,7 +142,7 @@ msgid "Name" msgstr "Name" #: InvenTree/models.py:114 build/models.py:134 -#: build/templates/build/detail.html:21 company/models.py:361 +#: build/templates/build/detail.html:21 company/models.py:365 #: company/templates/company/detail.html:26 #: company/templates/company/supplier_part_base.html:70 #: company/templates/company/supplier_part_detail.html:31 label/models.py:108 @@ -157,8 +157,8 @@ msgstr "Name" #: templates/js/build.js:677 templates/js/build.js:944 #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:168 templates/js/part.js:251 -#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:552 -#: templates/js/stock.js:934 +#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:554 +#: templates/js/stock.js:938 msgid "Description" msgstr "Beschreibung" @@ -170,31 +170,31 @@ msgstr "Beschreibung (optional)" msgid "parent" msgstr "Eltern" -#: InvenTree/settings.py:430 +#: InvenTree/settings.py:480 msgid "English" msgstr "Englisch" -#: InvenTree/settings.py:431 +#: InvenTree/settings.py:481 msgid "French" msgstr "Französisch" -#: InvenTree/settings.py:432 +#: InvenTree/settings.py:482 msgid "German" msgstr "Deutsch" -#: InvenTree/settings.py:433 +#: InvenTree/settings.py:483 msgid "Polish" msgstr "Polnisch" -#: InvenTree/settings.py:434 +#: InvenTree/settings.py:484 msgid "Turkish" msgstr "Türkisch" -#: InvenTree/status.py:24 -msgid "Celery worker check failed" -msgstr "Celery Worker Check fehlgeschlagen" +#: InvenTree/status.py:57 +msgid "Background worker check failed" +msgstr "Hintergrund-Prozess-Kontrolle fehlgeschlagen" -#: InvenTree/status.py:27 +#: InvenTree/status.py:60 msgid "InvenTree system health checks failed" msgstr "InvenTree Status-Überprüfung fehlgeschlagen" @@ -310,7 +310,7 @@ msgstr "Passwort eingeben" msgid "Password fields must match" msgstr "Passwörter stimmen nicht überein" -#: InvenTree/views.py:887 templates/navbar.html:83 +#: InvenTree/views.py:887 templates/navbar.html:85 msgid "System Information" msgstr "Systeminformationen" @@ -406,7 +406,7 @@ msgstr "Zieldatum für Bauauftrag-Fertigstellung." #: stock/templates/stock/item_base.html:240 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 #: templates/js/bom.js:205 templates/js/build.js:420 templates/js/build.js:954 -#: templates/js/stock.js:952 templates/js/stock.js:1190 +#: templates/js/stock.js:956 templates/js/stock.js:1194 msgid "Quantity" msgstr "Anzahl" @@ -452,7 +452,7 @@ msgstr "Bauauftrag als vollständig markieren" #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:244 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:434 -#: templates/js/stock.js:637 +#: templates/js/stock.js:641 msgid "Location" msgstr "Lagerort" @@ -495,7 +495,7 @@ msgstr "Bauauftrag" #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 #: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:181 +#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:182 #: templates/InvenTree/search.html:169 #: templates/InvenTree/settings/tabs.html:31 users/models.py:41 msgid "Build Orders" @@ -529,7 +529,7 @@ msgstr "Bauauftrag, zu dem dieser Bauauftrag zugwiesen ist" #: build/models.py:152 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:86 -#: build/templates/build/detail.html:26 company/models.py:535 +#: build/templates/build/detail.html:26 company/models.py:539 #: order/models.py:637 order/models.py:669 #: order/templates/order/order_wizard/select_parts.html:30 #: order/templates/order/purchase_order_detail.html:156 @@ -548,8 +548,8 @@ msgstr "Bauauftrag, zu dem dieser Bauauftrag zugwiesen ist" #: templates/js/barcode.js:362 templates/js/bom.js:163 #: templates/js/build.js:681 templates/js/build.js:921 #: templates/js/company.js:138 templates/js/part.js:232 -#: templates/js/part.js:337 templates/js/stock.js:524 -#: templates/js/stock.js:1262 +#: templates/js/part.js:337 templates/js/stock.js:523 +#: templates/js/stock.js:1266 msgid "Part" msgstr "Teil" @@ -667,7 +667,7 @@ msgid "Link to external URL" msgstr "Link zu einer externen URL" #: build/models.py:261 build/templates/build/navbar.html:59 -#: company/models.py:129 company/models.py:368 +#: company/models.py:133 company/models.py:372 #: company/templates/company/navbar.html:59 #: company/templates/company/navbar.html:62 order/models.py:123 #: order/models.py:597 order/templates/order/po_navbar.html:29 @@ -681,7 +681,7 @@ msgstr "Link zu einer externen URL" #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 #: stock/models.py:496 stock/models.py:1555 stock/models.py:1665 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:329 templates/js/stock.js:128 templates/js/stock.js:667 +#: templates/js/bom.js:329 templates/js/stock.js:128 templates/js/stock.js:671 msgid "Notes" msgstr "Notizen" @@ -757,7 +757,7 @@ msgstr "Bauauftrag starten um Teile zuzuweisen" #: stock/templates/stock/item_base.html:89 #: stock/templates/stock/item_base.html:324 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771 -#: templates/js/stock.js:923 templates/js/stock.js:1181 +#: templates/js/stock.js:927 templates/js/stock.js:1185 msgid "Stock Item" msgstr "BestandsObjekt" @@ -919,7 +919,7 @@ msgstr "Bau-Status" #: stock/templates/stock/item_base.html:376 templates/InvenTree/search.html:236 #: templates/js/barcode.js:119 templates/js/build.js:710 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:624 templates/js/stock.js:1198 +#: templates/js/stock.js:628 templates/js/stock.js:1202 msgid "Status" msgstr "Status" @@ -1056,8 +1056,8 @@ msgid "Destination location not specified" msgstr "Ziel-Lagerort nicht angegeben" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:288 templates/js/stock.js:632 -#: templates/js/stock.js:1205 templates/js/table_filters.js:85 +#: stock/templates/stock/item_base.html:288 templates/js/stock.js:636 +#: templates/js/stock.js:1209 templates/js/table_filters.js:85 #: templates/js/table_filters.js:179 msgid "Batch" msgstr "Los" @@ -1323,7 +1323,7 @@ msgstr "InvenTree Instanzname" msgid "String descriptor for the server instance" msgstr "Kurze Beschreibung der Instanz" -#: common/models.py:62 company/models.py:96 company/models.py:97 +#: common/models.py:62 company/models.py:95 company/models.py:96 msgid "Company name" msgstr "Firmenname" @@ -1675,12 +1675,12 @@ msgstr "Angegebener Wert nicht erlaubt" msgid "Supplied value must be a boolean" msgstr "Angegebener Wert muss ein Wahrheitswert sein" -#: company/forms.py:37 company/models.py:139 +#: company/forms.py:37 company/models.py:143 #: company/templates/company/detail.html:40 msgid "Currency" msgstr "Währung" -#: company/forms.py:38 company/models.py:141 +#: company/forms.py:38 company/models.py:145 msgid "Default currency used for this company" msgstr "Standard-Währung für diese Firma" @@ -1700,104 +1700,104 @@ msgstr "Einzelpreis" msgid "Single quantity price" msgstr "Preis für eine Einheit" -#: company/models.py:99 +#: company/models.py:100 msgid "Company description" msgstr "Firmenbeschreibung" -#: company/models.py:99 +#: company/models.py:101 msgid "Description of the company" msgstr "Firmenbeschreibung" -#: company/models.py:101 company/templates/company/company_base.html:70 +#: company/models.py:105 company/templates/company/company_base.html:70 #: company/templates/company/detail.html:31 templates/js/company.js:60 msgid "Website" msgstr "Website" -#: company/models.py:101 +#: company/models.py:105 msgid "Company website URL" msgstr "Firmenwebsite Adresse/URL" -#: company/models.py:104 company/templates/company/company_base.html:77 +#: company/models.py:108 company/templates/company/company_base.html:77 msgid "Address" msgstr "Adresse" -#: company/models.py:105 +#: company/models.py:109 msgid "Company address" msgstr "Firmenadresse" -#: company/models.py:108 +#: company/models.py:112 msgid "Phone number" msgstr "Kontakt-Tel." -#: company/models.py:109 +#: company/models.py:113 msgid "Contact phone number" msgstr "Kontakt-Telefon" -#: company/models.py:112 company/templates/company/company_base.html:91 +#: company/models.py:116 company/templates/company/company_base.html:91 msgid "Email" msgstr "Email" -#: company/models.py:112 +#: company/models.py:116 msgid "Contact email address" msgstr "Kontakt-Email" -#: company/models.py:115 company/templates/company/company_base.html:98 +#: company/models.py:119 company/templates/company/company_base.html:98 msgid "Contact" msgstr "Kontakt" -#: company/models.py:116 +#: company/models.py:120 msgid "Point of contact" msgstr "Anlaufstelle" -#: company/models.py:118 company/models.py:355 order/models.py:103 +#: company/models.py:122 company/models.py:359 order/models.py:103 #: part/models.py:743 #: report/templates/report/inventree_build_order_base.html:165 #: stock/models.py:1557 templates/js/company.js:208 templates/js/part.js:430 msgid "Link" msgstr "Link" -#: company/models.py:118 +#: company/models.py:122 msgid "Link to external company information" msgstr "Link auf externe Firmeninformation" -#: company/models.py:126 part/models.py:753 +#: company/models.py:130 part/models.py:753 msgid "Image" msgstr "Bild" -#: company/models.py:131 +#: company/models.py:135 msgid "is customer" msgstr "ist Kunde" -#: company/models.py:131 +#: company/models.py:135 msgid "Do you sell items to this company?" msgstr "Verkaufen Sie Teile an diese Firma?" -#: company/models.py:133 +#: company/models.py:137 msgid "is supplier" msgstr "ist Zulieferer" -#: company/models.py:133 +#: company/models.py:137 msgid "Do you purchase items from this company?" msgstr "Kaufen Sie Teile von dieser Firma?" -#: company/models.py:135 +#: company/models.py:139 msgid "is manufacturer" msgstr "ist Hersteller" -#: company/models.py:135 +#: company/models.py:139 msgid "Does this company manufacture parts?" msgstr "Produziert diese Firma Teile?" -#: company/models.py:315 stock/models.py:371 +#: company/models.py:319 stock/models.py:371 #: stock/templates/stock/item_base.html:220 msgid "Base Part" msgstr "Basisteil" -#: company/models.py:319 order/views.py:1372 +#: company/models.py:323 order/views.py:1372 msgid "Select part" msgstr "Teil auswählen" -#: company/models.py:325 company/templates/company/detail.html:60 +#: company/models.py:329 company/templates/company/detail.html:60 #: company/templates/company/supplier_part_base.html:83 #: company/templates/company/supplier_part_detail.html:25 order/models.py:190 #: order/templates/order/order_base.html:92 @@ -1807,80 +1807,80 @@ msgstr "Teil auswählen" msgid "Supplier" msgstr "Zulieferer" -#: company/models.py:326 +#: company/models.py:330 msgid "Select supplier" msgstr "Zulieferer auswählen" -#: company/models.py:331 company/templates/company/supplier_part_base.html:87 +#: company/models.py:335 company/templates/company/supplier_part_base.html:87 #: company/templates/company/supplier_part_detail.html:26 #: order/templates/order/purchase_order_detail.html:174 part/bom.py:171 msgid "SKU" msgstr "SKU (Lagerbestandseinheit)" -#: company/models.py:332 +#: company/models.py:336 msgid "Supplier stock keeping unit" msgstr "Lagerbestandseinheit (SKU) des Zulieferers" -#: company/models.py:342 company/templates/company/detail.html:55 +#: company/models.py:346 company/templates/company/detail.html:55 #: company/templates/company/supplier_part_base.html:93 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:172 #: templates/js/company.js:44 templates/js/company.js:188 msgid "Manufacturer" msgstr "Hersteller" -#: company/models.py:343 +#: company/models.py:347 msgid "Select manufacturer" msgstr "Hersteller auswählen" -#: company/models.py:349 company/templates/company/supplier_part_base.html:99 +#: company/models.py:353 company/templates/company/supplier_part_base.html:99 #: company/templates/company/supplier_part_detail.html:35 #: order/templates/order/purchase_order_detail.html:183 part/bom.py:173 #: templates/js/company.js:204 msgid "MPN" msgstr "MPN" -#: company/models.py:350 +#: company/models.py:354 msgid "Manufacturer part number" msgstr "Hersteller-Teilenummer" -#: company/models.py:356 +#: company/models.py:360 msgid "URL for external supplier part link" msgstr "Teil-URL des Zulieferers" -#: company/models.py:362 +#: company/models.py:366 msgid "Supplier part description" msgstr "Zuliefererbeschreibung des Teils" -#: company/models.py:367 company/templates/company/supplier_part_base.html:113 +#: company/models.py:371 company/templates/company/supplier_part_base.html:113 #: company/templates/company/supplier_part_detail.html:38 part/models.py:2170 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "Notiz" -#: company/models.py:371 +#: company/models.py:375 msgid "base cost" msgstr "Basiskosten" -#: company/models.py:371 +#: company/models.py:375 msgid "Minimum charge (e.g. stocking fee)" msgstr "Mindestpreis" -#: company/models.py:373 company/templates/company/supplier_part_base.html:106 +#: company/models.py:377 company/templates/company/supplier_part_base.html:106 #: stock/models.py:395 stock/templates/stock/item_base.html:295 -#: templates/js/stock.js:663 +#: templates/js/stock.js:667 msgid "Packaging" msgstr "Verpackungen" -#: company/models.py:373 +#: company/models.py:377 msgid "Part packaging" msgstr "Teile-Verpackungen" -#: company/models.py:375 +#: company/models.py:379 msgid "multiple" msgstr "Vielfache" -#: company/models.py:375 +#: company/models.py:379 msgid "Order multiple" msgstr "Mehrere bestellen" @@ -1973,7 +1973,7 @@ msgstr "Neues Zulieferer-Teil anlegen" #: company/templates/company/detail_part.html:21 #: order/templates/order/purchase_order_detail.html:74 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1082 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1086 msgid "New Supplier Part" msgstr "Neues Zulieferer-Teil" @@ -1997,7 +1997,7 @@ msgstr "Teile löschen" #: company/templates/company/detail_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1076 +#: templates/js/stock.js:1080 msgid "New Part" msgstr "Neues Teil" @@ -2052,14 +2052,14 @@ msgstr "Zulieferer-Teile" #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:96 templates/InvenTree/search.html:113 #: templates/InvenTree/settings/tabs.html:25 templates/navbar.html:23 -#: templates/stats.html:35 templates/stats.html:44 users/models.py:38 +#: templates/stats.html:48 templates/stats.html:57 users/models.py:38 msgid "Parts" msgstr "Teile" #: company/templates/company/navbar.html:27 part/templates/part/navbar.html:33 #: stock/templates/stock/location.html:100 #: stock/templates/stock/location.html:115 templates/InvenTree/search.html:182 -#: templates/stats.html:48 templates/stats.html:57 users/models.py:40 +#: templates/stats.html:61 templates/stats.html:70 users/models.py:40 msgid "Stock Items" msgstr "BestandsObjekte" @@ -2071,7 +2071,7 @@ msgstr "BestandsObjekte" #: templates/InvenTree/index.html:127 templates/InvenTree/search.html:180 #: templates/InvenTree/search.html:216 #: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:172 -#: templates/js/part.js:397 templates/js/stock.js:559 templates/navbar.html:26 +#: templates/js/part.js:397 templates/js/stock.js:563 templates/navbar.html:26 msgid "Stock" msgstr "Lagerbestand" @@ -2082,7 +2082,7 @@ msgstr "Lagerbestand" #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 #: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:226 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:227 #: templates/InvenTree/search.html:330 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46 #: users/models.py:43 @@ -2094,7 +2094,7 @@ msgstr "Aufträge" #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 #: part/templates/part/navbar.html:78 part/templates/part/navbar.html:81 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:203 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:204 #: templates/InvenTree/search.html:300 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37 #: users/models.py:42 @@ -2287,7 +2287,7 @@ msgstr "Firma gelöscht" msgid "Edit Supplier Part" msgstr "Zulieferer-Teil bearbeiten" -#: company/views.py:378 templates/js/stock.js:1083 +#: company/views.py:378 templates/js/stock.js:1087 msgid "Create new Supplier Part" msgstr "Neues Zulieferer-Teil anlegen" @@ -2740,8 +2740,8 @@ msgstr "Position hinzufügen" #: order/templates/order/purchase_order_detail.html:45 #: order/templates/order/purchase_order_detail.html:125 #: part/templates/part/category.html:197 part/templates/part/category.html:239 -#: stock/templates/stock/location.html:191 templates/js/stock.js:704 -#: templates/js/stock.js:1088 +#: stock/templates/stock/location.html:191 templates/js/stock.js:708 +#: templates/js/stock.js:1092 msgid "New Location" msgstr "Neuer Lagerort" @@ -3274,7 +3274,7 @@ msgstr "Teil-Kategorie" #: part/models.py:83 part/templates/part/category.html:19 #: part/templates/part/category.html:90 part/templates/part/category.html:141 -#: templates/InvenTree/search.html:126 templates/stats.html:39 +#: templates/InvenTree/search.html:126 templates/stats.html:52 #: users/models.py:37 msgid "Part Categories" msgstr "Teil-Kategorien" @@ -3718,7 +3718,7 @@ msgid "All selected BOM items will be deleted" msgstr "Alle ausgewählte Stücklistenpositionen werden gelöscht" #: part/templates/part/bom.html:160 part/views.py:584 -#: templates/js/stock.js:1077 +#: templates/js/stock.js:1081 msgid "Create New Part" msgstr "Neues Teil anlegen" @@ -3887,7 +3887,7 @@ msgid "Export Data" msgstr "Exportieren" #: part/templates/part/category.html:198 -#: stock/templates/stock/location.html:192 templates/js/stock.js:705 +#: stock/templates/stock/location.html:192 templates/js/stock.js:709 msgid "Create new location" msgstr "Neuen Lagerort anlegen" @@ -4133,7 +4133,7 @@ msgid "Edit" msgstr "Bearbeiten" #: part/templates/part/params.html:44 part/templates/part/related.html:44 -#: part/templates/part/supplier.html:22 stock/views.py:1002 users/models.py:175 +#: part/templates/part/supplier.html:22 stock/views.py:1002 users/models.py:182 msgid "Delete" msgstr "Löschen" @@ -4678,7 +4678,7 @@ msgid "Result" msgstr "Ergebnis" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:905 +#: templates/js/order.js:195 templates/js/stock.js:909 msgid "Date" msgstr "Datum" @@ -4701,7 +4701,7 @@ msgid "Moved {n} parts to {loc}" msgstr "{n} Teile nach {loc} bewegt" #: stock/forms.py:114 stock/forms.py:406 stock/models.py:473 -#: stock/templates/stock/item_base.html:349 templates/js/stock.js:652 +#: stock/templates/stock/item_base.html:349 templates/js/stock.js:656 msgid "Expiry Date" msgstr "Ablaufdatum" @@ -5146,13 +5146,13 @@ msgid "Remove stock" msgstr "Bestand entfernen" #: stock/templates/stock/item_base.html:169 -msgid "Transfer stock" -msgstr "Bestand verschieben" - -#: stock/templates/stock/item_base.html:172 msgid "Serialize stock" msgstr "Lagerbestand serialisieren" +#: stock/templates/stock/item_base.html:173 +msgid "Transfer stock" +msgstr "Bestand verschieben" + #: stock/templates/stock/item_base.html:176 msgid "Assign to customer" msgstr "zu Kunden zuordnen" @@ -5161,7 +5161,7 @@ msgstr "zu Kunden zuordnen" msgid "Return to stock" msgstr "zu Bestand zurückgeben" -#: stock/templates/stock/item_base.html:183 templates/js/stock.js:1218 +#: stock/templates/stock/item_base.html:183 templates/js/stock.js:1222 msgid "Uninstall stock item" msgstr "BestandsObjekt deinstallieren" @@ -5214,7 +5214,7 @@ msgstr "Dieses BestandsObjekt lief ab am" msgid "This StockItem expires on" msgstr "Dieses BestandsObjekt läuft ab am" -#: stock/templates/stock/item_base.html:362 templates/js/stock.js:658 +#: stock/templates/stock/item_base.html:362 templates/js/stock.js:662 msgid "Last Updated" msgstr "Zuletzt aktualisiert" @@ -5333,7 +5333,7 @@ msgid "Stock Details" msgstr "Objekt-Details" #: stock/templates/stock/location.html:110 templates/InvenTree/search.html:263 -#: templates/stats.html:52 users/models.py:39 +#: templates/stats.html:65 users/models.py:39 msgid "Stock Locations" msgstr "Bestand-Lagerorte" @@ -5518,7 +5518,7 @@ msgstr "Entfernen" msgid "Add Stock Items" msgstr "BestandsObjekte hinzufügen" -#: stock/views.py:1001 users/models.py:171 +#: stock/views.py:1001 users/models.py:178 msgid "Add" msgstr "Hinzufügen" @@ -5648,35 +5648,35 @@ msgstr "Stücklisten erwarten Kontrolle" msgid "Recently Updated" msgstr "kürzlich aktualisiert" -#: templates/InvenTree/index.html:143 +#: templates/InvenTree/index.html:144 msgid "Expired Stock" msgstr "abgelaufener Bestand" -#: templates/InvenTree/index.html:144 +#: templates/InvenTree/index.html:145 msgid "Stale Stock" msgstr "Lagerbestand überfällig" -#: templates/InvenTree/index.html:182 +#: templates/InvenTree/index.html:183 msgid "Build Orders In Progress" msgstr "laufende Bauaufträge" -#: templates/InvenTree/index.html:183 +#: templates/InvenTree/index.html:184 msgid "Overdue Build Orders" msgstr "überfällige Bauaufträge" -#: templates/InvenTree/index.html:204 +#: templates/InvenTree/index.html:205 msgid "Outstanding Purchase Orders" msgstr "ausstehende Bestellungen" -#: templates/InvenTree/index.html:205 +#: templates/InvenTree/index.html:206 msgid "Overdue Purchase Orders" msgstr "überfällige Bestellungen" -#: templates/InvenTree/index.html:227 +#: templates/InvenTree/index.html:228 msgid "Outstanding Sales Orders" msgstr "ausstehende Aufträge" -#: templates/InvenTree/index.html:228 +#: templates/InvenTree/index.html:229 msgid "Overdue Sales Orders" msgstr "überfällige Aufträge" @@ -5688,11 +5688,11 @@ msgstr "Suchergebnisse" msgid "Enter a search query" msgstr "Eine Sucheanfrage eingeben" -#: templates/InvenTree/search.html:252 templates/js/stock.js:301 +#: templates/InvenTree/search.html:252 templates/js/stock.js:300 msgid "Shipped to customer" msgstr "an Kunde versand" -#: templates/InvenTree/search.html:255 templates/js/stock.js:311 +#: templates/InvenTree/search.html:255 templates/js/stock.js:310 msgid "No stock location set" msgstr "Kein Lagerort gesetzt" @@ -5767,7 +5767,7 @@ msgid "Edit setting" msgstr "Einstellungen ändern" #: templates/InvenTree/settings/settings.html:7 -#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:76 +#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:78 msgid "Settings" msgstr "Einstellungen" @@ -5869,30 +5869,38 @@ msgid "InvenTree Version" msgstr "InvenTree-Version" #: templates/about.html:26 +msgid "Up to Date" +msgstr "Aktuell" + +#: templates/about.html:28 +msgid "Update Available" +msgstr "Aktualisierung verfügbar" + +#: templates/about.html:34 msgid "Django Version" msgstr "Django-Version" -#: templates/about.html:30 +#: templates/about.html:41 msgid "Commit Hash" msgstr "Commit-Hash" -#: templates/about.html:34 +#: templates/about.html:48 msgid "Commit Date" msgstr "Commit-Datum" -#: templates/about.html:38 +#: templates/about.html:53 msgid "InvenTree Documentation" msgstr "InvenTree-Dokumentation" -#: templates/about.html:43 +#: templates/about.html:58 msgid "View Code on GitHub" msgstr "Code auf GitHub ansehen" -#: templates/about.html:48 +#: templates/about.html:63 msgid "Get the App" msgstr "App herunterladen" -#: templates/about.html:53 +#: templates/about.html:68 msgid "Submit Bug Report" msgstr "Fehlerbericht senden" @@ -6092,8 +6100,8 @@ msgstr "Bestand bestellen" msgid "No builds matching query" msgstr "Keine Bauaufträge passen zur Anfrage" -#: templates/js/build.js:649 templates/js/part.js:323 templates/js/stock.js:512 -#: templates/js/stock.js:1250 +#: templates/js/build.js:649 templates/js/part.js:323 templates/js/stock.js:511 +#: templates/js/stock.js:1254 msgid "Select" msgstr "Auswählen" @@ -6446,115 +6454,115 @@ msgstr "Keine Testergebnisse gefunden" msgid "Test Date" msgstr "Testdatum" -#: templates/js/stock.js:293 +#: templates/js/stock.js:292 msgid "In production" msgstr "In Arbeit" -#: templates/js/stock.js:297 +#: templates/js/stock.js:296 msgid "Installed in Stock Item" msgstr "In BestandsObjekt installiert" -#: templates/js/stock.js:305 +#: templates/js/stock.js:304 msgid "Assigned to Sales Order" msgstr "Auftrag zugewiesen" -#: templates/js/stock.js:337 +#: templates/js/stock.js:336 msgid "No stock items matching query" msgstr "Keine zur Anfrage passenden BestandsObjekte" -#: templates/js/stock.js:479 +#: templates/js/stock.js:478 msgid "Undefined location" msgstr "unbekannter Lagerort" -#: templates/js/stock.js:575 +#: templates/js/stock.js:579 msgid "Stock item is in production" msgstr "BestandsObjekt wird produziert" -#: templates/js/stock.js:580 +#: templates/js/stock.js:584 msgid "Stock item assigned to sales order" msgstr "BestandsObjekt wurde Auftrag zugewiesen" -#: templates/js/stock.js:583 +#: templates/js/stock.js:587 msgid "Stock item assigned to customer" msgstr "BestandsObjekt wurde Kunden zugewiesen" -#: templates/js/stock.js:587 +#: templates/js/stock.js:591 msgid "Stock item has expired" msgstr "BestandsObjekt ist abgelaufen" -#: templates/js/stock.js:589 +#: templates/js/stock.js:593 msgid "Stock item will expire soon" msgstr "BestandsObjekt läuft demnächst ab" -#: templates/js/stock.js:593 +#: templates/js/stock.js:597 msgid "Stock item has been allocated" msgstr "BestandsObjekt zugewiesen" -#: templates/js/stock.js:597 +#: templates/js/stock.js:601 msgid "Stock item has been installed in another item" msgstr "BestandsObjekt in anderem Element verbaut" -#: templates/js/stock.js:605 +#: templates/js/stock.js:609 msgid "Stock item has been rejected" msgstr "BestandsObjekt abgewiesen" -#: templates/js/stock.js:609 +#: templates/js/stock.js:613 msgid "Stock item is lost" msgstr "BestandsObjekt verloren" -#: templates/js/stock.js:612 +#: templates/js/stock.js:616 msgid "Stock item is destroyed" msgstr "BestandsObjekt zerstört" -#: templates/js/stock.js:616 templates/js/table_filters.js:116 +#: templates/js/stock.js:620 templates/js/table_filters.js:116 msgid "Depleted" msgstr "gelöscht" -#: templates/js/stock.js:645 +#: templates/js/stock.js:649 msgid "Stocktake" msgstr "Inventur" -#: templates/js/stock.js:821 +#: templates/js/stock.js:825 msgid "Stock Status" msgstr "Bestandsstatus" -#: templates/js/stock.js:836 +#: templates/js/stock.js:840 msgid "Set Stock Status" msgstr "Bestandsstatus setzen" -#: templates/js/stock.js:850 +#: templates/js/stock.js:854 msgid "Select Status Code" msgstr "Status Code setzen" -#: templates/js/stock.js:851 +#: templates/js/stock.js:855 msgid "Status code must be selected" msgstr "Status Code muss ausgewählt werden" -#: templates/js/stock.js:969 +#: templates/js/stock.js:973 msgid "No user information" msgstr "Keine Benutzerinformation" -#: templates/js/stock.js:979 +#: templates/js/stock.js:983 msgid "Edit tracking entry" msgstr "Tracking-Eintrag bearbeiten" -#: templates/js/stock.js:980 +#: templates/js/stock.js:984 msgid "Delete tracking entry" msgstr "Tracking-Eintrag löschen" -#: templates/js/stock.js:1089 +#: templates/js/stock.js:1093 msgid "Create New Location" msgstr "Neuen Lagerort anlegen" -#: templates/js/stock.js:1188 +#: templates/js/stock.js:1192 msgid "Serial" msgstr "Seriennummer" -#: templates/js/stock.js:1281 templates/js/table_filters.js:149 +#: templates/js/stock.js:1285 templates/js/table_filters.js:149 msgid "Installed" msgstr "Installiert" -#: templates/js/stock.js:1306 +#: templates/js/stock.js:1310 msgid "Install item" msgstr "Installiere Objekt" @@ -6780,23 +6788,19 @@ msgstr "Verkaufen" msgid "Scan Barcode" msgstr "Barcode scannen" -#: templates/navbar.html:63 -msgid "InvenTree server issues detected" -msgstr "InvenTree Server Fehler aufgetreten" - -#: templates/navbar.html:69 users/models.py:36 +#: templates/navbar.html:71 users/models.py:36 msgid "Admin" msgstr "Admin" -#: templates/navbar.html:71 templates/registration/logout.html:5 +#: templates/navbar.html:73 templates/registration/logout.html:5 msgid "Logout" msgstr "Ausloggen" -#: templates/navbar.html:73 templates/registration/login.html:89 +#: templates/navbar.html:75 templates/registration/login.html:89 msgid "Login" msgstr "Einloggen" -#: templates/navbar.html:85 +#: templates/navbar.html:94 msgid "About InvenTree" msgstr "Über InvenBaum" @@ -6836,18 +6840,30 @@ msgstr "Server" msgid "Instance Name" msgstr "Instanzname" -#: templates/stats.html:18 +#: templates/stats.html:19 msgid "Server status" msgstr "Serverstatus" -#: templates/stats.html:21 +#: templates/stats.html:22 msgid "Healthy" msgstr "Gesund" -#: templates/stats.html:23 +#: templates/stats.html:24 msgid "Issues detected" msgstr "Probleme erkannt" +#: templates/stats.html:30 +msgid "Background Worker" +msgstr "Hintergrund-Prozess" + +#: templates/stats.html:33 +msgid "Operational" +msgstr "Betriebsbereit" + +#: templates/stats.html:35 +msgid "Not running" +msgstr "Läuft nicht" + #: templates/stock_table.html:14 msgid "Export Stock Information" msgstr "Aktuellen Bestand exportieren" @@ -6932,38 +6948,41 @@ msgstr "Berechtigungen" msgid "Important dates" msgstr "wichtige Daten" -#: users/models.py:158 +#: users/models.py:165 msgid "Permission set" msgstr "Berechtigung geändert" -#: users/models.py:166 +#: users/models.py:173 msgid "Group" msgstr "Gruppe" -#: users/models.py:169 +#: users/models.py:176 msgid "View" msgstr "Ansicht" -#: users/models.py:169 +#: users/models.py:176 msgid "Permission to view items" msgstr "Berechtigung Einträge anzuzeigen" -#: users/models.py:171 +#: users/models.py:178 msgid "Permission to add items" msgstr "Berechtigung Einträge zu erstellen" -#: users/models.py:173 +#: users/models.py:180 msgid "Change" msgstr "Ändern" -#: users/models.py:173 +#: users/models.py:180 msgid "Permissions to edit items" msgstr "Berechtigungen Einträge zu ändern" -#: users/models.py:175 +#: users/models.py:182 msgid "Permission to delete items" msgstr "Berechtigung Einträge zu löschen" +#~ msgid "InvenTree server issues detected" +#~ msgstr "InvenTree Server Fehler aufgetreten" + #, fuzzy #~| msgid "Stocktake" #~ msgid "take" diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po index bb954c049d..fb69f99234 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-04-04 20:22+0000\n" +"POT-Creation-Date: 2021-04-11 22:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,15 +18,15 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: InvenTree/api.py:62 +#: InvenTree/api.py:64 msgid "API endpoint not found" msgstr "" -#: InvenTree/api.py:108 +#: InvenTree/api.py:110 msgid "No action specified" msgstr "" -#: InvenTree/api.py:122 +#: InvenTree/api.py:124 msgid "No matching action found" msgstr "" @@ -124,7 +124,7 @@ msgstr "" #: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1888 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:960 +#: templates/js/stock.js:964 msgid "User" msgstr "" @@ -140,7 +140,7 @@ msgid "Name" msgstr "" #: InvenTree/models.py:114 build/models.py:134 -#: build/templates/build/detail.html:21 company/models.py:361 +#: build/templates/build/detail.html:21 company/models.py:365 #: company/templates/company/detail.html:26 #: company/templates/company/supplier_part_base.html:70 #: company/templates/company/supplier_part_detail.html:31 label/models.py:108 @@ -155,8 +155,8 @@ msgstr "" #: templates/js/build.js:677 templates/js/build.js:944 #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:168 templates/js/part.js:251 -#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:552 -#: templates/js/stock.js:934 +#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:554 +#: templates/js/stock.js:938 msgid "Description" msgstr "" @@ -168,31 +168,31 @@ msgstr "" msgid "parent" msgstr "" -#: InvenTree/settings.py:430 +#: InvenTree/settings.py:480 msgid "English" msgstr "" -#: InvenTree/settings.py:431 +#: InvenTree/settings.py:481 msgid "French" msgstr "" -#: InvenTree/settings.py:432 +#: InvenTree/settings.py:482 msgid "German" msgstr "" -#: InvenTree/settings.py:433 +#: InvenTree/settings.py:483 msgid "Polish" msgstr "" -#: InvenTree/settings.py:434 +#: InvenTree/settings.py:484 msgid "Turkish" msgstr "" -#: InvenTree/status.py:24 -msgid "Celery worker check failed" +#: InvenTree/status.py:57 +msgid "Background worker check failed" msgstr "" -#: InvenTree/status.py:27 +#: InvenTree/status.py:60 msgid "InvenTree system health checks failed" msgstr "" @@ -308,7 +308,7 @@ msgstr "" msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:887 templates/navbar.html:83 +#: InvenTree/views.py:887 templates/navbar.html:85 msgid "System Information" msgstr "" @@ -404,7 +404,7 @@ msgstr "" #: stock/templates/stock/item_base.html:240 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 #: templates/js/bom.js:205 templates/js/build.js:420 templates/js/build.js:954 -#: templates/js/stock.js:952 templates/js/stock.js:1190 +#: templates/js/stock.js:956 templates/js/stock.js:1194 msgid "Quantity" msgstr "" @@ -450,7 +450,7 @@ msgstr "" #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:244 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:434 -#: templates/js/stock.js:637 +#: templates/js/stock.js:641 msgid "Location" msgstr "" @@ -493,7 +493,7 @@ msgstr "" #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 #: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:181 +#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:182 #: templates/InvenTree/search.html:169 #: templates/InvenTree/settings/tabs.html:31 users/models.py:41 msgid "Build Orders" @@ -527,7 +527,7 @@ msgstr "" #: build/models.py:152 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:86 -#: build/templates/build/detail.html:26 company/models.py:535 +#: build/templates/build/detail.html:26 company/models.py:539 #: order/models.py:637 order/models.py:669 #: order/templates/order/order_wizard/select_parts.html:30 #: order/templates/order/purchase_order_detail.html:156 @@ -546,8 +546,8 @@ msgstr "" #: templates/js/barcode.js:362 templates/js/bom.js:163 #: templates/js/build.js:681 templates/js/build.js:921 #: templates/js/company.js:138 templates/js/part.js:232 -#: templates/js/part.js:337 templates/js/stock.js:524 -#: templates/js/stock.js:1262 +#: templates/js/part.js:337 templates/js/stock.js:523 +#: templates/js/stock.js:1266 msgid "Part" msgstr "" @@ -663,7 +663,7 @@ msgid "Link to external URL" msgstr "" #: build/models.py:261 build/templates/build/navbar.html:59 -#: company/models.py:129 company/models.py:368 +#: company/models.py:133 company/models.py:372 #: company/templates/company/navbar.html:59 #: company/templates/company/navbar.html:62 order/models.py:123 #: order/models.py:597 order/templates/order/po_navbar.html:29 @@ -677,7 +677,7 @@ msgstr "" #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 #: stock/models.py:496 stock/models.py:1555 stock/models.py:1665 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:329 templates/js/stock.js:128 templates/js/stock.js:667 +#: templates/js/bom.js:329 templates/js/stock.js:128 templates/js/stock.js:671 msgid "Notes" msgstr "" @@ -749,7 +749,7 @@ msgstr "" #: stock/templates/stock/item_base.html:89 #: stock/templates/stock/item_base.html:324 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771 -#: templates/js/stock.js:923 templates/js/stock.js:1181 +#: templates/js/stock.js:927 templates/js/stock.js:1185 msgid "Stock Item" msgstr "" @@ -908,7 +908,7 @@ msgstr "" #: stock/templates/stock/item_base.html:376 templates/InvenTree/search.html:236 #: templates/js/barcode.js:119 templates/js/build.js:710 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:624 templates/js/stock.js:1198 +#: templates/js/stock.js:628 templates/js/stock.js:1202 msgid "Status" msgstr "" @@ -1042,8 +1042,8 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:288 templates/js/stock.js:632 -#: templates/js/stock.js:1205 templates/js/table_filters.js:85 +#: stock/templates/stock/item_base.html:288 templates/js/stock.js:636 +#: templates/js/stock.js:1209 templates/js/table_filters.js:85 #: templates/js/table_filters.js:179 msgid "Batch" msgstr "" @@ -1304,7 +1304,7 @@ msgstr "" msgid "String descriptor for the server instance" msgstr "" -#: common/models.py:62 company/models.py:96 company/models.py:97 +#: common/models.py:62 company/models.py:95 company/models.py:96 msgid "Company name" msgstr "" @@ -1652,12 +1652,12 @@ msgstr "" msgid "Supplied value must be a boolean" msgstr "" -#: company/forms.py:37 company/models.py:139 +#: company/forms.py:37 company/models.py:143 #: company/templates/company/detail.html:40 msgid "Currency" msgstr "" -#: company/forms.py:38 company/models.py:141 +#: company/forms.py:38 company/models.py:145 msgid "Default currency used for this company" msgstr "" @@ -1677,104 +1677,104 @@ msgstr "" msgid "Single quantity price" msgstr "" -#: company/models.py:99 +#: company/models.py:100 msgid "Company description" msgstr "" -#: company/models.py:99 +#: company/models.py:101 msgid "Description of the company" msgstr "" -#: company/models.py:101 company/templates/company/company_base.html:70 +#: company/models.py:105 company/templates/company/company_base.html:70 #: company/templates/company/detail.html:31 templates/js/company.js:60 msgid "Website" msgstr "" -#: company/models.py:101 +#: company/models.py:105 msgid "Company website URL" msgstr "" -#: company/models.py:104 company/templates/company/company_base.html:77 +#: company/models.py:108 company/templates/company/company_base.html:77 msgid "Address" msgstr "" -#: company/models.py:105 +#: company/models.py:109 msgid "Company address" msgstr "" -#: company/models.py:108 +#: company/models.py:112 msgid "Phone number" msgstr "" -#: company/models.py:109 +#: company/models.py:113 msgid "Contact phone number" msgstr "" -#: company/models.py:112 company/templates/company/company_base.html:91 +#: company/models.py:116 company/templates/company/company_base.html:91 msgid "Email" msgstr "" -#: company/models.py:112 +#: company/models.py:116 msgid "Contact email address" msgstr "" -#: company/models.py:115 company/templates/company/company_base.html:98 +#: company/models.py:119 company/templates/company/company_base.html:98 msgid "Contact" msgstr "" -#: company/models.py:116 +#: company/models.py:120 msgid "Point of contact" msgstr "" -#: company/models.py:118 company/models.py:355 order/models.py:103 +#: company/models.py:122 company/models.py:359 order/models.py:103 #: part/models.py:743 #: report/templates/report/inventree_build_order_base.html:165 #: stock/models.py:1557 templates/js/company.js:208 templates/js/part.js:430 msgid "Link" msgstr "" -#: company/models.py:118 +#: company/models.py:122 msgid "Link to external company information" msgstr "" -#: company/models.py:126 part/models.py:753 +#: company/models.py:130 part/models.py:753 msgid "Image" msgstr "" -#: company/models.py:131 +#: company/models.py:135 msgid "is customer" msgstr "" -#: company/models.py:131 +#: company/models.py:135 msgid "Do you sell items to this company?" msgstr "" -#: company/models.py:133 +#: company/models.py:137 msgid "is supplier" msgstr "" -#: company/models.py:133 +#: company/models.py:137 msgid "Do you purchase items from this company?" msgstr "" -#: company/models.py:135 +#: company/models.py:139 msgid "is manufacturer" msgstr "" -#: company/models.py:135 +#: company/models.py:139 msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:315 stock/models.py:371 +#: company/models.py:319 stock/models.py:371 #: stock/templates/stock/item_base.html:220 msgid "Base Part" msgstr "" -#: company/models.py:319 order/views.py:1372 +#: company/models.py:323 order/views.py:1372 msgid "Select part" msgstr "" -#: company/models.py:325 company/templates/company/detail.html:60 +#: company/models.py:329 company/templates/company/detail.html:60 #: company/templates/company/supplier_part_base.html:83 #: company/templates/company/supplier_part_detail.html:25 order/models.py:190 #: order/templates/order/order_base.html:92 @@ -1784,80 +1784,80 @@ msgstr "" msgid "Supplier" msgstr "" -#: company/models.py:326 +#: company/models.py:330 msgid "Select supplier" msgstr "" -#: company/models.py:331 company/templates/company/supplier_part_base.html:87 +#: company/models.py:335 company/templates/company/supplier_part_base.html:87 #: company/templates/company/supplier_part_detail.html:26 #: order/templates/order/purchase_order_detail.html:174 part/bom.py:171 msgid "SKU" msgstr "" -#: company/models.py:332 +#: company/models.py:336 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:342 company/templates/company/detail.html:55 +#: company/models.py:346 company/templates/company/detail.html:55 #: company/templates/company/supplier_part_base.html:93 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:172 #: templates/js/company.js:44 templates/js/company.js:188 msgid "Manufacturer" msgstr "" -#: company/models.py:343 +#: company/models.py:347 msgid "Select manufacturer" msgstr "" -#: company/models.py:349 company/templates/company/supplier_part_base.html:99 +#: company/models.py:353 company/templates/company/supplier_part_base.html:99 #: company/templates/company/supplier_part_detail.html:35 #: order/templates/order/purchase_order_detail.html:183 part/bom.py:173 #: templates/js/company.js:204 msgid "MPN" msgstr "" -#: company/models.py:350 +#: company/models.py:354 msgid "Manufacturer part number" msgstr "" -#: company/models.py:356 +#: company/models.py:360 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:362 +#: company/models.py:366 msgid "Supplier part description" msgstr "" -#: company/models.py:367 company/templates/company/supplier_part_base.html:113 +#: company/models.py:371 company/templates/company/supplier_part_base.html:113 #: company/templates/company/supplier_part_detail.html:38 part/models.py:2170 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:371 +#: company/models.py:375 msgid "base cost" msgstr "" -#: company/models.py:371 +#: company/models.py:375 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:373 company/templates/company/supplier_part_base.html:106 +#: company/models.py:377 company/templates/company/supplier_part_base.html:106 #: stock/models.py:395 stock/templates/stock/item_base.html:295 -#: templates/js/stock.js:663 +#: templates/js/stock.js:667 msgid "Packaging" msgstr "" -#: company/models.py:373 +#: company/models.py:377 msgid "Part packaging" msgstr "" -#: company/models.py:375 +#: company/models.py:379 msgid "multiple" msgstr "" -#: company/models.py:375 +#: company/models.py:379 msgid "Order multiple" msgstr "" @@ -1950,7 +1950,7 @@ msgstr "" #: company/templates/company/detail_part.html:21 #: order/templates/order/purchase_order_detail.html:74 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1082 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1086 msgid "New Supplier Part" msgstr "" @@ -1974,7 +1974,7 @@ msgstr "" #: company/templates/company/detail_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1076 +#: templates/js/stock.js:1080 msgid "New Part" msgstr "" @@ -2029,14 +2029,14 @@ msgstr "" #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:96 templates/InvenTree/search.html:113 #: templates/InvenTree/settings/tabs.html:25 templates/navbar.html:23 -#: templates/stats.html:35 templates/stats.html:44 users/models.py:38 +#: templates/stats.html:48 templates/stats.html:57 users/models.py:38 msgid "Parts" msgstr "" #: company/templates/company/navbar.html:27 part/templates/part/navbar.html:33 #: stock/templates/stock/location.html:100 #: stock/templates/stock/location.html:115 templates/InvenTree/search.html:182 -#: templates/stats.html:48 templates/stats.html:57 users/models.py:40 +#: templates/stats.html:61 templates/stats.html:70 users/models.py:40 msgid "Stock Items" msgstr "" @@ -2048,7 +2048,7 @@ msgstr "" #: templates/InvenTree/index.html:127 templates/InvenTree/search.html:180 #: templates/InvenTree/search.html:216 #: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:172 -#: templates/js/part.js:397 templates/js/stock.js:559 templates/navbar.html:26 +#: templates/js/part.js:397 templates/js/stock.js:563 templates/navbar.html:26 msgid "Stock" msgstr "" @@ -2059,7 +2059,7 @@ msgstr "" #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 #: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:226 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:227 #: templates/InvenTree/search.html:330 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46 #: users/models.py:43 @@ -2071,7 +2071,7 @@ msgstr "" #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 #: part/templates/part/navbar.html:78 part/templates/part/navbar.html:81 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:203 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:204 #: templates/InvenTree/search.html:300 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37 #: users/models.py:42 @@ -2263,7 +2263,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:378 templates/js/stock.js:1083 +#: company/views.py:378 templates/js/stock.js:1087 msgid "Create new Supplier Part" msgstr "" @@ -2713,8 +2713,8 @@ msgstr "" #: order/templates/order/purchase_order_detail.html:45 #: order/templates/order/purchase_order_detail.html:125 #: part/templates/part/category.html:197 part/templates/part/category.html:239 -#: stock/templates/stock/location.html:191 templates/js/stock.js:704 -#: templates/js/stock.js:1088 +#: stock/templates/stock/location.html:191 templates/js/stock.js:708 +#: templates/js/stock.js:1092 msgid "New Location" msgstr "" @@ -3242,7 +3242,7 @@ msgstr "" #: part/models.py:83 part/templates/part/category.html:19 #: part/templates/part/category.html:90 part/templates/part/category.html:141 -#: templates/InvenTree/search.html:126 templates/stats.html:39 +#: templates/InvenTree/search.html:126 templates/stats.html:52 #: users/models.py:37 msgid "Part Categories" msgstr "" @@ -3675,7 +3675,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:584 -#: templates/js/stock.js:1077 +#: templates/js/stock.js:1081 msgid "Create New Part" msgstr "" @@ -3844,7 +3844,7 @@ msgid "Export Data" msgstr "" #: part/templates/part/category.html:198 -#: stock/templates/stock/location.html:192 templates/js/stock.js:705 +#: stock/templates/stock/location.html:192 templates/js/stock.js:709 msgid "Create new location" msgstr "" @@ -4085,7 +4085,7 @@ msgid "Edit" msgstr "" #: part/templates/part/params.html:44 part/templates/part/related.html:44 -#: part/templates/part/supplier.html:22 stock/views.py:1002 users/models.py:175 +#: part/templates/part/supplier.html:22 stock/views.py:1002 users/models.py:182 msgid "Delete" msgstr "" @@ -4628,7 +4628,7 @@ msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:905 +#: templates/js/order.js:195 templates/js/stock.js:909 msgid "Date" msgstr "" @@ -4651,7 +4651,7 @@ msgid "Moved {n} parts to {loc}" msgstr "" #: stock/forms.py:114 stock/forms.py:406 stock/models.py:473 -#: stock/templates/stock/item_base.html:349 templates/js/stock.js:652 +#: stock/templates/stock/item_base.html:349 templates/js/stock.js:656 msgid "Expiry Date" msgstr "" @@ -5085,11 +5085,11 @@ msgid "Remove stock" msgstr "" #: stock/templates/stock/item_base.html:169 -msgid "Transfer stock" +msgid "Serialize stock" msgstr "" -#: stock/templates/stock/item_base.html:172 -msgid "Serialize stock" +#: stock/templates/stock/item_base.html:173 +msgid "Transfer stock" msgstr "" #: stock/templates/stock/item_base.html:176 @@ -5100,7 +5100,7 @@ msgstr "" msgid "Return to stock" msgstr "" -#: stock/templates/stock/item_base.html:183 templates/js/stock.js:1218 +#: stock/templates/stock/item_base.html:183 templates/js/stock.js:1222 msgid "Uninstall stock item" msgstr "" @@ -5153,7 +5153,7 @@ msgstr "" msgid "This StockItem expires on" msgstr "" -#: stock/templates/stock/item_base.html:362 templates/js/stock.js:658 +#: stock/templates/stock/item_base.html:362 templates/js/stock.js:662 msgid "Last Updated" msgstr "" @@ -5266,7 +5266,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:110 templates/InvenTree/search.html:263 -#: templates/stats.html:52 users/models.py:39 +#: templates/stats.html:65 users/models.py:39 msgid "Stock Locations" msgstr "" @@ -5451,7 +5451,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:171 +#: stock/views.py:1001 users/models.py:178 msgid "Add" msgstr "" @@ -5581,35 +5581,35 @@ msgstr "" msgid "Recently Updated" msgstr "" -#: templates/InvenTree/index.html:143 +#: templates/InvenTree/index.html:144 msgid "Expired Stock" msgstr "" -#: templates/InvenTree/index.html:144 +#: templates/InvenTree/index.html:145 msgid "Stale Stock" msgstr "" -#: templates/InvenTree/index.html:182 +#: templates/InvenTree/index.html:183 msgid "Build Orders In Progress" msgstr "" -#: templates/InvenTree/index.html:183 +#: templates/InvenTree/index.html:184 msgid "Overdue Build Orders" msgstr "" -#: templates/InvenTree/index.html:204 +#: templates/InvenTree/index.html:205 msgid "Outstanding Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:205 +#: templates/InvenTree/index.html:206 msgid "Overdue Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:227 +#: templates/InvenTree/index.html:228 msgid "Outstanding Sales Orders" msgstr "" -#: templates/InvenTree/index.html:228 +#: templates/InvenTree/index.html:229 msgid "Overdue Sales Orders" msgstr "" @@ -5621,11 +5621,11 @@ msgstr "" msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:252 templates/js/stock.js:301 +#: templates/InvenTree/search.html:252 templates/js/stock.js:300 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:255 templates/js/stock.js:311 +#: templates/InvenTree/search.html:255 templates/js/stock.js:310 msgid "No stock location set" msgstr "" @@ -5700,7 +5700,7 @@ msgid "Edit setting" msgstr "" #: templates/InvenTree/settings/settings.html:7 -#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:76 +#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:78 msgid "Settings" msgstr "" @@ -5797,30 +5797,38 @@ msgid "InvenTree Version" msgstr "" #: templates/about.html:26 -msgid "Django Version" +msgid "Up to Date" msgstr "" -#: templates/about.html:30 -msgid "Commit Hash" +#: templates/about.html:28 +msgid "Update Available" msgstr "" #: templates/about.html:34 -msgid "Commit Date" +msgid "Django Version" msgstr "" -#: templates/about.html:38 -msgid "InvenTree Documentation" -msgstr "" - -#: templates/about.html:43 -msgid "View Code on GitHub" +#: templates/about.html:41 +msgid "Commit Hash" msgstr "" #: templates/about.html:48 -msgid "Get the App" +msgid "Commit Date" msgstr "" #: templates/about.html:53 +msgid "InvenTree Documentation" +msgstr "" + +#: templates/about.html:58 +msgid "View Code on GitHub" +msgstr "" + +#: templates/about.html:63 +msgid "Get the App" +msgstr "" + +#: templates/about.html:68 msgid "Submit Bug Report" msgstr "" @@ -6018,8 +6026,8 @@ msgstr "" msgid "No builds matching query" msgstr "" -#: templates/js/build.js:649 templates/js/part.js:323 templates/js/stock.js:512 -#: templates/js/stock.js:1250 +#: templates/js/build.js:649 templates/js/part.js:323 templates/js/stock.js:511 +#: templates/js/stock.js:1254 msgid "Select" msgstr "" @@ -6371,115 +6379,115 @@ msgstr "" msgid "Test Date" msgstr "" -#: templates/js/stock.js:293 +#: templates/js/stock.js:292 msgid "In production" msgstr "" -#: templates/js/stock.js:297 +#: templates/js/stock.js:296 msgid "Installed in Stock Item" msgstr "" -#: templates/js/stock.js:305 +#: templates/js/stock.js:304 msgid "Assigned to Sales Order" msgstr "" -#: templates/js/stock.js:337 +#: templates/js/stock.js:336 msgid "No stock items matching query" msgstr "" -#: templates/js/stock.js:479 +#: templates/js/stock.js:478 msgid "Undefined location" msgstr "" -#: templates/js/stock.js:575 +#: templates/js/stock.js:579 msgid "Stock item is in production" msgstr "" -#: templates/js/stock.js:580 +#: templates/js/stock.js:584 msgid "Stock item assigned to sales order" msgstr "" -#: templates/js/stock.js:583 +#: templates/js/stock.js:587 msgid "Stock item assigned to customer" msgstr "" -#: templates/js/stock.js:587 +#: templates/js/stock.js:591 msgid "Stock item has expired" msgstr "" -#: templates/js/stock.js:589 +#: templates/js/stock.js:593 msgid "Stock item will expire soon" msgstr "" -#: templates/js/stock.js:593 +#: templates/js/stock.js:597 msgid "Stock item has been allocated" msgstr "" -#: templates/js/stock.js:597 +#: templates/js/stock.js:601 msgid "Stock item has been installed in another item" msgstr "" -#: templates/js/stock.js:605 +#: templates/js/stock.js:609 msgid "Stock item has been rejected" msgstr "" -#: templates/js/stock.js:609 +#: templates/js/stock.js:613 msgid "Stock item is lost" msgstr "" -#: templates/js/stock.js:612 +#: templates/js/stock.js:616 msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:616 templates/js/table_filters.js:116 +#: templates/js/stock.js:620 templates/js/table_filters.js:116 msgid "Depleted" msgstr "" -#: templates/js/stock.js:645 +#: templates/js/stock.js:649 msgid "Stocktake" msgstr "" -#: templates/js/stock.js:821 +#: templates/js/stock.js:825 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:836 +#: templates/js/stock.js:840 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:850 +#: templates/js/stock.js:854 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:851 +#: templates/js/stock.js:855 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:969 +#: templates/js/stock.js:973 msgid "No user information" msgstr "" -#: templates/js/stock.js:979 +#: templates/js/stock.js:983 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:980 +#: templates/js/stock.js:984 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1089 +#: templates/js/stock.js:1093 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1188 +#: templates/js/stock.js:1192 msgid "Serial" msgstr "" -#: templates/js/stock.js:1281 templates/js/table_filters.js:149 +#: templates/js/stock.js:1285 templates/js/table_filters.js:149 msgid "Installed" msgstr "" -#: templates/js/stock.js:1306 +#: templates/js/stock.js:1310 msgid "Install item" msgstr "" @@ -6705,23 +6713,19 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:63 -msgid "InvenTree server issues detected" -msgstr "" - -#: templates/navbar.html:69 users/models.py:36 +#: templates/navbar.html:71 users/models.py:36 msgid "Admin" msgstr "" -#: templates/navbar.html:71 templates/registration/logout.html:5 +#: templates/navbar.html:73 templates/registration/logout.html:5 msgid "Logout" msgstr "" -#: templates/navbar.html:73 templates/registration/login.html:89 +#: templates/navbar.html:75 templates/registration/login.html:89 msgid "Login" msgstr "" -#: templates/navbar.html:85 +#: templates/navbar.html:94 msgid "About InvenTree" msgstr "" @@ -6761,18 +6765,30 @@ msgstr "" msgid "Instance Name" msgstr "" -#: templates/stats.html:18 +#: templates/stats.html:19 msgid "Server status" msgstr "" -#: templates/stats.html:21 +#: templates/stats.html:22 msgid "Healthy" msgstr "" -#: templates/stats.html:23 +#: templates/stats.html:24 msgid "Issues detected" msgstr "" +#: templates/stats.html:30 +msgid "Background Worker" +msgstr "" + +#: templates/stats.html:33 +msgid "Operational" +msgstr "" + +#: templates/stats.html:35 +msgid "Not running" +msgstr "" + #: templates/stock_table.html:14 msgid "Export Stock Information" msgstr "" @@ -6857,34 +6873,34 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:158 +#: users/models.py:165 msgid "Permission set" msgstr "" -#: users/models.py:166 +#: users/models.py:173 msgid "Group" msgstr "" -#: users/models.py:169 +#: users/models.py:176 msgid "View" msgstr "" -#: users/models.py:169 +#: users/models.py:176 msgid "Permission to view items" msgstr "" -#: users/models.py:171 +#: users/models.py:178 msgid "Permission to add items" msgstr "" -#: users/models.py:173 +#: users/models.py:180 msgid "Change" msgstr "" -#: users/models.py:173 +#: users/models.py:180 msgid "Permissions to edit items" msgstr "" -#: users/models.py:175 +#: users/models.py:182 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 bb954c049d..fb69f99234 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-04-04 20:22+0000\n" +"POT-Creation-Date: 2021-04-11 22:07+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,15 +18,15 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: InvenTree/api.py:62 +#: InvenTree/api.py:64 msgid "API endpoint not found" msgstr "" -#: InvenTree/api.py:108 +#: InvenTree/api.py:110 msgid "No action specified" msgstr "" -#: InvenTree/api.py:122 +#: InvenTree/api.py:124 msgid "No matching action found" msgstr "" @@ -124,7 +124,7 @@ msgstr "" #: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1888 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:960 +#: templates/js/stock.js:964 msgid "User" msgstr "" @@ -140,7 +140,7 @@ msgid "Name" msgstr "" #: InvenTree/models.py:114 build/models.py:134 -#: build/templates/build/detail.html:21 company/models.py:361 +#: build/templates/build/detail.html:21 company/models.py:365 #: company/templates/company/detail.html:26 #: company/templates/company/supplier_part_base.html:70 #: company/templates/company/supplier_part_detail.html:31 label/models.py:108 @@ -155,8 +155,8 @@ msgstr "" #: templates/js/build.js:677 templates/js/build.js:944 #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:168 templates/js/part.js:251 -#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:552 -#: templates/js/stock.js:934 +#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:554 +#: templates/js/stock.js:938 msgid "Description" msgstr "" @@ -168,31 +168,31 @@ msgstr "" msgid "parent" msgstr "" -#: InvenTree/settings.py:430 +#: InvenTree/settings.py:480 msgid "English" msgstr "" -#: InvenTree/settings.py:431 +#: InvenTree/settings.py:481 msgid "French" msgstr "" -#: InvenTree/settings.py:432 +#: InvenTree/settings.py:482 msgid "German" msgstr "" -#: InvenTree/settings.py:433 +#: InvenTree/settings.py:483 msgid "Polish" msgstr "" -#: InvenTree/settings.py:434 +#: InvenTree/settings.py:484 msgid "Turkish" msgstr "" -#: InvenTree/status.py:24 -msgid "Celery worker check failed" +#: InvenTree/status.py:57 +msgid "Background worker check failed" msgstr "" -#: InvenTree/status.py:27 +#: InvenTree/status.py:60 msgid "InvenTree system health checks failed" msgstr "" @@ -308,7 +308,7 @@ msgstr "" msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:887 templates/navbar.html:83 +#: InvenTree/views.py:887 templates/navbar.html:85 msgid "System Information" msgstr "" @@ -404,7 +404,7 @@ msgstr "" #: stock/templates/stock/item_base.html:240 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 #: templates/js/bom.js:205 templates/js/build.js:420 templates/js/build.js:954 -#: templates/js/stock.js:952 templates/js/stock.js:1190 +#: templates/js/stock.js:956 templates/js/stock.js:1194 msgid "Quantity" msgstr "" @@ -450,7 +450,7 @@ msgstr "" #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:244 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:434 -#: templates/js/stock.js:637 +#: templates/js/stock.js:641 msgid "Location" msgstr "" @@ -493,7 +493,7 @@ msgstr "" #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 #: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:181 +#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:182 #: templates/InvenTree/search.html:169 #: templates/InvenTree/settings/tabs.html:31 users/models.py:41 msgid "Build Orders" @@ -527,7 +527,7 @@ msgstr "" #: build/models.py:152 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:86 -#: build/templates/build/detail.html:26 company/models.py:535 +#: build/templates/build/detail.html:26 company/models.py:539 #: order/models.py:637 order/models.py:669 #: order/templates/order/order_wizard/select_parts.html:30 #: order/templates/order/purchase_order_detail.html:156 @@ -546,8 +546,8 @@ msgstr "" #: templates/js/barcode.js:362 templates/js/bom.js:163 #: templates/js/build.js:681 templates/js/build.js:921 #: templates/js/company.js:138 templates/js/part.js:232 -#: templates/js/part.js:337 templates/js/stock.js:524 -#: templates/js/stock.js:1262 +#: templates/js/part.js:337 templates/js/stock.js:523 +#: templates/js/stock.js:1266 msgid "Part" msgstr "" @@ -663,7 +663,7 @@ msgid "Link to external URL" msgstr "" #: build/models.py:261 build/templates/build/navbar.html:59 -#: company/models.py:129 company/models.py:368 +#: company/models.py:133 company/models.py:372 #: company/templates/company/navbar.html:59 #: company/templates/company/navbar.html:62 order/models.py:123 #: order/models.py:597 order/templates/order/po_navbar.html:29 @@ -677,7 +677,7 @@ msgstr "" #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 #: stock/models.py:496 stock/models.py:1555 stock/models.py:1665 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:329 templates/js/stock.js:128 templates/js/stock.js:667 +#: templates/js/bom.js:329 templates/js/stock.js:128 templates/js/stock.js:671 msgid "Notes" msgstr "" @@ -749,7 +749,7 @@ msgstr "" #: stock/templates/stock/item_base.html:89 #: stock/templates/stock/item_base.html:324 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771 -#: templates/js/stock.js:923 templates/js/stock.js:1181 +#: templates/js/stock.js:927 templates/js/stock.js:1185 msgid "Stock Item" msgstr "" @@ -908,7 +908,7 @@ msgstr "" #: stock/templates/stock/item_base.html:376 templates/InvenTree/search.html:236 #: templates/js/barcode.js:119 templates/js/build.js:710 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:624 templates/js/stock.js:1198 +#: templates/js/stock.js:628 templates/js/stock.js:1202 msgid "Status" msgstr "" @@ -1042,8 +1042,8 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:288 templates/js/stock.js:632 -#: templates/js/stock.js:1205 templates/js/table_filters.js:85 +#: stock/templates/stock/item_base.html:288 templates/js/stock.js:636 +#: templates/js/stock.js:1209 templates/js/table_filters.js:85 #: templates/js/table_filters.js:179 msgid "Batch" msgstr "" @@ -1304,7 +1304,7 @@ msgstr "" msgid "String descriptor for the server instance" msgstr "" -#: common/models.py:62 company/models.py:96 company/models.py:97 +#: common/models.py:62 company/models.py:95 company/models.py:96 msgid "Company name" msgstr "" @@ -1652,12 +1652,12 @@ msgstr "" msgid "Supplied value must be a boolean" msgstr "" -#: company/forms.py:37 company/models.py:139 +#: company/forms.py:37 company/models.py:143 #: company/templates/company/detail.html:40 msgid "Currency" msgstr "" -#: company/forms.py:38 company/models.py:141 +#: company/forms.py:38 company/models.py:145 msgid "Default currency used for this company" msgstr "" @@ -1677,104 +1677,104 @@ msgstr "" msgid "Single quantity price" msgstr "" -#: company/models.py:99 +#: company/models.py:100 msgid "Company description" msgstr "" -#: company/models.py:99 +#: company/models.py:101 msgid "Description of the company" msgstr "" -#: company/models.py:101 company/templates/company/company_base.html:70 +#: company/models.py:105 company/templates/company/company_base.html:70 #: company/templates/company/detail.html:31 templates/js/company.js:60 msgid "Website" msgstr "" -#: company/models.py:101 +#: company/models.py:105 msgid "Company website URL" msgstr "" -#: company/models.py:104 company/templates/company/company_base.html:77 +#: company/models.py:108 company/templates/company/company_base.html:77 msgid "Address" msgstr "" -#: company/models.py:105 +#: company/models.py:109 msgid "Company address" msgstr "" -#: company/models.py:108 +#: company/models.py:112 msgid "Phone number" msgstr "" -#: company/models.py:109 +#: company/models.py:113 msgid "Contact phone number" msgstr "" -#: company/models.py:112 company/templates/company/company_base.html:91 +#: company/models.py:116 company/templates/company/company_base.html:91 msgid "Email" msgstr "" -#: company/models.py:112 +#: company/models.py:116 msgid "Contact email address" msgstr "" -#: company/models.py:115 company/templates/company/company_base.html:98 +#: company/models.py:119 company/templates/company/company_base.html:98 msgid "Contact" msgstr "" -#: company/models.py:116 +#: company/models.py:120 msgid "Point of contact" msgstr "" -#: company/models.py:118 company/models.py:355 order/models.py:103 +#: company/models.py:122 company/models.py:359 order/models.py:103 #: part/models.py:743 #: report/templates/report/inventree_build_order_base.html:165 #: stock/models.py:1557 templates/js/company.js:208 templates/js/part.js:430 msgid "Link" msgstr "" -#: company/models.py:118 +#: company/models.py:122 msgid "Link to external company information" msgstr "" -#: company/models.py:126 part/models.py:753 +#: company/models.py:130 part/models.py:753 msgid "Image" msgstr "" -#: company/models.py:131 +#: company/models.py:135 msgid "is customer" msgstr "" -#: company/models.py:131 +#: company/models.py:135 msgid "Do you sell items to this company?" msgstr "" -#: company/models.py:133 +#: company/models.py:137 msgid "is supplier" msgstr "" -#: company/models.py:133 +#: company/models.py:137 msgid "Do you purchase items from this company?" msgstr "" -#: company/models.py:135 +#: company/models.py:139 msgid "is manufacturer" msgstr "" -#: company/models.py:135 +#: company/models.py:139 msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:315 stock/models.py:371 +#: company/models.py:319 stock/models.py:371 #: stock/templates/stock/item_base.html:220 msgid "Base Part" msgstr "" -#: company/models.py:319 order/views.py:1372 +#: company/models.py:323 order/views.py:1372 msgid "Select part" msgstr "" -#: company/models.py:325 company/templates/company/detail.html:60 +#: company/models.py:329 company/templates/company/detail.html:60 #: company/templates/company/supplier_part_base.html:83 #: company/templates/company/supplier_part_detail.html:25 order/models.py:190 #: order/templates/order/order_base.html:92 @@ -1784,80 +1784,80 @@ msgstr "" msgid "Supplier" msgstr "" -#: company/models.py:326 +#: company/models.py:330 msgid "Select supplier" msgstr "" -#: company/models.py:331 company/templates/company/supplier_part_base.html:87 +#: company/models.py:335 company/templates/company/supplier_part_base.html:87 #: company/templates/company/supplier_part_detail.html:26 #: order/templates/order/purchase_order_detail.html:174 part/bom.py:171 msgid "SKU" msgstr "" -#: company/models.py:332 +#: company/models.py:336 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:342 company/templates/company/detail.html:55 +#: company/models.py:346 company/templates/company/detail.html:55 #: company/templates/company/supplier_part_base.html:93 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:172 #: templates/js/company.js:44 templates/js/company.js:188 msgid "Manufacturer" msgstr "" -#: company/models.py:343 +#: company/models.py:347 msgid "Select manufacturer" msgstr "" -#: company/models.py:349 company/templates/company/supplier_part_base.html:99 +#: company/models.py:353 company/templates/company/supplier_part_base.html:99 #: company/templates/company/supplier_part_detail.html:35 #: order/templates/order/purchase_order_detail.html:183 part/bom.py:173 #: templates/js/company.js:204 msgid "MPN" msgstr "" -#: company/models.py:350 +#: company/models.py:354 msgid "Manufacturer part number" msgstr "" -#: company/models.py:356 +#: company/models.py:360 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:362 +#: company/models.py:366 msgid "Supplier part description" msgstr "" -#: company/models.py:367 company/templates/company/supplier_part_base.html:113 +#: company/models.py:371 company/templates/company/supplier_part_base.html:113 #: company/templates/company/supplier_part_detail.html:38 part/models.py:2170 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:371 +#: company/models.py:375 msgid "base cost" msgstr "" -#: company/models.py:371 +#: company/models.py:375 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:373 company/templates/company/supplier_part_base.html:106 +#: company/models.py:377 company/templates/company/supplier_part_base.html:106 #: stock/models.py:395 stock/templates/stock/item_base.html:295 -#: templates/js/stock.js:663 +#: templates/js/stock.js:667 msgid "Packaging" msgstr "" -#: company/models.py:373 +#: company/models.py:377 msgid "Part packaging" msgstr "" -#: company/models.py:375 +#: company/models.py:379 msgid "multiple" msgstr "" -#: company/models.py:375 +#: company/models.py:379 msgid "Order multiple" msgstr "" @@ -1950,7 +1950,7 @@ msgstr "" #: company/templates/company/detail_part.html:21 #: order/templates/order/purchase_order_detail.html:74 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1082 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1086 msgid "New Supplier Part" msgstr "" @@ -1974,7 +1974,7 @@ msgstr "" #: company/templates/company/detail_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1076 +#: templates/js/stock.js:1080 msgid "New Part" msgstr "" @@ -2029,14 +2029,14 @@ msgstr "" #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:96 templates/InvenTree/search.html:113 #: templates/InvenTree/settings/tabs.html:25 templates/navbar.html:23 -#: templates/stats.html:35 templates/stats.html:44 users/models.py:38 +#: templates/stats.html:48 templates/stats.html:57 users/models.py:38 msgid "Parts" msgstr "" #: company/templates/company/navbar.html:27 part/templates/part/navbar.html:33 #: stock/templates/stock/location.html:100 #: stock/templates/stock/location.html:115 templates/InvenTree/search.html:182 -#: templates/stats.html:48 templates/stats.html:57 users/models.py:40 +#: templates/stats.html:61 templates/stats.html:70 users/models.py:40 msgid "Stock Items" msgstr "" @@ -2048,7 +2048,7 @@ msgstr "" #: templates/InvenTree/index.html:127 templates/InvenTree/search.html:180 #: templates/InvenTree/search.html:216 #: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:172 -#: templates/js/part.js:397 templates/js/stock.js:559 templates/navbar.html:26 +#: templates/js/part.js:397 templates/js/stock.js:563 templates/navbar.html:26 msgid "Stock" msgstr "" @@ -2059,7 +2059,7 @@ msgstr "" #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 #: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:226 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:227 #: templates/InvenTree/search.html:330 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46 #: users/models.py:43 @@ -2071,7 +2071,7 @@ msgstr "" #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 #: part/templates/part/navbar.html:78 part/templates/part/navbar.html:81 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:203 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:204 #: templates/InvenTree/search.html:300 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37 #: users/models.py:42 @@ -2263,7 +2263,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:378 templates/js/stock.js:1083 +#: company/views.py:378 templates/js/stock.js:1087 msgid "Create new Supplier Part" msgstr "" @@ -2713,8 +2713,8 @@ msgstr "" #: order/templates/order/purchase_order_detail.html:45 #: order/templates/order/purchase_order_detail.html:125 #: part/templates/part/category.html:197 part/templates/part/category.html:239 -#: stock/templates/stock/location.html:191 templates/js/stock.js:704 -#: templates/js/stock.js:1088 +#: stock/templates/stock/location.html:191 templates/js/stock.js:708 +#: templates/js/stock.js:1092 msgid "New Location" msgstr "" @@ -3242,7 +3242,7 @@ msgstr "" #: part/models.py:83 part/templates/part/category.html:19 #: part/templates/part/category.html:90 part/templates/part/category.html:141 -#: templates/InvenTree/search.html:126 templates/stats.html:39 +#: templates/InvenTree/search.html:126 templates/stats.html:52 #: users/models.py:37 msgid "Part Categories" msgstr "" @@ -3675,7 +3675,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:584 -#: templates/js/stock.js:1077 +#: templates/js/stock.js:1081 msgid "Create New Part" msgstr "" @@ -3844,7 +3844,7 @@ msgid "Export Data" msgstr "" #: part/templates/part/category.html:198 -#: stock/templates/stock/location.html:192 templates/js/stock.js:705 +#: stock/templates/stock/location.html:192 templates/js/stock.js:709 msgid "Create new location" msgstr "" @@ -4085,7 +4085,7 @@ msgid "Edit" msgstr "" #: part/templates/part/params.html:44 part/templates/part/related.html:44 -#: part/templates/part/supplier.html:22 stock/views.py:1002 users/models.py:175 +#: part/templates/part/supplier.html:22 stock/views.py:1002 users/models.py:182 msgid "Delete" msgstr "" @@ -4628,7 +4628,7 @@ msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:905 +#: templates/js/order.js:195 templates/js/stock.js:909 msgid "Date" msgstr "" @@ -4651,7 +4651,7 @@ msgid "Moved {n} parts to {loc}" msgstr "" #: stock/forms.py:114 stock/forms.py:406 stock/models.py:473 -#: stock/templates/stock/item_base.html:349 templates/js/stock.js:652 +#: stock/templates/stock/item_base.html:349 templates/js/stock.js:656 msgid "Expiry Date" msgstr "" @@ -5085,11 +5085,11 @@ msgid "Remove stock" msgstr "" #: stock/templates/stock/item_base.html:169 -msgid "Transfer stock" +msgid "Serialize stock" msgstr "" -#: stock/templates/stock/item_base.html:172 -msgid "Serialize stock" +#: stock/templates/stock/item_base.html:173 +msgid "Transfer stock" msgstr "" #: stock/templates/stock/item_base.html:176 @@ -5100,7 +5100,7 @@ msgstr "" msgid "Return to stock" msgstr "" -#: stock/templates/stock/item_base.html:183 templates/js/stock.js:1218 +#: stock/templates/stock/item_base.html:183 templates/js/stock.js:1222 msgid "Uninstall stock item" msgstr "" @@ -5153,7 +5153,7 @@ msgstr "" msgid "This StockItem expires on" msgstr "" -#: stock/templates/stock/item_base.html:362 templates/js/stock.js:658 +#: stock/templates/stock/item_base.html:362 templates/js/stock.js:662 msgid "Last Updated" msgstr "" @@ -5266,7 +5266,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:110 templates/InvenTree/search.html:263 -#: templates/stats.html:52 users/models.py:39 +#: templates/stats.html:65 users/models.py:39 msgid "Stock Locations" msgstr "" @@ -5451,7 +5451,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:171 +#: stock/views.py:1001 users/models.py:178 msgid "Add" msgstr "" @@ -5581,35 +5581,35 @@ msgstr "" msgid "Recently Updated" msgstr "" -#: templates/InvenTree/index.html:143 +#: templates/InvenTree/index.html:144 msgid "Expired Stock" msgstr "" -#: templates/InvenTree/index.html:144 +#: templates/InvenTree/index.html:145 msgid "Stale Stock" msgstr "" -#: templates/InvenTree/index.html:182 +#: templates/InvenTree/index.html:183 msgid "Build Orders In Progress" msgstr "" -#: templates/InvenTree/index.html:183 +#: templates/InvenTree/index.html:184 msgid "Overdue Build Orders" msgstr "" -#: templates/InvenTree/index.html:204 +#: templates/InvenTree/index.html:205 msgid "Outstanding Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:205 +#: templates/InvenTree/index.html:206 msgid "Overdue Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:227 +#: templates/InvenTree/index.html:228 msgid "Outstanding Sales Orders" msgstr "" -#: templates/InvenTree/index.html:228 +#: templates/InvenTree/index.html:229 msgid "Overdue Sales Orders" msgstr "" @@ -5621,11 +5621,11 @@ msgstr "" msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:252 templates/js/stock.js:301 +#: templates/InvenTree/search.html:252 templates/js/stock.js:300 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:255 templates/js/stock.js:311 +#: templates/InvenTree/search.html:255 templates/js/stock.js:310 msgid "No stock location set" msgstr "" @@ -5700,7 +5700,7 @@ msgid "Edit setting" msgstr "" #: templates/InvenTree/settings/settings.html:7 -#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:76 +#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:78 msgid "Settings" msgstr "" @@ -5797,30 +5797,38 @@ msgid "InvenTree Version" msgstr "" #: templates/about.html:26 -msgid "Django Version" +msgid "Up to Date" msgstr "" -#: templates/about.html:30 -msgid "Commit Hash" +#: templates/about.html:28 +msgid "Update Available" msgstr "" #: templates/about.html:34 -msgid "Commit Date" +msgid "Django Version" msgstr "" -#: templates/about.html:38 -msgid "InvenTree Documentation" -msgstr "" - -#: templates/about.html:43 -msgid "View Code on GitHub" +#: templates/about.html:41 +msgid "Commit Hash" msgstr "" #: templates/about.html:48 -msgid "Get the App" +msgid "Commit Date" msgstr "" #: templates/about.html:53 +msgid "InvenTree Documentation" +msgstr "" + +#: templates/about.html:58 +msgid "View Code on GitHub" +msgstr "" + +#: templates/about.html:63 +msgid "Get the App" +msgstr "" + +#: templates/about.html:68 msgid "Submit Bug Report" msgstr "" @@ -6018,8 +6026,8 @@ msgstr "" msgid "No builds matching query" msgstr "" -#: templates/js/build.js:649 templates/js/part.js:323 templates/js/stock.js:512 -#: templates/js/stock.js:1250 +#: templates/js/build.js:649 templates/js/part.js:323 templates/js/stock.js:511 +#: templates/js/stock.js:1254 msgid "Select" msgstr "" @@ -6371,115 +6379,115 @@ msgstr "" msgid "Test Date" msgstr "" -#: templates/js/stock.js:293 +#: templates/js/stock.js:292 msgid "In production" msgstr "" -#: templates/js/stock.js:297 +#: templates/js/stock.js:296 msgid "Installed in Stock Item" msgstr "" -#: templates/js/stock.js:305 +#: templates/js/stock.js:304 msgid "Assigned to Sales Order" msgstr "" -#: templates/js/stock.js:337 +#: templates/js/stock.js:336 msgid "No stock items matching query" msgstr "" -#: templates/js/stock.js:479 +#: templates/js/stock.js:478 msgid "Undefined location" msgstr "" -#: templates/js/stock.js:575 +#: templates/js/stock.js:579 msgid "Stock item is in production" msgstr "" -#: templates/js/stock.js:580 +#: templates/js/stock.js:584 msgid "Stock item assigned to sales order" msgstr "" -#: templates/js/stock.js:583 +#: templates/js/stock.js:587 msgid "Stock item assigned to customer" msgstr "" -#: templates/js/stock.js:587 +#: templates/js/stock.js:591 msgid "Stock item has expired" msgstr "" -#: templates/js/stock.js:589 +#: templates/js/stock.js:593 msgid "Stock item will expire soon" msgstr "" -#: templates/js/stock.js:593 +#: templates/js/stock.js:597 msgid "Stock item has been allocated" msgstr "" -#: templates/js/stock.js:597 +#: templates/js/stock.js:601 msgid "Stock item has been installed in another item" msgstr "" -#: templates/js/stock.js:605 +#: templates/js/stock.js:609 msgid "Stock item has been rejected" msgstr "" -#: templates/js/stock.js:609 +#: templates/js/stock.js:613 msgid "Stock item is lost" msgstr "" -#: templates/js/stock.js:612 +#: templates/js/stock.js:616 msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:616 templates/js/table_filters.js:116 +#: templates/js/stock.js:620 templates/js/table_filters.js:116 msgid "Depleted" msgstr "" -#: templates/js/stock.js:645 +#: templates/js/stock.js:649 msgid "Stocktake" msgstr "" -#: templates/js/stock.js:821 +#: templates/js/stock.js:825 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:836 +#: templates/js/stock.js:840 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:850 +#: templates/js/stock.js:854 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:851 +#: templates/js/stock.js:855 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:969 +#: templates/js/stock.js:973 msgid "No user information" msgstr "" -#: templates/js/stock.js:979 +#: templates/js/stock.js:983 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:980 +#: templates/js/stock.js:984 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1089 +#: templates/js/stock.js:1093 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1188 +#: templates/js/stock.js:1192 msgid "Serial" msgstr "" -#: templates/js/stock.js:1281 templates/js/table_filters.js:149 +#: templates/js/stock.js:1285 templates/js/table_filters.js:149 msgid "Installed" msgstr "" -#: templates/js/stock.js:1306 +#: templates/js/stock.js:1310 msgid "Install item" msgstr "" @@ -6705,23 +6713,19 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:63 -msgid "InvenTree server issues detected" -msgstr "" - -#: templates/navbar.html:69 users/models.py:36 +#: templates/navbar.html:71 users/models.py:36 msgid "Admin" msgstr "" -#: templates/navbar.html:71 templates/registration/logout.html:5 +#: templates/navbar.html:73 templates/registration/logout.html:5 msgid "Logout" msgstr "" -#: templates/navbar.html:73 templates/registration/login.html:89 +#: templates/navbar.html:75 templates/registration/login.html:89 msgid "Login" msgstr "" -#: templates/navbar.html:85 +#: templates/navbar.html:94 msgid "About InvenTree" msgstr "" @@ -6761,18 +6765,30 @@ msgstr "" msgid "Instance Name" msgstr "" -#: templates/stats.html:18 +#: templates/stats.html:19 msgid "Server status" msgstr "" -#: templates/stats.html:21 +#: templates/stats.html:22 msgid "Healthy" msgstr "" -#: templates/stats.html:23 +#: templates/stats.html:24 msgid "Issues detected" msgstr "" +#: templates/stats.html:30 +msgid "Background Worker" +msgstr "" + +#: templates/stats.html:33 +msgid "Operational" +msgstr "" + +#: templates/stats.html:35 +msgid "Not running" +msgstr "" + #: templates/stock_table.html:14 msgid "Export Stock Information" msgstr "" @@ -6857,34 +6873,34 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:158 +#: users/models.py:165 msgid "Permission set" msgstr "" -#: users/models.py:166 +#: users/models.py:173 msgid "Group" msgstr "" -#: users/models.py:169 +#: users/models.py:176 msgid "View" msgstr "" -#: users/models.py:169 +#: users/models.py:176 msgid "Permission to view items" msgstr "" -#: users/models.py:171 +#: users/models.py:178 msgid "Permission to add items" msgstr "" -#: users/models.py:173 +#: users/models.py:180 msgid "Change" msgstr "" -#: users/models.py:173 +#: users/models.py:180 msgid "Permissions to edit items" msgstr "" -#: users/models.py:175 +#: users/models.py:182 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index a245f9d67c..54222b7e67 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -735,6 +735,15 @@ class PartParameterList(generics.ListCreateAPIView): ] +class PartParameterDetail(generics.RetrieveUpdateDestroyAPIView): + """ + API endpoint for detail view of a single PartParameter object + """ + + queryset = PartParameter.objects.all() + serializer_class = part_serializers.PartParameterSerializer + + class BomList(generics.ListCreateAPIView): """ API endpoint for accessing a list of BomItem objects. @@ -942,6 +951,8 @@ part_api_urls = [ # Base URL for PartParameter API endpoints url(r'^parameter/', include([ url(r'^template/$', PartParameterTemplateList.as_view(), name='api-part-param-template-list'), + + url(r'^(?P\d+)/', PartParameterDetail.as_view(), name='api-part-param-detail'), url(r'^.*$', PartParameterList.as_view(), name='api-part-param-list'), ])), diff --git a/InvenTree/part/fixtures/params.yaml b/InvenTree/part/fixtures/params.yaml index e65c7335cc..3056be473b 100644 --- a/InvenTree/part/fixtures/params.yaml +++ b/InvenTree/part/fixtures/params.yaml @@ -33,6 +33,27 @@ template: 1 data: 12 +- model: part.PartParameter + pk: 3 + fields: + part: 3 + template: 1 + data: 12 + +- model: part.PartParameter + pk: 4 + fields: + part: 3 + template: 2 + data: 12 + +- model: part.PartParameter + pk: 5 + fields: + part: 3 + template: 3 + data: 12 + # Add some template parameters to categories (requires category.yaml) - model: part.PartCategoryParameterTemplate pk: 1 diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index faadf26c15..ed88e1dd55 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -325,3 +325,106 @@ class PartAPIAggregationTest(InvenTreeAPITestCase): self.assertEqual(data['in_stock'], 1100) self.assertEqual(data['stock_item_count'], 105) + + +class PartParameterTest(InvenTreeAPITestCase): + """ + Tests for the ParParameter API + """ + + superuser = True + + fixtures = [ + 'category', + 'part', + 'location', + 'params', + ] + + def setUp(self): + + super().setUp() + + def test_list_params(self): + """ + Test for listing part parameters + """ + + url = reverse('api-part-param-list') + + response = self.client.get(url, format='json') + + self.assertEqual(len(response.data), 5) + + # Filter by part + response = self.client.get( + url, + { + 'part': 3, + }, + format='json' + ) + + self.assertEqual(len(response.data), 3) + + # Filter by template + response = self.client.get( + url, + { + 'template': 1, + }, + format='json', + ) + + self.assertEqual(len(response.data), 3) + + def test_create_param(self): + """ + Test that we can create a param via the API + """ + + url = reverse('api-part-param-list') + + response = self.client.post( + url, + { + 'part': '2', + 'template': '3', + 'data': 70 + } + ) + + self.assertEqual(response.status_code, 201) + + response = self.client.get(url, format='json') + + self.assertEqual(len(response.data), 6) + + def test_param_detail(self): + """ + Tests for the PartParameter detail endpoint + """ + + url = reverse('api-part-param-detail', kwargs={'pk': 5}) + + response = self.client.get(url) + + self.assertEqual(response.status_code, 200) + + data = response.data + + self.assertEqual(data['pk'], 5) + self.assertEqual(data['part'], 3) + self.assertEqual(data['data'], '12') + + # PATCH data back in + response = self.client.patch(url, {'data': '15'}, format='json') + + self.assertEqual(response.status_code, 200) + + # Check that the data changed! + response = self.client.get(url, format='json') + + data = response.data + + self.assertEqual(data['data'], '15') diff --git a/InvenTree/templates/registration/logged_out.html b/InvenTree/templates/registration/logged_out.html new file mode 100644 index 0000000000..b23ba001e2 --- /dev/null +++ b/InvenTree/templates/registration/logged_out.html @@ -0,0 +1,59 @@ +{% load static %} +{% load i18n %} +{% load crispy_forms_tags %} + + + + + + + + + + + + + + + + + + + + + + + + + InvenTree + + + + + + + + \ No newline at end of file diff --git a/InvenTree/templates/registration/login.html b/InvenTree/templates/registration/login.html index a3f7b91e35..37eda9a103 100644 --- a/InvenTree/templates/registration/login.html +++ b/InvenTree/templates/registration/login.html @@ -89,7 +89,12 @@ + + {% if email_configured %} +

+

{% trans "Forgotten your password?" %} - {% trans "Click here to reset" %}

+ {% endif %} diff --git a/InvenTree/templates/registration/logout.html b/InvenTree/templates/registration/logout.html deleted file mode 100644 index 1ce04b6472..0000000000 --- a/InvenTree/templates/registration/logout.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends "base.html" %} -{% load i18n %} - -{% block content %} -

{% trans "Logout" %}

-

{% trans "You have been logged out" %}

-

{% trans 'Click' %} {% trans 'here to log in

' %} -{% endblock %} \ No newline at end of file diff --git a/InvenTree/templates/registration/password_reset_complete.html b/InvenTree/templates/registration/password_reset_complete.html new file mode 100644 index 0000000000..7fc83d85ba --- /dev/null +++ b/InvenTree/templates/registration/password_reset_complete.html @@ -0,0 +1,59 @@ +{% load static %} +{% load i18n %} +{% load crispy_forms_tags %} + + + + + + + + + + + + + + + + + + + + + + + + + InvenTree + + + + + + + + \ No newline at end of file diff --git a/InvenTree/templates/registration/password_reset_confirm.html b/InvenTree/templates/registration/password_reset_confirm.html new file mode 100644 index 0000000000..455baea698 --- /dev/null +++ b/InvenTree/templates/registration/password_reset_confirm.html @@ -0,0 +1,69 @@ +{% load static %} +{% load i18n %} +{% load crispy_forms_tags %} + + + + + + + + + + + + + + + + + + + + + + + + + InvenTree + + + + + + + + \ No newline at end of file diff --git a/InvenTree/templates/registration/password_reset_done.html b/InvenTree/templates/registration/password_reset_done.html new file mode 100644 index 0000000000..04e0aec69b --- /dev/null +++ b/InvenTree/templates/registration/password_reset_done.html @@ -0,0 +1,65 @@ +{% load static %} +{% load i18n %} +{% load crispy_forms_tags %} + + + + + + + + + + + + + + + + + + + + + + + + + InvenTree + + + + + + + + \ No newline at end of file diff --git a/InvenTree/templates/registration/password_reset_form.html b/InvenTree/templates/registration/password_reset_form.html new file mode 100644 index 0000000000..dabada5651 --- /dev/null +++ b/InvenTree/templates/registration/password_reset_form.html @@ -0,0 +1,68 @@ +{% load static %} +{% load i18n %} +{% load crispy_forms_tags %} + + + + + + + + + + + + + + + + + + + + + + + + + InvenTree + + + + + + + + \ No newline at end of file diff --git a/InvenTree/templates/stats.html b/InvenTree/templates/stats.html index 30d3f3d881..eff9c4504f 100644 --- a/InvenTree/templates/stats.html +++ b/InvenTree/templates/stats.html @@ -25,18 +25,29 @@ {% endif %} + {% if not django_q_running %} {% trans "Background Worker" %} - {% if django_q_running %} - {% trans "Operational" %} - {% else %} - {% trans "Not running" %} - {% endif %} + + {% trans "Background worker not running" %} + {% endif %} + {% if not email_configured %} + + + {% trans "Email Settings" %} + + + {% trans "Email settings not configured" %} + + + + {% endif %} + {% endif %} {% if not system_healthy %} {% for issue in system_issues %} diff --git a/README.md b/README.md index 0a8cfa1749..e841b713b7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -[![Docker Pulls](https://img.shields.io/docker/pulls/inventree/inventree)](https://hub.docker.com/inventree/inventree) +[![Docker Pulls](https://img.shields.io/docker/pulls/inventree/inventree)](https://hub.docker.com/r/inventree/inventree) [![Coverage Status](https://coveralls.io/repos/github/inventree/InvenTree/badge.svg)](https://coveralls.io/github/inventree/InvenTree) ![PEP](https://github.com/inventree/inventree/actions/workflows/style.yaml/badge.svg) ![Docker Build](https://github.com/inventree/inventree/actions/workflows/docker_build.yaml/badge.svg)