From 934078a42cb8995bd578a4d4462c022fc33aadeb Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 19 Oct 2020 22:36:14 +1100 Subject: [PATCH 01/18] Add "Reference" field to Build model --- .../build/migrations/0018_build_reference.py | 64 +++++++++++++++++++ InvenTree/build/models.py | 9 +++ 2 files changed, 73 insertions(+) create mode 100644 InvenTree/build/migrations/0018_build_reference.py diff --git a/InvenTree/build/migrations/0018_build_reference.py b/InvenTree/build/migrations/0018_build_reference.py new file mode 100644 index 0000000000..bcf4f9b9d4 --- /dev/null +++ b/InvenTree/build/migrations/0018_build_reference.py @@ -0,0 +1,64 @@ +# Generated by Django 3.0.7 on 2020-10-19 11:25 + +from django.db import migrations, models + + +def add_default_reference(apps, schema_editor): + """ + Add a "default" build-order reference for any existing build orders. + Best we can do is use the PK of the build order itself. + """ + + Build = apps.get_model('build', 'Build') + + count = 0 + + for build in Build.objects.all(): + + build.reference = str(build.pk) + build.save() + count += 1 + + print(f"\nUpdated build reference for {count} existing BuildOrder objects") + + +def reverse_default_reference(apps, schema_editor): + """ + Do nothing! But we need to have a function here so the whole process is reversible. + """ + pass + + +class Migration(migrations.Migration): + + dependencies = [ + ('build', '0017_auto_20200426_0612'), + ] + + operations = [ + # Initial operation - create a 'reference' field for the Build object: + migrations.AddField( + model_name='build', + name='reference', + field=models.CharField(help_text='Build Order Reference', blank=True, max_length=64, unique=False, verbose_name='Reference'), + ), + + # Auto-populate the new reference field for any existing build order objects + migrations.RunPython( + add_default_reference, + reverse_code=reverse_default_reference + ), + + # Now that each build has a non-empty, unique reference, update the field requirements! + migrations.AlterField( + model_name='build', + name='reference', + field=models.CharField( + help_text='Build Order Reference', + max_length=64, + blank=False, + unique=True, + verbose_name='Reference' + ) + ) + ] diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 35870adde4..11d06d96e7 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -34,6 +34,7 @@ class Build(MPTTModel): Attributes: part: The part to be built (from component BOM items) + reference: Build order reference (required, must be unique) title: Brief title describing the build (required) quantity: Number of units to be built parent: Reference to a Build object for which this Build is required @@ -69,6 +70,14 @@ class Build(MPTTModel): except PartModels.Part.DoesNotExist: pass + reference = models.CharField( + unique=True, + max_length=64, + blank=False, + help_text=_('Build Order Reference'), + verbose_name=_('Reference'), + ) + title = models.CharField( verbose_name=_('Build Title'), blank=False, From a8d47c54f98787793a0288f4e0fc068e44f89322 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 19 Oct 2020 22:40:19 +1100 Subject: [PATCH 02/18] Upate admin interface --- InvenTree/build/admin.py | 7 +++---- InvenTree/build/models.py | 4 ++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/InvenTree/build/admin.py b/InvenTree/build/admin.py index b47d38e36d..86592c7a81 100644 --- a/InvenTree/build/admin.py +++ b/InvenTree/build/admin.py @@ -10,17 +10,16 @@ from .models import Build, BuildItem class BuildAdmin(ImportExportModelAdmin): list_display = ( + 'reference', + 'title', 'part', 'status', 'batch', 'quantity', - 'creation_date', - 'completion_date', - 'title', - 'notes', ) search_fields = [ + 'reference', 'title', 'part__name', 'part__description', diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 11d06d96e7..c29692f861 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -48,6 +48,10 @@ class Build(MPTTModel): notes: Text notes """ + class Meta: + verbose_name = _("Build Order") + verbose_name_plural = _("Build Orders") + def __str__(self): return "{q} x {part}".format(q=decimal2string(self.quantity), part=str(self.part.full_name)) From 0b7cf9e7f3fa09fb7971edb0a2202f0178596ebe Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 19 Oct 2020 22:49:28 +1100 Subject: [PATCH 03/18] Add "reference" to build order forms --- InvenTree/build/forms.py | 15 ++++++++++++++- InvenTree/build/views.py | 2 +- InvenTree/order/forms.py | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/InvenTree/build/forms.py b/InvenTree/build/forms.py index f60c257cef..5ef3579f89 100644 --- a/InvenTree/build/forms.py +++ b/InvenTree/build/forms.py @@ -17,14 +17,27 @@ class EditBuildForm(HelperForm): """ Form for editing a Build object. """ + field_prefix = { + 'reference': 'BO', + 'link': 'fa-link', + 'batch': 'fa-layer-group', + 'location': 'fa-map-marker-alt', + } + + field_placeholder = { + 'reference': _('Build Order reference') + } + + class Meta: model = Build fields = [ + 'reference', 'title', 'part', + 'quantity', 'parent', 'sales_order', - 'quantity', 'take_from', 'batch', 'link', diff --git a/InvenTree/build/views.py b/InvenTree/build/views.py index b2b8b24502..88d5cdd7ad 100644 --- a/InvenTree/build/views.py +++ b/InvenTree/build/views.py @@ -400,7 +400,7 @@ class BuildCreate(AjaxCreateView): model = Build context_object_name = 'build' form_class = forms.EditBuildForm - ajax_form_title = _('Start new Build') + ajax_form_title = _('New Build Order') ajax_template_name = 'modal_form.html' role_required = 'build.add' diff --git a/InvenTree/order/forms.py b/InvenTree/order/forms.py index ca61bd77be..1f412271e0 100644 --- a/InvenTree/order/forms.py +++ b/InvenTree/order/forms.py @@ -96,7 +96,7 @@ class EditPurchaseOrderForm(HelperForm): } self.field_placeholder = { - 'reference': _('Enter purchase order number'), + 'reference': _('Purchase Order reference'), } super().__init__(*args, **kwargs) From 5405ad566e368e853fbc91ef43e60b8f823fa4f4 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 19 Oct 2020 22:53:40 +1100 Subject: [PATCH 04/18] Add 'reference' to API serializer --- InvenTree/build/serializers.py | 1 + InvenTree/templates/js/build.html | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/InvenTree/build/serializers.py b/InvenTree/build/serializers.py index 6480004699..53e75942f0 100644 --- a/InvenTree/build/serializers.py +++ b/InvenTree/build/serializers.py @@ -41,6 +41,7 @@ class BuildSerializer(InvenTreeModelSerializer): 'completion_date', 'part', 'part_detail', + 'reference', 'sales_order', 'quantity', 'status', diff --git a/InvenTree/templates/js/build.html b/InvenTree/templates/js/build.html index e36e15ddeb..027d8d9d5e 100644 --- a/InvenTree/templates/js/build.html +++ b/InvenTree/templates/js/build.html @@ -35,13 +35,19 @@ function loadBuildTable(table, options) { switchable: false, }, { - field: 'title', + field: 'reference', title: '{% trans "Build" %}', sortable: true, + switchable: false, formatter: function(value, row, index, field) { return renderLink(value, '/build/' + row.pk + '/'); } }, + { + field: 'title', + title: '{% trans "Description" %}', + sortable: true, + }, { field: 'part', title: '{% trans "Part" %}', From b5d15aab08db9bf2f1a0215bed2e7388078106ac Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 19 Oct 2020 23:22:09 +1100 Subject: [PATCH 05/18] Add function to "predict" next build order reference value --- InvenTree/build/models.py | 37 +++++++++++++++++++++++++++++++++++-- InvenTree/build/views.py | 2 ++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index c29692f861..4fdbc6afc9 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -22,7 +22,7 @@ from markdownx.models import MarkdownxField from mptt.models import MPTTModel, TreeForeignKey from InvenTree.status_codes import BuildStatus -from InvenTree.helpers import decimal2string +from InvenTree.helpers import decimal2string, increment import InvenTree.fields from stock import models as StockModels @@ -53,7 +53,8 @@ class Build(MPTTModel): verbose_name_plural = _("Build Orders") def __str__(self): - return "{q} x {part}".format(q=decimal2string(self.quantity), part=str(self.part.full_name)) + + return f"BO{self.reference}" def get_absolute_url(self): return reverse('build-detail', kwargs={'pk': self.id}) @@ -178,6 +179,38 @@ class Build(MPTTModel): def output_count(self): return self.build_outputs.count() + @classmethod + def getNextBuildNumber(cls): + """ + Try to predict the next Build Order reference: + """ + + if cls.objects.count() == 0: + return None + + build = cls.objects.last() + ref = build.reference + + if not ref: + return None + + tries = set() + + while 1: + new_ref = increment(ref) + + if new_ref in tries: + # We are potentially stuck in a loop - simply return the original reference + return ref + + if cls.objects.filter(reference=new_ref).exists(): + tries.add(new_ref) + new_ref = increment(new_ref) + else: + break + + return new_ref + @transaction.atomic def cancelBuild(self, user): """ Mark the Build as CANCELLED diff --git a/InvenTree/build/views.py b/InvenTree/build/views.py index 88d5cdd7ad..1296e42fae 100644 --- a/InvenTree/build/views.py +++ b/InvenTree/build/views.py @@ -415,6 +415,8 @@ class BuildCreate(AjaxCreateView): # User has provided a Part ID initials['part'] = self.request.GET.get('part', None) + initials['reference'] = Build.getNextBuildNumber() + initials['parent'] = self.request.GET.get('parent', None) # User has provided a SalesOrder ID From 9b7a9a3ee0c3189b74186baaf3ccd53106f8e09d Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 19 Oct 2020 23:23:16 +1100 Subject: [PATCH 06/18] Update formatting of order pages --- InvenTree/build/forms.py | 1 - InvenTree/build/models.py | 2 +- .../build/templates/build/build_base.html | 25 +++---- .../order/templates/order/order_base.html | 68 +++++++++---------- .../templates/order/sales_order_base.html | 13 ++-- 5 files changed, 54 insertions(+), 55 deletions(-) diff --git a/InvenTree/build/forms.py b/InvenTree/build/forms.py index 5ef3579f89..74227adb9c 100644 --- a/InvenTree/build/forms.py +++ b/InvenTree/build/forms.py @@ -28,7 +28,6 @@ class EditBuildForm(HelperForm): 'reference': _('Build Order reference') } - class Meta: model = Build fields = [ diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 4fdbc6afc9..40666d5fce 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -22,7 +22,7 @@ from markdownx.models import MarkdownxField from mptt.models import MPTTModel, TreeForeignKey from InvenTree.status_codes import BuildStatus -from InvenTree.helpers import decimal2string, increment +from InvenTree.helpers import increment import InvenTree.fields from stock import models as StockModels diff --git a/InvenTree/build/templates/build/build_base.html b/InvenTree/build/templates/build/build_base.html index f076013def..68fd28101d 100644 --- a/InvenTree/build/templates/build/build_base.html +++ b/InvenTree/build/templates/build/build_base.html @@ -5,18 +5,18 @@ {% load status_codes %} {% block page_title %} -InvenTree | {% trans "Build" %} - {{ build }} +InvenTree | {% trans "Build Order" %} - {{ build }} {% endblock %} {% block pre_content %} {% if build.sales_order %}
- {% trans "This build is allocated to Sales Order" %} {{ build.sales_order }} + {% trans "This Build Order is allocated to Sales Order" %} {{ build.sales_order }}
{% endif %} {% if build.parent %}
- {% trans "This build is a child of Build" %} {{ build.parent }} + {% trans "This Build Order is a child of Build Order" %} {{ build.parent }}
{% endif %} {% endblock %} @@ -31,14 +31,15 @@ src="{% static 'img/blank_image.png' %}" {% endblock %} {% block page_data %} -

{% trans "Build" %} {% build_status_label build.status large=True %}

-
-

- {{ build.quantity }} x {{ build.part.full_name }} +

+ {% trans "Build Order" %} {{ build }} {% if user.is_staff and roles.build.change %} -{% endif %} -

+ {% endif %} + +

{% build_status_label build.status large=True %}

+
+

{{ build.title }}

{% if roles.build.change %} @@ -68,9 +69,9 @@ src="{% static 'img/blank_image.png' %}"

{% trans "Build Details" %}

- - - + + + diff --git a/InvenTree/order/templates/order/order_base.html b/InvenTree/order/templates/order/order_base.html index 3b199c1840..d3e1e02437 100644 --- a/InvenTree/order/templates/order/order_base.html +++ b/InvenTree/order/templates/order/order_base.html @@ -20,46 +20,44 @@ src="{% static 'img/blank_image.png' %}" {% endblock %} {% block page_data %} -

{% trans "Purchase Order" %} {% purchase_order_status_label order.status large=True %}

-
-

- {{ order }} +

+ {% trans "Purchase Order" %} {{ order.reference }} {% if user.is_staff and roles.purchase_order.change %} {% endif %} -

+ +

{% purchase_order_status_label order.status large=True %}

+

{{ order.description }}

-

-

-
- {% if roles.purchase_order.change %} - - {% if order.status == PurchaseOrderStatus.PENDING and order.lines.count > 0 %} - - {% elif order.status == PurchaseOrderStatus.PLACED %} - - - {% endif %} - {% if order.status == PurchaseOrderStatus.PENDING or order.status == PurchaseOrderStatus.PLACED %} - - {% endif %} - {% endif %} - -
+
+
+ {% if roles.purchase_order.change %} + + {% if order.status == PurchaseOrderStatus.PENDING and order.lines.count > 0 %} + + {% elif order.status == PurchaseOrderStatus.PLACED %} + + + {% endif %} + {% if order.status == PurchaseOrderStatus.PENDING or order.status == PurchaseOrderStatus.PLACED %} + + {% endif %} + {% endif %} +
-

+
{% endblock %} {% block page_details %} diff --git a/InvenTree/order/templates/order/sales_order_base.html b/InvenTree/order/templates/order/sales_order_base.html index 2eb13eaa64..59ff0eeda8 100644 --- a/InvenTree/order/templates/order/sales_order_base.html +++ b/InvenTree/order/templates/order/sales_order_base.html @@ -27,17 +27,18 @@ src="{% static 'img/blank_image.png' %}" /> {% endblock %} - {% block page_data %} -

{% trans "Sales Order" %} {% sales_order_status_label order.status large=True %}

-
-

- {{ order }} +

+ {% trans "Sales Order" %} {{ order.reference }} {% if user.is_staff and roles.sales_order.change %} {% endif %} -

+ +

+ {% sales_order_status_label order.status large=True %} +

+

{{ order.description }}

From c13cee2407d6b6de686ed6309e7591b5d73016eb Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 19 Oct 2020 23:31:52 +1100 Subject: [PATCH 07/18] Fixes for unit testing --- InvenTree/build/fixtures/build.yaml | 2 ++ InvenTree/build/tests.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/InvenTree/build/fixtures/build.yaml b/InvenTree/build/fixtures/build.yaml index 532d502098..0ac5d00a20 100644 --- a/InvenTree/build/fixtures/build.yaml +++ b/InvenTree/build/fixtures/build.yaml @@ -5,6 +5,7 @@ fields: part: 25 batch: 'B1' + reference: "0001" title: 'Building 7 parts' quantity: 7 notes: 'Some simple notes' @@ -20,6 +21,7 @@ pk: 2 fields: part: 50 + reference: "0002" title: 'Making things' batch: 'B2' status: 40 # COMPLETE diff --git a/InvenTree/build/tests.py b/InvenTree/build/tests.py index 92ca034a4a..ded98a441c 100644 --- a/InvenTree/build/tests.py +++ b/InvenTree/build/tests.py @@ -54,7 +54,7 @@ class BuildTestSimple(TestCase): self.assertEqual(b.batch, 'B2') self.assertEqual(b.quantity, 21) - self.assertEqual(str(b), '21 x Orphan') + self.assertEqual(str(b), 'BO0002') def test_url(self): b1 = Build.objects.get(pk=1) From 92c1e3c1a573b13f386f2cae89b8158071a115b6 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 19 Oct 2020 23:50:39 +1100 Subject: [PATCH 08/18] Update settings pages --- InvenTree/InvenTree/urls.py | 7 ++- .../templates/InvenTree/settings/build.html | 14 +++++ .../InvenTree/settings/currency.html | 9 ++- .../templates/InvenTree/settings/other.html | 7 +++ .../templates/InvenTree/settings/part.html | 5 ++ .../templates/InvenTree/settings/po.html | 13 +++++ .../InvenTree/settings/settings.html | 11 +++- .../templates/InvenTree/settings/so.html | 13 +++++ .../templates/InvenTree/settings/stock.html | 13 +++++ .../templates/InvenTree/settings/tabs.html | 36 +++++++++--- .../templates/InvenTree/settings/theme.html | 6 +- .../templates/InvenTree/settings/user.html | 58 ++++++++++--------- 12 files changed, 149 insertions(+), 43 deletions(-) create mode 100644 InvenTree/templates/InvenTree/settings/build.html create mode 100644 InvenTree/templates/InvenTree/settings/po.html create mode 100644 InvenTree/templates/InvenTree/settings/so.html create mode 100644 InvenTree/templates/InvenTree/settings/stock.html diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index d718871851..bc0316cca0 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -69,9 +69,14 @@ apipatterns = [ settings_urls = [ url(r'^user/?', SettingsView.as_view(template_name='InvenTree/settings/user.html'), name='settings-user'), + url(r'^theme/?', ColorThemeSelectView.as_view(), name='settings-theme'), + url(r'^currency/?', SettingsView.as_view(template_name='InvenTree/settings/currency.html'), name='settings-currency'), url(r'^part/?', SettingsView.as_view(template_name='InvenTree/settings/part.html'), name='settings-part'), - url(r'^theme/?', ColorThemeSelectView.as_view(), name='settings-theme'), + url(r'^stock/?', SettingsView.as_view(template_name='InvenTree/settings/stock.html'), name='settings-stock'), + url(r'^build/?', SettingsView.as_view(template_name='InvenTree/settings/build.html'), name='settings-build'), + url(r'^purchase-order/?', SettingsView.as_view(template_name='InvenTree/settings/po.html'), name='settings-po'), + url(r'^sales-order/?', SettingsView.as_view(template_name='InvenTree/settings/so.html'), name='settings-so'), url(r'^other/?', SettingsView.as_view(template_name='InvenTree/settings/other.html'), name='settings-other'), # Catch any other urls diff --git a/InvenTree/templates/InvenTree/settings/build.html b/InvenTree/templates/InvenTree/settings/build.html new file mode 100644 index 0000000000..3197d60fa5 --- /dev/null +++ b/InvenTree/templates/InvenTree/settings/build.html @@ -0,0 +1,14 @@ +{% extends "InvenTree/settings/settings.html" %} +{% load i18n %} + +{% block tabs %} +{% include "InvenTree/settings/tabs.html" with tab='build' %} +{% endblock %} + +{% block subtitle %} +{% trans "Build Order Settings" %} +{% endblock %} + +{% block settings %} + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/templates/InvenTree/settings/currency.html b/InvenTree/templates/InvenTree/settings/currency.html index c585011ecd..99948eeeb1 100644 --- a/InvenTree/templates/InvenTree/settings/currency.html +++ b/InvenTree/templates/InvenTree/settings/currency.html @@ -1,4 +1,9 @@ {% extends "InvenTree/settings/settings.html" %} +{% load i18n %} + +{% block subtitle %} +{% trans "General Settings" %} +{% endblock %} {% block tabs %} {% include "InvenTree/settings/tabs.html" with tab='currency' %} @@ -6,10 +11,10 @@ {% block settings %} -

Currencies

+

{% trans "Currencies" %}

- +
{% trans "Build Title" %}{{ build.title }}{% trans "Build Order Reference" %}{{ build.reference }}
diff --git a/InvenTree/templates/InvenTree/settings/other.html b/InvenTree/templates/InvenTree/settings/other.html index 2f6207b170..c518074fd0 100644 --- a/InvenTree/templates/InvenTree/settings/other.html +++ b/InvenTree/templates/InvenTree/settings/other.html @@ -1,9 +1,16 @@ {% extends "InvenTree/settings/settings.html" %} +{% load i18n %} + {% block tabs %} {% include "InvenTree/settings/tabs.html" with tab='other' %} {% endblock %} + +{% block subtitle %} +{% trans "Other Settings" %} +{% endblock %} + {% block settings %}

InvenTree Settings

diff --git a/InvenTree/templates/InvenTree/settings/part.html b/InvenTree/templates/InvenTree/settings/part.html index 5eba81a72a..7c028ca6d6 100644 --- a/InvenTree/templates/InvenTree/settings/part.html +++ b/InvenTree/templates/InvenTree/settings/part.html @@ -5,7 +5,12 @@ {% include "InvenTree/settings/tabs.html" with tab='part' %} {% endblock %} +{% block subtitle %} +{% trans "Part Settings" %} +{% endblock %} + {% block settings %} +

{% trans "Part Parameter Templates" %}

diff --git a/InvenTree/templates/InvenTree/settings/po.html b/InvenTree/templates/InvenTree/settings/po.html new file mode 100644 index 0000000000..7d32611404 --- /dev/null +++ b/InvenTree/templates/InvenTree/settings/po.html @@ -0,0 +1,13 @@ +{% extends "InvenTree/settings/settings.html" %} +{% load i18n %} + +{% block tabs %} +{% include "InvenTree/settings/tabs.html" with tab='po' %} +{% endblock %} + +{% block subtitle %} +{% trans "Purchase Order Settings" %} +{% endblock %} + +{% block settings %} +{% endblock %} \ No newline at end of file diff --git a/InvenTree/templates/InvenTree/settings/settings.html b/InvenTree/templates/InvenTree/settings/settings.html index dab7ec277b..90adfd5fed 100644 --- a/InvenTree/templates/InvenTree/settings/settings.html +++ b/InvenTree/templates/InvenTree/settings/settings.html @@ -1,15 +1,16 @@ {% extends "base.html" %} +{% load i18n %} {% load static %} {% block page_title %} -InvenTree | Settings +InvenTree | {% trans "Settings" %} {% endblock %} {% block content %}
-

InvenTree Settings

+

InvenTree {% trans "Settings" %}


@@ -19,6 +20,12 @@ InvenTree | Settings
+

+ {% block subtitle %} + SUBTITLE GOES HERE + {% endblock %} +

+
{% block settings %} {% endblock %}
diff --git a/InvenTree/templates/InvenTree/settings/so.html b/InvenTree/templates/InvenTree/settings/so.html new file mode 100644 index 0000000000..e66fd85148 --- /dev/null +++ b/InvenTree/templates/InvenTree/settings/so.html @@ -0,0 +1,13 @@ +{% extends "InvenTree/settings/settings.html" %} +{% load i18n %} + +{% block tabs %} +{% include "InvenTree/settings/tabs.html" with tab='so' %} +{% endblock %} + +{% block subtitle %} +{% trans "Sales Order Settings" %} +{% endblock %} + +{% block settings %} +{% endblock %} \ No newline at end of file diff --git a/InvenTree/templates/InvenTree/settings/stock.html b/InvenTree/templates/InvenTree/settings/stock.html new file mode 100644 index 0000000000..c3c40087ff --- /dev/null +++ b/InvenTree/templates/InvenTree/settings/stock.html @@ -0,0 +1,13 @@ +{% extends "InvenTree/settings/settings.html" %} +{% load i18n %} + +{% block tabs %} +{% include "InvenTree/settings/tabs.html" with tab='stock' %} +{% endblock %} + +{% block subtitle %} +{% trans "Stock Settings" %} +{% endblock %} + +{% block settings %} +{% endblock %} \ No newline at end of file diff --git a/InvenTree/templates/InvenTree/settings/tabs.html b/InvenTree/templates/InvenTree/settings/tabs.html index 8719d29c81..67207fde52 100644 --- a/InvenTree/templates/InvenTree/settings/tabs.html +++ b/InvenTree/templates/InvenTree/settings/tabs.html @@ -1,19 +1,37 @@ +{% load i18n %} + +

{% trans "User Settings" %}

+

{% trans "InvenTree Settings" %}

+ \ No newline at end of file diff --git a/InvenTree/templates/InvenTree/settings/theme.html b/InvenTree/templates/InvenTree/settings/theme.html index 90f148b468..413bb67dd3 100644 --- a/InvenTree/templates/InvenTree/settings/theme.html +++ b/InvenTree/templates/InvenTree/settings/theme.html @@ -6,11 +6,15 @@ {% include "InvenTree/settings/tabs.html" with tab='theme' %} {% endblock %} +{% block subtitle %} +{% trans "Theme Settings" %} +{% endblock %} + {% block settings %}
-

Color Themes

+

{% trans "Color Themes" %}

diff --git a/InvenTree/templates/InvenTree/settings/user.html b/InvenTree/templates/InvenTree/settings/user.html index 7dcef2bc90..28ab8746cb 100644 --- a/InvenTree/templates/InvenTree/settings/user.html +++ b/InvenTree/templates/InvenTree/settings/user.html @@ -1,41 +1,43 @@ {% extends "InvenTree/settings/settings.html" %} +{% load i18n %} + {% block tabs %} {% include "InvenTree/settings/tabs.html" with tab='user' %} {% endblock %} +{% block subtitle %} +{% trans "User Settings" %} +{% endblock %} + {% block settings %} -
-
-

User Information

+
+

{% trans "User Information" %}

+
+
Edit
+
Set Password
-
-
-
Edit
-
Set Password
-
-
-
-
- - - - - - - - - - - - - - - - -
Username{{ user.username }}
First Name{{ user.first_name }}
Last Name{{ user.last_name }}
Email Address{{ user.email }}
+ + + + + + + + + + + + + + + + + +
{% trans "Username" %}{{ user.username }}
{% trans "First Name" %}{{ user.first_name }}
{% trans "Last Name" %}{{ user.last_name }}
{% trans "Email Address" %}{{ user.email }}
+
{% endblock %} From 06040f94eeb00236481a0faae8a2247217d5c002 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Oct 2020 00:02:54 +1100 Subject: [PATCH 09/18] Remove "description" field from InvenTreeSettings key:value fields --- InvenTree/common/admin.py | 2 +- InvenTree/common/apps.py | 49 +------------------ InvenTree/common/kvp.yaml | 16 ------ ...008_remove_inventreesetting_description.py | 17 +++++++ InvenTree/common/models.py | 2 - 5 files changed, 19 insertions(+), 67 deletions(-) delete mode 100644 InvenTree/common/kvp.yaml create mode 100644 InvenTree/common/migrations/0008_remove_inventreesetting_description.py diff --git a/InvenTree/common/admin.py b/InvenTree/common/admin.py index cb643deca4..da12852d83 100644 --- a/InvenTree/common/admin.py +++ b/InvenTree/common/admin.py @@ -14,7 +14,7 @@ class CurrencyAdmin(ImportExportModelAdmin): class SettingsAdmin(ImportExportModelAdmin): - list_display = ('key', 'value', 'description') + list_display = ('key', 'value') admin.site.register(Currency, CurrencyAdmin) diff --git a/InvenTree/common/apps.py b/InvenTree/common/apps.py index 4661c69370..83b299ecdf 100644 --- a/InvenTree/common/apps.py +++ b/InvenTree/common/apps.py @@ -1,10 +1,6 @@ from django.apps import AppConfig from django.db.utils import OperationalError, ProgrammingError -import os -import uuid -import yaml - class CommonConfig(AppConfig): name = 'common' @@ -12,46 +8,8 @@ class CommonConfig(AppConfig): def ready(self): """ Will be called when the Common app is first loaded """ - self.populate_default_settings() self.add_instance_name() - def populate_default_settings(self): - """ Populate the default values for InvenTree key:value pairs. - If a setting does not exist, it will be created. - """ - - # Import this here, rather than at the global-level, - # otherwise it is called all the time, and we don't want that, - # as the InvenTreeSetting model may have not been instantiated yet. - from .models import InvenTreeSetting - - here = os.path.dirname(os.path.abspath(__file__)) - settings_file = os.path.join(here, 'kvp.yaml') - - with open(settings_file) as kvp: - values = yaml.safe_load(kvp) - - for value in values: - key = value['key'] - default = value['default'] - description = value['description'] - - try: - # If a particular setting does not exist in the database, create it now - if not InvenTreeSetting.objects.filter(key=key).exists(): - setting = InvenTreeSetting( - key=key, - value=default, - description=description - ) - - setting.save() - - print("Creating new key: '{k}' = '{v}'".format(k=key, v=default)) - except (OperationalError, ProgrammingError): - # Migrations have not yet been applied - table does not exist - break - def add_instance_name(self): """ Check if an InstanceName has been defined for this database. @@ -64,14 +22,9 @@ class CommonConfig(AppConfig): try: if not InvenTreeSetting.objects.filter(key='InstanceName').exists(): - val = uuid.uuid4().hex - - print("No 'InstanceName' found - generating random name '{n}'".format(n=val)) - name = InvenTreeSetting( key="InstanceName", - value=val, - description="Instance name for this InvenTree database installation." + value="InvenTree Server" ) name.save() diff --git a/InvenTree/common/kvp.yaml b/InvenTree/common/kvp.yaml deleted file mode 100644 index d0f7249dff..0000000000 --- a/InvenTree/common/kvp.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# This file contains the default values for the key:value settings available in InvenTree -# This file should not be edited locally. - -# Note: The description strings provided here will be translatable, -# so ensure that any translations are provided as appropriate. - -# TODO: Update the formatting here to include logical separators e.g. double-underscore -# TODO: This is so when there are enough options, we will be able to display them as a tree - -- key: 'part_ipn_regex' - default: '' - description: 'Format string for internal part number' - -- key: part_deep_copy - default: True - description: 'Parts are deep-copied by default' \ No newline at end of file diff --git a/InvenTree/common/migrations/0008_remove_inventreesetting_description.py b/InvenTree/common/migrations/0008_remove_inventreesetting_description.py new file mode 100644 index 0000000000..d7889ced17 --- /dev/null +++ b/InvenTree/common/migrations/0008_remove_inventreesetting_description.py @@ -0,0 +1,17 @@ +# Generated by Django 3.0.7 on 2020-10-19 13:02 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('common', '0007_colortheme'), + ] + + operations = [ + migrations.RemoveField( + model_name='inventreesetting', + name='description', + ), + ] diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index b0a836118d..1a76183e59 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -76,8 +76,6 @@ class InvenTreeSetting(models.Model): value = models.CharField(max_length=200, blank=True, unique=False, help_text=_('Settings value')) - description = models.CharField(max_length=200, blank=True, unique=False, help_text=_('Settings description')) - def validate_unique(self, exclude=None): """ Ensure that the key:value pair is unique. In addition to the base validators, this ensures that the 'key' From a5639c380f79b60585a325823db997f2dd9a7b18 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Oct 2020 00:13:43 +1100 Subject: [PATCH 10/18] Add regex validator to build order reference field --- InvenTree/InvenTree/validators.py | 42 +++++++++++++++++++ .../migrations/0019_auto_20201019_1302.py | 23 ++++++++++ InvenTree/build/models.py | 5 +++ 3 files changed, 70 insertions(+) create mode 100644 InvenTree/build/migrations/0019_auto_20201019_1302.py diff --git a/InvenTree/InvenTree/validators.py b/InvenTree/InvenTree/validators.py index 548bce12ab..be96affbbd 100644 --- a/InvenTree/InvenTree/validators.py +++ b/InvenTree/InvenTree/validators.py @@ -52,6 +52,48 @@ def validate_part_ipn(value): raise ValidationError(_('IPN must match regex pattern') + " '{pat}'".format(pat=pattern)) +def validate_build_order_reference(value): + """ + Validate the 'reference' field of a BuildOrder + """ + + pattern = common.models.InvenTreeSetting.get_setting('buildorder_reference_regex') + + if pattern: + match = re.search(pattern, value) + + if match is None: + raise ValidationError(_('Reference must match pattern') + f" '{pattern}'") + + +def validate_purchase_order_reference(value): + """ + Validate the 'reference' field of a PurchaseOrder + """ + + pattern = common.models.InvenTreeSetting.get_setting('purchaseorder_reference_regex') + + if pattern: + match = re.search(pattern, value) + + if match is None: + raise ValidationError(_('Reference must match pattern') + f" '{pattern}'") + + +def validate_sales_order_reference(value): + """ + Validate the 'reference' field of a SalesOrder + """ + + pattern = common.models.InvenTreeSetting.get_setting('salesorder_reference_regex') + + if pattern: + match = re.search(pattern, value) + + if match is None: + raise ValidationError(_('Reference must match pattern') + f" '{pattern}'") + + def validate_tree_name(value): """ Prevent illegal characters in tree item names """ diff --git a/InvenTree/build/migrations/0019_auto_20201019_1302.py b/InvenTree/build/migrations/0019_auto_20201019_1302.py new file mode 100644 index 0000000000..c767d3a3d9 --- /dev/null +++ b/InvenTree/build/migrations/0019_auto_20201019_1302.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.7 on 2020-10-19 13:02 + +import InvenTree.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('build', '0018_build_reference'), + ] + + operations = [ + migrations.AlterModelOptions( + name='build', + options={'verbose_name': 'Build Order', 'verbose_name_plural': 'Build Orders'}, + ), + migrations.AlterField( + model_name='build', + name='reference', + field=models.CharField(help_text='Build Order Reference', max_length=64, unique=True, validators=[InvenTree.validators.validate_build_order_reference], verbose_name='Reference'), + ), + ] diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 40666d5fce..62f6cdea09 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -23,6 +23,8 @@ from mptt.models import MPTTModel, TreeForeignKey from InvenTree.status_codes import BuildStatus from InvenTree.helpers import increment +from InvenTree.validators import validate_build_order_reference + import InvenTree.fields from stock import models as StockModels @@ -81,6 +83,9 @@ class Build(MPTTModel): blank=False, help_text=_('Build Order Reference'), verbose_name=_('Reference'), + validators=[ + validate_build_order_reference + ] ) title = models.CharField( From e8a0095e500635709b206961aab9ccecb1becb0b Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Oct 2020 00:24:33 +1100 Subject: [PATCH 11/18] Add some options for the build order settings page - Not editable yet --- .../part/templatetags/inventree_extras.py | 2 +- .../templates/InvenTree/settings/build.html | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index 3eca883aea..2c175003d0 100644 --- a/InvenTree/part/templatetags/inventree_extras.py +++ b/InvenTree/part/templatetags/inventree_extras.py @@ -88,7 +88,7 @@ def inventree_docs_url(*args, **kwargs): @register.simple_tag() def inventree_setting(key, *args, **kwargs): - return InvenTreeSetting.get_setting(key) + return InvenTreeSetting.get_setting(key, backup_value=kwargs.get('backup', None)) @register.simple_tag() diff --git a/InvenTree/templates/InvenTree/settings/build.html b/InvenTree/templates/InvenTree/settings/build.html index 3197d60fa5..e72536ce6f 100644 --- a/InvenTree/templates/InvenTree/settings/build.html +++ b/InvenTree/templates/InvenTree/settings/build.html @@ -1,5 +1,6 @@ {% extends "InvenTree/settings/settings.html" %} {% load i18n %} +{% load inventree_extras %} {% block tabs %} {% include "InvenTree/settings/tabs.html" with tab='build' %} @@ -11,4 +12,21 @@ {% block settings %} + + + + + + + + + + + + + + + +
{% trans "Reference Prefix" %}{% inventree_setting 'buildorder_reference_prefix' backup='PO' %}{% trans "Prefix for Build Order reference" %}
{% trans "Reference Regex" %}{% inventree_setting 'buildorder_reference_regex' %}{% trans "Regex validator for Build Order reference" %}
+ {% endblock %} \ No newline at end of file From 98d20bceeb523866c23793a86d673084b9d946b2 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Oct 2020 00:26:26 +1100 Subject: [PATCH 12/18] Change "Build Title" to "Description" --- .../migrations/0020_auto_20201019_1325.py | 18 ++++++++++++++++++ InvenTree/build/models.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 InvenTree/build/migrations/0020_auto_20201019_1325.py diff --git a/InvenTree/build/migrations/0020_auto_20201019_1325.py b/InvenTree/build/migrations/0020_auto_20201019_1325.py new file mode 100644 index 0000000000..1406530c8d --- /dev/null +++ b/InvenTree/build/migrations/0020_auto_20201019_1325.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.7 on 2020-10-19 13:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('build', '0019_auto_20201019_1302'), + ] + + operations = [ + migrations.AlterField( + model_name='build', + name='title', + field=models.CharField(help_text='Brief description of the build', max_length=100, verbose_name='Description'), + ), + ] diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 62f6cdea09..196b25978c 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -89,7 +89,7 @@ class Build(MPTTModel): ) title = models.CharField( - verbose_name=_('Build Title'), + verbose_name=_('Description'), blank=False, max_length=100, help_text=_('Brief description of the build') From c6e61c20fe8f2f7a35a76f985923081614ee6b09 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Oct 2020 08:24:23 +1100 Subject: [PATCH 13/18] Generate default settings for all InvenTreeSetting object --- InvenTree/InvenTree/validators.py | 8 +-- InvenTree/InvenTree/version.py | 2 +- InvenTree/common/apps.py | 68 +++++++++++++++++-- InvenTree/common/forms.py | 16 ++++- InvenTree/common/models.py | 32 ++++++++- InvenTree/common/views.py | 11 +++ InvenTree/part/views.py | 6 +- .../templates/InvenTree/settings/build.html | 4 +- 8 files changed, 128 insertions(+), 19 deletions(-) diff --git a/InvenTree/InvenTree/validators.py b/InvenTree/InvenTree/validators.py index be96affbbd..e85dc40810 100644 --- a/InvenTree/InvenTree/validators.py +++ b/InvenTree/InvenTree/validators.py @@ -43,7 +43,7 @@ def validate_part_name(value): def validate_part_ipn(value): """ Validate the Part IPN against regex rule """ - pattern = common.models.InvenTreeSetting.get_setting('part_ipn_regex') + pattern = common.models.InvenTreeSetting.get_setting('PART_IPN_REGEX') if pattern: match = re.search(pattern, value) @@ -57,7 +57,7 @@ def validate_build_order_reference(value): Validate the 'reference' field of a BuildOrder """ - pattern = common.models.InvenTreeSetting.get_setting('buildorder_reference_regex') + pattern = common.models.InvenTreeSetting.get_setting('BUILDORDER_REFERENCE_REGEX') if pattern: match = re.search(pattern, value) @@ -71,7 +71,7 @@ def validate_purchase_order_reference(value): Validate the 'reference' field of a PurchaseOrder """ - pattern = common.models.InvenTreeSetting.get_setting('purchaseorder_reference_regex') + pattern = common.models.InvenTreeSetting.get_setting('PURCHASEORDER_REFERENCE_REGEX') if pattern: match = re.search(pattern, value) @@ -85,7 +85,7 @@ def validate_sales_order_reference(value): Validate the 'reference' field of a SalesOrder """ - pattern = common.models.InvenTreeSetting.get_setting('salesorder_reference_regex') + pattern = common.models.InvenTreeSetting.get_setting('SALESORDER_REFERENCE_REGEX') if pattern: match = re.search(pattern, value) diff --git a/InvenTree/InvenTree/version.py b/InvenTree/InvenTree/version.py index 827769c32a..1e545cc68e 100644 --- a/InvenTree/InvenTree/version.py +++ b/InvenTree/InvenTree/version.py @@ -12,7 +12,7 @@ INVENTREE_SW_VERSION = "0.1.4 pre" def inventreeInstanceName(): """ Returns the InstanceName settings for the current database """ - return common.models.InvenTreeSetting.get_setting("InstanceName", "") + return common.models.InvenTreeSetting.get_setting("INVENTREE_INSTANCE", "") def inventreeVersion(): diff --git a/InvenTree/common/apps.py b/InvenTree/common/apps.py index 83b299ecdf..7106c1b746 100644 --- a/InvenTree/common/apps.py +++ b/InvenTree/common/apps.py @@ -9,6 +9,7 @@ class CommonConfig(AppConfig): """ Will be called when the Common app is first loaded """ self.add_instance_name() + self.add_default_settings() def add_instance_name(self): """ @@ -19,15 +20,70 @@ class CommonConfig(AppConfig): # See note above from .models import InvenTreeSetting + """ + Note: The "old" instance name was stored under the key 'InstanceName', + but has now been renamed to 'INVENTREE_INSTANCE'. + """ + try: - if not InvenTreeSetting.objects.filter(key='InstanceName').exists(): - name = InvenTreeSetting( - key="InstanceName", - value="InvenTree Server" - ) + # Quick exit if a value already exists for 'inventree_instance' + if InvenTreeSetting.objects.filter(key='INVENTREE_INSTANCE').exists(): + return + + # Default instance name + instance_name = 'InvenTree Server' + + # Use the old name if it exists + if InvenTreeSetting.objects.filter(key='InstanceName').exists(): + instance = InvenTreeSetting.objects.get(key='InstanceName') + instance_name = instance.value + + # Create new value + InvenTreeSetting.objects.create( + key='INVENTREE_INSTANCE', + value=instance_name + ) - name.save() except (OperationalError, ProgrammingError): # Migrations have not yet been applied - table does not exist pass + + def add_default_settings(self): + """ + Create all required settings, if they do not exist. + """ + + from .models import InvenTreeSetting + + for key in InvenTreeSetting.DEFAULT_VALUES.keys(): + try: + settings = InvenTreeSetting.objects.filter(key__iexact=key) + + if settings.count() == 0: + value = InvenTreeSetting.DEFAULT_VALUES[key] + + print(f"Creating default setting for {key} -> '{value}'") + + InvenTreeSetting.objects.create( + key=key, + value=value + ) + + return + + elif settings.count() > 1: + # Prevent multiple shadow copies of the same setting! + for setting in settings[1:]: + setting.delete() + + # Ensure that the key has the correct case + setting = settings[0] + + if not setting.key == key: + setting.key = key + setting.save() + + except (OperationalError, ProgrammingError): + # Table might not yet exist + pass diff --git a/InvenTree/common/forms.py b/InvenTree/common/forms.py index 00e6c15c7f..53493faff0 100644 --- a/InvenTree/common/forms.py +++ b/InvenTree/common/forms.py @@ -7,7 +7,7 @@ from __future__ import unicode_literals from InvenTree.forms import HelperForm -from .models import Currency +from .models import Currency, InvenTreeSetting class CurrencyEditForm(HelperForm): @@ -22,3 +22,17 @@ class CurrencyEditForm(HelperForm): 'value', 'base' ] + + +class SettingEditForm(HelperForm): + """ + Form for creating / editing a settings object + """ + + class Meta: + model = InvenTreeSetting + + fields = [ + 'key', + 'value' + ] diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 1a76183e59..0c110d1366 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -27,6 +27,30 @@ class InvenTreeSetting(models.Model): even if that key does not exist. """ + # Dict of default values for various internal settings + DEFAULT_VALUES = { + # Global inventree settings + 'INVENTREE_INSTANCE': 'InvenTree Server', + + # Part settings + 'PART_IPN_REGEX': '', + 'PART_COPY_BOM': True, + 'PART_COPY_PARAMETERS': True, + 'PART_COPY_TESTS': True, + + # Stock settings + + # Build Order settings + 'BUILDORDER_REFERENCE_PREFIX': 'BO', + 'BUILDORDER_REFERENCE_REGEX': '', + + # Purchase Order Settings + 'PURCHASEORDER_REFERENCE_PREFIX': 'PO', + + # Sales Order Settings + 'SALESORDER_REFERENCE_PREFIX': 'SO', + } + class Meta: verbose_name = "InvenTree Setting" verbose_name_plural = "InvenTree Settings" @@ -39,8 +63,12 @@ class InvenTreeSetting(models.Model): """ try: - setting = InvenTreeSetting.objects.get(key__iexact=key) - return setting.value + settings = InvenTreeSetting.objects.filter(key__iexact=key) + + if len(settings) > 0: + return settings[0].value + else: + return backup_value except InvenTreeSetting.DoesNotExist: return backup_value diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index 5da634c6d3..a205b8b915 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -35,3 +35,14 @@ class CurrencyDelete(AjaxDeleteView): model = models.Currency ajax_form_title = _('Delete Currency') ajax_template_name = "common/delete_currency.html" + + +class SettingEdit(AjaxUpdateView): + """ + View for editing an InvenTree key:value settings object, + (or creating it if the key does not already exist) + """ + + model = models.InvenTreeSetting + ajax_form_title = _('Change Setting') + form_class = forms.SettingEditForm diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 6498774285..a1ce33df51 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -493,9 +493,9 @@ class PartDuplicate(AjaxCreateView): else: initials = super(AjaxCreateView, self).get_initial() - initials['bom_copy'] = str2bool(InvenTreeSetting.get_setting('part_deep_copy', True)) - # Create new entry in InvenTree/common/kvp.yaml? - initials['parameters_copy'] = str2bool(InvenTreeSetting.get_setting('part_deep_copy', True)) + initials['bom_copy'] = str2bool(InvenTreeSetting.get_setting('PART_COPY_BOM', True)) + + initials['parameters_copy'] = str2bool(InvenTreeSetting.get_setting('PART_COPY_PARAMETERS', True)) return initials diff --git a/InvenTree/templates/InvenTree/settings/build.html b/InvenTree/templates/InvenTree/settings/build.html index e72536ce6f..6d19e21f1a 100644 --- a/InvenTree/templates/InvenTree/settings/build.html +++ b/InvenTree/templates/InvenTree/settings/build.html @@ -17,12 +17,12 @@ {% trans "Reference Prefix" %} - {% inventree_setting 'buildorder_reference_prefix' backup='PO' %} + {% inventree_setting 'BUILDORDER_REFERENCE_PREFIX' backup='BO' %} {% trans "Prefix for Build Order reference" %} {% trans "Reference Regex" %} - {% inventree_setting 'buildorder_reference_regex' %} + {% inventree_setting 'BUILDORDER_REFERENCE_REGEX' %} {% trans "Regex validator for Build Order reference" %} From 226a91718bdf40e0d35232bc4636f0a9bbb279a7 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Oct 2020 08:29:06 +1100 Subject: [PATCH 14/18] Add a simple unit test for the settings model --- InvenTree/common/models.py | 2 +- InvenTree/common/tests.py | 32 +++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 0c110d1366..731c37c6ce 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -97,7 +97,7 @@ class InvenTreeSetting(models.Model): else: return - setting.value = value + setting.value = str(value) setting.save() key = models.CharField(max_length=50, blank=False, unique=True, help_text=_('Settings key (must be unique - case insensitive')) diff --git a/InvenTree/common/tests.py b/InvenTree/common/tests.py index 5c6171a65c..a5d32dc3d6 100644 --- a/InvenTree/common/tests.py +++ b/InvenTree/common/tests.py @@ -2,8 +2,9 @@ from __future__ import unicode_literals from django.test import TestCase +from django.contrib.auth import get_user_model -from .models import Currency +from .models import Currency, InvenTreeSetting class CurrencyTest(TestCase): @@ -17,3 +18,32 @@ class CurrencyTest(TestCase): # Simple test for now (improve this later!) self.assertEqual(Currency.objects.count(), 2) + + +class SettingsTest(TestCase): + """ + Tests for the 'settings' model + """ + + def setUp(self): + + User = get_user_model() + + self.user = User.objects.create_user('username', 'user@email.com', 'password') + self.user.is_staff = True + self.user.save() + + self.client.login(username='username', password='password') + + def test_defaults(self): + """ + Populate the settings with default values + """ + + for key in InvenTreeSetting.DEFAULT_VALUES.keys(): + + value = InvenTreeSetting.DEFAULT_VALUES[key] + + InvenTreeSetting.set_setting(key, value, self.user) + + self.assertEqual(str(value), InvenTreeSetting.get_setting(key)) From 7aa473712fcdd52f8198a2a29b32535213b24cd6 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Oct 2020 08:32:00 +1100 Subject: [PATCH 15/18] Remove unused setting page --- InvenTree/InvenTree/urls.py | 1 - InvenTree/common/apps.py | 3 ++ .../templates/InvenTree/settings/other.html | 44 ------------------- .../templates/InvenTree/settings/tabs.html | 5 --- 4 files changed, 3 insertions(+), 50 deletions(-) delete mode 100644 InvenTree/templates/InvenTree/settings/other.html diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index bc0316cca0..0b4292cbd9 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -77,7 +77,6 @@ settings_urls = [ url(r'^build/?', SettingsView.as_view(template_name='InvenTree/settings/build.html'), name='settings-build'), url(r'^purchase-order/?', SettingsView.as_view(template_name='InvenTree/settings/po.html'), name='settings-po'), url(r'^sales-order/?', SettingsView.as_view(template_name='InvenTree/settings/so.html'), name='settings-so'), - url(r'^other/?', SettingsView.as_view(template_name='InvenTree/settings/other.html'), name='settings-other'), # Catch any other urls url(r'^.*$', SettingsView.as_view(template_name='InvenTree/settings/user.html'), name='settings'), diff --git a/InvenTree/common/apps.py b/InvenTree/common/apps.py index 7106c1b746..afdf845f15 100644 --- a/InvenTree/common/apps.py +++ b/InvenTree/common/apps.py @@ -39,6 +39,9 @@ class CommonConfig(AppConfig): instance = InvenTreeSetting.objects.get(key='InstanceName') instance_name = instance.value + # Delete the legacy key + instance.delete() + # Create new value InvenTreeSetting.objects.create( key='INVENTREE_INSTANCE', diff --git a/InvenTree/templates/InvenTree/settings/other.html b/InvenTree/templates/InvenTree/settings/other.html deleted file mode 100644 index c518074fd0..0000000000 --- a/InvenTree/templates/InvenTree/settings/other.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "InvenTree/settings/settings.html" %} - -{% load i18n %} - -{% block tabs %} -{% include "InvenTree/settings/tabs.html" with tab='other' %} -{% endblock %} - - -{% block subtitle %} -{% trans "Other Settings" %} -{% endblock %} - -{% block settings %} - -

InvenTree Settings

- - - - - - - - - - - {% for setting in settings %} - - - - - - {% endfor %} - -
SettingValueDescription
{{ setting.key }}{{ setting.value }}{{ setting.description }}
- -{% endblock %} - -{% block js_ready %} -{{ block.super }} - - $("#other-table").bootstrapTable(); - -{% endblock %} \ No newline at end of file diff --git a/InvenTree/templates/InvenTree/settings/tabs.html b/InvenTree/templates/InvenTree/settings/tabs.html index 67207fde52..ee402feb4f 100644 --- a/InvenTree/templates/InvenTree/settings/tabs.html +++ b/InvenTree/templates/InvenTree/settings/tabs.html @@ -29,9 +29,4 @@
  • {% trans "Sales Orders" %}
  • - {% if user.is_staff %} - - {% trans "Other" %} - - {% endif %} \ No newline at end of file From 406d7bcf807e6d9705d65f4dd9b6f713f3aeae02 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Oct 2020 08:41:08 +1100 Subject: [PATCH 16/18] Load build order prefix setting --- InvenTree/InvenTree/helpers.py | 9 +++++++++ InvenTree/build/models.py | 6 ++++-- InvenTree/build/templates/build/build_base.html | 2 +- InvenTree/common/models.py | 4 ++++ InvenTree/templates/js/build.html | 8 ++++++++ 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/InvenTree/InvenTree/helpers.py b/InvenTree/InvenTree/helpers.py index 13b770539c..da96c7ee79 100644 --- a/InvenTree/InvenTree/helpers.py +++ b/InvenTree/InvenTree/helpers.py @@ -19,9 +19,18 @@ from django.contrib.auth.models import Permission import InvenTree.version +from common.models import InvenTreeSetting from .settings import MEDIA_URL, STATIC_URL +def getSetting(key, backup_value=None): + """ + Shortcut for reading a setting value from the database + """ + + return InvenTreeSetting.get_setting(key, backup_value=backup_value) + + def generateTestKey(test_name): """ Generate a test 'key' for a given test name. diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 196b25978c..877affd144 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -22,7 +22,7 @@ from markdownx.models import MarkdownxField from mptt.models import MPTTModel, TreeForeignKey from InvenTree.status_codes import BuildStatus -from InvenTree.helpers import increment +from InvenTree.helpers import increment, getSetting from InvenTree.validators import validate_build_order_reference import InvenTree.fields @@ -56,7 +56,9 @@ class Build(MPTTModel): def __str__(self): - return f"BO{self.reference}" + prefix = getSetting("BUILDORDER_REFERENCE_PREFIX") + + return f"{prefix}{self.reference}" def get_absolute_url(self): return reverse('build-detail', kwargs={'pk': self.id}) diff --git a/InvenTree/build/templates/build/build_base.html b/InvenTree/build/templates/build/build_base.html index 68fd28101d..a366459908 100644 --- a/InvenTree/build/templates/build/build_base.html +++ b/InvenTree/build/templates/build/build_base.html @@ -71,7 +71,7 @@ src="{% static 'img/blank_image.png' %}" {% trans "Build Order Reference" %} - {{ build.reference }} + {{ build }} diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 731c37c6ce..31f8e12260 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -62,6 +62,10 @@ class InvenTreeSetting(models.Model): If it does not exist, return the backup value (default = None) """ + # If no backup value is specified, atttempt to retrieve a "default" value + if backup_value is None: + backup_value = InvenTreeSetting.DEFAULT_VALUES.get(key, None) + try: settings = InvenTreeSetting.objects.filter(key__iexact=key) diff --git a/InvenTree/templates/js/build.html b/InvenTree/templates/js/build.html index 027d8d9d5e..08d9ec2af9 100644 --- a/InvenTree/templates/js/build.html +++ b/InvenTree/templates/js/build.html @@ -1,4 +1,5 @@ {% load i18n %} +{% load inventree_extras %} function loadBuildTable(table, options) { // Display a table of Build objects @@ -40,6 +41,13 @@ function loadBuildTable(table, options) { sortable: true, switchable: false, formatter: function(value, row, index, field) { + + var prefix = "{% inventree_setting 'BUILDORDER_REFERENCE_PREFIX' 'BO' %}"; + + if (prefix) { + value = `${prefix}${value}`; + } + return renderLink(value, '/build/' + row.pk + '/'); } }, From 5a6697866f134bd3b080addd143743d9d7c9bf42 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Oct 2020 08:41:13 +1100 Subject: [PATCH 17/18] Update translations --- InvenTree/locale/de/LC_MESSAGES/django.mo | Bin 49430 -> 48994 bytes InvenTree/locale/de/LC_MESSAGES/django.po | 841 +++++++++++++--------- InvenTree/locale/en/LC_MESSAGES/django.po | 756 +++++++++++-------- InvenTree/locale/es/LC_MESSAGES/django.po | 756 +++++++++++-------- 4 files changed, 1399 insertions(+), 954 deletions(-) diff --git a/InvenTree/locale/de/LC_MESSAGES/django.mo b/InvenTree/locale/de/LC_MESSAGES/django.mo index 6391f0ae5a5d9db6fe8c2b5bbd59d2a7fd8e05ab..23c7009592698803ed21177e770f35ba3b7e9273 100644 GIT binary patch delta 15421 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 diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po index 7f955ffea2..10f223fcd4 100644 --- a/InvenTree/locale/de/LC_MESSAGES/django.po +++ b/InvenTree/locale/de/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-06 09:31+0000\n" +"POT-Creation-Date: 2020-10-19 21:40+0000\n" "PO-Revision-Date: 2020-05-03 11:32+0200\n" "Last-Translator: Christian Schlüter \n" "Language-Team: C \n" @@ -25,7 +25,7 @@ msgstr "Keine Aktion angegeben" msgid "No matching action found" msgstr "Keine passende Aktion gefunden" -#: InvenTree/forms.py:102 build/forms.py:37 +#: InvenTree/forms.py:102 build/forms.py:49 msgid "Confirm" msgstr "Bestätigen" @@ -49,35 +49,35 @@ msgstr "" msgid "Apply Theme" msgstr "" -#: InvenTree/helpers.py:339 order/models.py:187 order/models.py:261 +#: InvenTree/helpers.py:348 order/models.py:187 order/models.py:261 msgid "Invalid quantity provided" msgstr "Keine gültige Menge" -#: InvenTree/helpers.py:342 +#: InvenTree/helpers.py:351 msgid "Empty serial number string" msgstr "Keine Seriennummer angegeben" -#: InvenTree/helpers.py:363 +#: InvenTree/helpers.py:372 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "Doppelte Seriennummer: {n}" -#: InvenTree/helpers.py:367 InvenTree/helpers.py:370 InvenTree/helpers.py:373 +#: InvenTree/helpers.py:376 InvenTree/helpers.py:379 InvenTree/helpers.py:382 #, python-brace-format msgid "Invalid group: {g}" msgstr "Ungültige Gruppe: {g}" -#: InvenTree/helpers.py:378 +#: InvenTree/helpers.py:387 #, fuzzy, python-brace-format #| msgid "Duplicate serial: {n}" msgid "Duplicate serial: {g}" msgstr "Doppelte Seriennummer: {n}" -#: InvenTree/helpers.py:386 +#: InvenTree/helpers.py:395 msgid "No serial numbers found" msgstr "Keine Seriennummern gefunden" -#: InvenTree/helpers.py:390 +#: InvenTree/helpers.py:399 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" @@ -152,7 +152,7 @@ msgid "Returned" msgstr "Zurückgegeben" #: InvenTree/status_codes.py:136 -#: order/templates/order/sales_order_base.html:105 +#: order/templates/order/sales_order_base.html:106 msgid "Shipped" msgstr "Versendet" @@ -178,7 +178,7 @@ msgstr "" #: InvenTree/status_codes.py:223 build/templates/build/allocate.html:358 #: order/templates/order/sales_order_detail.html:221 -#: part/templates/part/tabs.html:23 templates/js/build.html:126 +#: part/templates/part/tabs.html:23 templates/js/build.html:140 msgid "Allocated" msgstr "Zugeordnet" @@ -190,20 +190,27 @@ msgstr "Ungültiger Buchstabe im Teilenamen" msgid "IPN must match regex pattern" msgstr "IPN muss zu Regex-Muster passen" -#: InvenTree/validators.py:60 +#: InvenTree/validators.py:66 InvenTree/validators.py:80 +#: InvenTree/validators.py:94 +#, fuzzy +#| msgid "IPN must match regex pattern" +msgid "Reference must match pattern" +msgstr "IPN muss zu Regex-Muster passen" + +#: InvenTree/validators.py:102 #, python-brace-format msgid "Illegal character in name ({x})" msgstr "Ungültiges Zeichen im Namen ({x})" -#: InvenTree/validators.py:79 InvenTree/validators.py:95 +#: InvenTree/validators.py:121 InvenTree/validators.py:137 msgid "Overage value must not be negative" msgstr "Ãœberschuss-Wert darf nicht negativ sein" -#: InvenTree/validators.py:97 +#: InvenTree/validators.py:139 msgid "Overage must not exceed 100%" msgstr "Ãœberschuss darf 100% nicht überschreiten" -#: InvenTree/validators.py:104 +#: InvenTree/validators.py:146 msgid "Overage must be an integer value or a percentage" msgstr "Ãœberschuss muss eine Ganzzahl oder ein Prozentwert sein" @@ -255,51 +262,93 @@ msgstr "" msgid "Barcode associated with StockItem" msgstr "Neues Lagerobjekt hinzufügen" -#: build/forms.py:58 +#: build/forms.py:28 +#, fuzzy +#| msgid "Order reference" +msgid "Build Order reference" +msgstr "Bestell-Referenz" + +#: build/forms.py:70 #, fuzzy #| msgid "Location Details" msgid "Location of completed parts" msgstr "Standort-Details" -#: build/forms.py:62 +#: build/forms.py:74 #, fuzzy #| msgid "Serial Number" msgid "Serial numbers" msgstr "Seriennummer" -#: build/forms.py:64 stock/forms.py:111 +#: build/forms.py:76 stock/forms.py:111 msgid "Enter unique serial numbers (or leave blank)" msgstr "Eindeutige Seriennummern eingeben (oder leer lassen)" -#: build/forms.py:67 +#: build/forms.py:79 msgid "Confirm build completion" msgstr "Bau-Fertigstellung bestätigen" -#: build/models.py:67 +#: build/models.py:54 build/templates/build/build_base.html:8 +#: build/templates/build/build_base.html:35 +#: part/templates/part/allocation.html:20 +#: stock/templates/stock/item_base.html:214 +msgid "Build Order" +msgstr "Bauauftrag" + +#: build/models.py:55 build/templates/build/index.html:6 +#: build/templates/build/index.html:14 order/templates/order/so_builds.html:11 +#: order/templates/order/so_tabs.html:9 part/templates/part/tabs.html:31 +#: templates/InvenTree/settings/tabs.html:24 users/models.py:30 +msgid "Build Orders" +msgstr "Bauaufträge" + +#: build/models.py:77 #, fuzzy #| msgid "Overage must be an integer value or a percentage" msgid "Build quantity must be integer value for trackable parts" msgstr "Ãœberschuss muss eine Ganzzahl oder ein Prozentwert sein" -#: build/models.py:73 build/templates/build/build_base.html:72 -msgid "Build Title" -msgstr "Bau-Titel" +#: build/models.py:86 build/templates/build/build_base.html:73 +#, fuzzy +#| msgid "Order Reference" +msgid "Build Order Reference" +msgstr "Bestellreferenz" -#: build/models.py:76 +#: build/models.py:87 build/templates/build/allocate.html:342 +#: order/templates/order/purchase_order_detail.html:172 +#: templates/js/bom.html:154 +msgid "Reference" +msgstr "Referenz" + +#: build/models.py:94 build/templates/build/allocate.html:337 +#: company/templates/company/supplier_part_base.html:53 +#: company/templates/company/supplier_part_detail.html:27 +#: order/templates/order/purchase_order_detail.html:159 +#: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 +#: templates/InvenTree/search.html:147 templates/js/bom.html:147 +#: templates/js/build.html:56 templates/js/company.html:56 +#: templates/js/order.html:159 templates/js/order.html:234 +#: templates/js/part.html:120 templates/js/part.html:203 +#: templates/js/part.html:345 templates/js/part.html:526 +#: templates/js/stock.html:444 templates/js/stock.html:671 +msgid "Description" +msgstr "Beschreibung" + +#: build/models.py:97 msgid "Brief description of the build" msgstr "Kurze Beschreibung des Baus" -#: build/models.py:84 build/templates/build/build_base.html:93 +#: build/models.py:105 build/templates/build/build_base.html:94 msgid "Parent Build" msgstr "Eltern-Bau" -#: build/models.py:85 +#: build/models.py:106 msgid "Parent build to which this build is allocated" msgstr "Eltern-Bau, dem dieser Bau zugewiesen ist" -#: build/models.py:90 build/templates/build/allocate.html:329 +#: build/models.py:111 build/templates/build/allocate.html:329 #: build/templates/build/auto_allocate.html:19 -#: build/templates/build/build_base.html:77 +#: build/templates/build/build_base.html:78 #: build/templates/build/detail.html:22 order/models.py:501 #: order/templates/order/order_wizard/select_parts.html:30 #: order/templates/order/purchase_order_detail.html:147 @@ -307,29 +356,29 @@ msgstr "Eltern-Bau, dem dieser Bau zugewiesen ist" #: part/templates/part/part_app_base.html:7 #: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133 #: templates/js/barcode.html:336 templates/js/bom.html:124 -#: templates/js/build.html:47 templates/js/company.html:137 +#: templates/js/build.html:61 templates/js/company.html:137 #: templates/js/part.html:184 templates/js/part.html:289 #: templates/js/stock.html:421 templates/js/stock.html:977 msgid "Part" msgstr "Teil" -#: build/models.py:99 +#: build/models.py:120 msgid "Select part to build" msgstr "Teil für den Bau wählen" -#: build/models.py:104 +#: build/models.py:125 msgid "Sales Order Reference" msgstr "Bestellungsreferenz" -#: build/models.py:108 +#: build/models.py:129 msgid "SalesOrder to which this build is allocated" msgstr "Bestellung, die diesem Bau zugwiesen ist" -#: build/models.py:113 +#: build/models.py:134 msgid "Source Location" msgstr "Quell-Standort" -#: build/models.py:117 +#: build/models.py:138 msgid "" "Select location to take stock from for this build (leave blank to take from " "any stock location)" @@ -337,44 +386,44 @@ msgstr "" "Lager-Entnahmestandort für diesen Bau wählen (oder leer lassen für einen " "beliebigen Lager-Standort)" -#: build/models.py:121 +#: build/models.py:142 msgid "Build Quantity" msgstr "Bau-Anzahl" -#: build/models.py:124 +#: build/models.py:145 msgid "Number of parts to build" msgstr "Anzahl der zu bauenden Teile" -#: build/models.py:128 part/templates/part/part_base.html:155 +#: build/models.py:149 part/templates/part/part_base.html:155 msgid "Build Status" msgstr "Bau-Status" -#: build/models.py:132 +#: build/models.py:153 msgid "Build status code" msgstr "Bau-Statuscode" -#: build/models.py:136 stock/models.py:387 +#: build/models.py:157 stock/models.py:387 msgid "Batch Code" msgstr "Losnummer" -#: build/models.py:140 +#: build/models.py:161 msgid "Batch code for this build output" msgstr "Chargennummer für diese Bau-Ausgabe" -#: build/models.py:155 build/templates/build/detail.html:55 +#: build/models.py:176 build/templates/build/detail.html:55 #: company/templates/company/supplier_part_base.html:60 #: company/templates/company/supplier_part_detail.html:24 #: part/templates/part/detail.html:80 part/templates/part/part_base.html:102 -#: stock/models.py:381 stock/templates/stock/item_base.html:244 +#: stock/models.py:381 stock/templates/stock/item_base.html:266 msgid "External Link" msgstr "Externer Link" -#: build/models.py:156 stock/models.py:383 +#: build/models.py:177 stock/models.py:383 msgid "Link to external URL" msgstr "Link zu einer externen URL" -#: build/models.py:160 build/templates/build/tabs.html:14 company/models.py:310 -#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15 +#: build/models.py:181 build/templates/build/tabs.html:14 company/models.py:310 +#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18 #: order/templates/order/purchase_order_detail.html:202 #: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:70 #: stock/forms.py:306 stock/forms.py:338 stock/forms.py:366 stock/models.py:453 @@ -384,42 +433,42 @@ msgstr "Link zu einer externen URL" msgid "Notes" msgstr "Notizen" -#: build/models.py:161 +#: build/models.py:182 msgid "Extra build notes" msgstr "Notizen für den Bau" -#: build/models.py:467 +#: build/models.py:520 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "Ausgewähltes Lagerobjekt nicht in BOM für Teil '{p}' gefunden" -#: build/models.py:470 +#: build/models.py:523 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" "zugewiesene Anzahl ({n}) darf nicht die verfügbare ({q}) Anzahl überschreiten" -#: build/models.py:476 order/models.py:585 +#: build/models.py:529 order/models.py:585 msgid "StockItem is over-allocated" msgstr "Zu viele Lagerobjekte zugewiesen" -#: build/models.py:479 order/models.py:588 +#: build/models.py:532 order/models.py:588 msgid "Allocation quantity must be greater than zero" msgstr "Anzahl muss größer null sein" -#: build/models.py:482 +#: build/models.py:535 msgid "Quantity must be 1 for serialized stock" msgstr "Anzahl muss 1 für Objekte mit Seriennummer sein" -#: build/models.py:511 +#: build/models.py:564 msgid "Build to allocate parts" msgstr "Bau starten um Teile zuzuweisen" -#: build/models.py:518 +#: build/models.py:571 msgid "Stock Item to allocate to build" msgstr "Lagerobjekt dem Bau zuweisen" -#: build/models.py:531 +#: build/models.py:584 msgid "Stock quantity to allocate to build" msgstr "Lagerobjekt-Anzahl dem Bau zuweisen" @@ -445,20 +494,20 @@ msgstr "Zuweisung aufheben" msgid "New Stock Item" msgstr "Neues Lagerobjekt" -#: build/templates/build/allocate.html:88 stock/views.py:1428 +#: build/templates/build/allocate.html:88 stock/views.py:1459 msgid "Create new Stock Item" msgstr "Neues Lagerobjekt hinzufügen" #: build/templates/build/allocate.html:170 #: order/templates/order/sales_order_detail.html:68 #: order/templates/order/sales_order_detail.html:150 stock/models.py:375 -#: stock/templates/stock/item_base.html:156 +#: stock/templates/stock/item_base.html:178 msgid "Serial Number" msgstr "Seriennummer" #: build/templates/build/allocate.html:172 #: build/templates/build/auto_allocate.html:20 -#: build/templates/build/build_base.html:82 +#: build/templates/build/build_base.html:83 #: build/templates/build/detail.html:27 #: company/templates/company/supplier_part_pricing.html:71 #: order/templates/order/order_wizard/select_parts.html:32 @@ -470,16 +519,16 @@ msgstr "Seriennummer" #: part/templates/part/sale_prices.html:80 stock/forms.py:297 #: stock/templates/stock/item_base.html:26 #: stock/templates/stock/item_base.html:32 -#: stock/templates/stock/item_base.html:162 +#: stock/templates/stock/item_base.html:184 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338 -#: templates/js/bom.html:162 templates/js/build.html:58 +#: templates/js/bom.html:162 templates/js/build.html:72 #: templates/js/stock.html:690 templates/js/stock.html:905 msgid "Quantity" msgstr "Anzahl" #: build/templates/build/allocate.html:186 #: build/templates/build/auto_allocate.html:21 stock/forms.py:336 -#: stock/templates/stock/item_base.html:198 +#: stock/templates/stock/item_base.html:220 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:183 templates/js/barcode.html:337 #: templates/js/stock.html:518 @@ -487,12 +536,12 @@ msgid "Location" msgstr "Standort" #: build/templates/build/allocate.html:210 -#: order/templates/order/sales_order_detail.html:92 templates/js/build.html:130 +#: order/templates/order/sales_order_detail.html:92 templates/js/build.html:144 msgid "Edit stock allocation" msgstr "Lagerobjekt-Standort bearbeiten" #: build/templates/build/allocate.html:211 -#: order/templates/order/sales_order_detail.html:93 templates/js/build.html:131 +#: order/templates/order/sales_order_detail.html:93 templates/js/build.html:145 msgid "Delete stock allocation" msgstr "Zuweisung löschen" @@ -500,26 +549,6 @@ msgstr "Zuweisung löschen" msgid "No BOM items found" msgstr "Keine BOM-Einträge gefunden" -#: build/templates/build/allocate.html:337 -#: company/templates/company/supplier_part_base.html:53 -#: company/templates/company/supplier_part_detail.html:27 -#: order/templates/order/purchase_order_detail.html:159 -#: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 -#: templates/InvenTree/search.html:147 templates/js/bom.html:147 -#: templates/js/company.html:56 templates/js/order.html:159 -#: templates/js/order.html:234 templates/js/part.html:120 -#: templates/js/part.html:203 templates/js/part.html:345 -#: templates/js/part.html:526 templates/js/stock.html:444 -#: templates/js/stock.html:671 -msgid "Description" -msgstr "Beschreibung" - -#: build/templates/build/allocate.html:342 -#: order/templates/order/purchase_order_detail.html:172 -#: templates/js/bom.html:154 -msgid "Reference" -msgstr "Referenz" - #: build/templates/build/allocate.html:347 part/models.py:1401 #: templates/js/part.html:530 templates/js/table_filters.html:121 msgid "Required" @@ -570,85 +599,81 @@ msgstr "Keine Lagerobjekt gefunden, die diesem Bau zugewiesen werden können" msgid "Stock items will have to be manually allocated" msgstr "Lagerobjekt wurde zugewiesen" -#: build/templates/build/build_base.html:8 -#: build/templates/build/build_base.html:34 -#: build/templates/build/complete.html:6 -#: stock/templates/stock/item_base.html:223 templates/js/build.html:39 -#: templates/navbar.html:25 -msgid "Build" -msgstr "Bau" - #: build/templates/build/build_base.html:14 -msgid "This build is allocated to Sales Order" +#, fuzzy +#| msgid "This build is allocated to Sales Order" +msgid "This Build Order is allocated to Sales Order" msgstr "Dieser Bau ist der Bestellung zugeordnet" #: build/templates/build/build_base.html:19 -msgid "This build is a child of Build" +#, fuzzy +#| msgid "This build is a child of Build" +msgid "This Build Order is a child of Build Order" msgstr "Dieser Bau ist Kind von Bau" -#: build/templates/build/build_base.html:39 +#: build/templates/build/build_base.html:37 #: company/templates/company/company_base.html:27 -#: order/templates/order/order_base.html:28 -#: order/templates/order/sales_order_base.html:38 +#: order/templates/order/order_base.html:26 +#: order/templates/order/sales_order_base.html:35 #: part/templates/part/category.html:13 part/templates/part/part_base.html:32 -#: stock/templates/stock/item_base.html:69 +#: stock/templates/stock/item_base.html:76 #: stock/templates/stock/location.html:12 #, fuzzy #| msgid "Admin" msgid "Admin view" msgstr "Admin" -#: build/templates/build/build_base.html:45 +#: build/templates/build/build_base.html:46 #, fuzzy #| msgid "Edited build" msgid "Edit Build" msgstr "Bau bearbeitet" -#: build/templates/build/build_base.html:49 build/views.py:190 +#: build/templates/build/build_base.html:50 build/views.py:190 msgid "Complete Build" msgstr "Bau fertigstellen" -#: build/templates/build/build_base.html:52 build/views.py:58 +#: build/templates/build/build_base.html:53 build/views.py:58 msgid "Cancel Build" msgstr "Bau abbrechen" -#: build/templates/build/build_base.html:58 build/views.py:454 +#: build/templates/build/build_base.html:59 build/views.py:456 msgid "Delete Build" msgstr "Bau entfernt" -#: build/templates/build/build_base.html:68 build/templates/build/detail.html:9 +#: build/templates/build/build_base.html:69 build/templates/build/detail.html:9 msgid "Build Details" msgstr "Bau-Status" -#: build/templates/build/build_base.html:87 +#: build/templates/build/build_base.html:88 #: build/templates/build/detail.html:42 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:276 templates/InvenTree/search.html:175 -#: templates/js/barcode.html:42 templates/js/build.html:63 +#: stock/templates/stock/item_base.html:298 templates/InvenTree/search.html:175 +#: templates/js/barcode.html:42 templates/js/build.html:77 #: templates/js/order.html:164 templates/js/order.html:239 #: templates/js/stock.html:505 templates/js/stock.html:913 msgid "Status" msgstr "Status" -#: build/templates/build/build_base.html:100 order/models.py:499 +#: build/templates/build/build_base.html:101 order/models.py:499 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:33 #: order/templates/order/sales_order_notes.html:10 #: order/templates/order/sales_order_ship.html:25 #: part/templates/part/allocation.html:27 -#: stock/templates/stock/item_base.html:186 templates/js/order.html:213 +#: stock/templates/stock/item_base.html:208 templates/js/order.html:213 msgid "Sales Order" msgstr "Bestellung" -#: build/templates/build/build_base.html:106 +#: build/templates/build/build_base.html:107 msgid "BOM Price" msgstr "Stücklistenpreis" -#: build/templates/build/build_base.html:111 +#: build/templates/build/build_base.html:112 msgid "BOM pricing is incomplete" msgstr "Stücklistenbepreisung ist unvollständig" -#: build/templates/build/build_base.html:114 +#: build/templates/build/build_base.html:115 msgid "No pricing information" msgstr "Keine Preisinformation" @@ -656,6 +681,12 @@ msgstr "Keine Preisinformation" msgid "Build Outputs" msgstr "Bau-Ausgabe" +#: build/templates/build/complete.html:6 +#: stock/templates/stock/item_base.html:245 templates/js/build.html:40 +#: templates/navbar.html:25 +msgid "Build" +msgstr "Bau" + #: build/templates/build/complete.html:10 msgid "Build order allocation is complete" msgstr "Bau-Zuweisung ist vollständig" @@ -705,15 +736,15 @@ msgid "Stock can be taken from any available location." msgstr "Bestand kann jedem verfügbaren Lagerort entnommen werden." #: build/templates/build/detail.html:48 -#: stock/templates/stock/item_base.html:216 templates/js/stock.html:513 +#: stock/templates/stock/item_base.html:238 templates/js/stock.html:513 #: templates/js/stock.html:920 templates/js/table_filters.html:34 #: templates/js/table_filters.html:100 msgid "Batch" msgstr "Los" #: build/templates/build/detail.html:61 -#: order/templates/order/order_base.html:100 -#: order/templates/order/sales_order_base.html:99 templates/js/build.html:71 +#: order/templates/order/order_base.html:98 +#: order/templates/order/sales_order_base.html:100 templates/js/build.html:85 msgid "Created" msgstr "Erstellt" @@ -729,17 +760,11 @@ msgstr "Ja" msgid "No" msgstr "Nein" -#: build/templates/build/detail.html:80 templates/js/build.html:76 +#: build/templates/build/detail.html:80 templates/js/build.html:90 msgid "Completed" msgstr "Fertig" -#: build/templates/build/index.html:6 build/templates/build/index.html:14 -#: order/templates/order/so_builds.html:11 order/templates/order/so_tabs.html:9 -#: part/templates/part/tabs.html:31 users/models.py:30 -msgid "Build Orders" -msgstr "Bauaufträge" - -#: build/templates/build/index.html:24 +#: build/templates/build/index.html:24 build/views.py:403 msgid "New Build Order" msgstr "Neuer Bauauftrag" @@ -799,7 +824,7 @@ msgstr "Lagerbestandszuordnung bestätigen" msgid "Check the confirmation box at the bottom of the list" msgstr "Bestätigunsbox am Ende der Liste bestätigen" -#: build/views.py:152 build/views.py:465 +#: build/views.py:152 build/views.py:467 msgid "Unallocate Stock" msgstr "Zuweisung aufheben" @@ -807,7 +832,7 @@ msgstr "Zuweisung aufheben" msgid "Confirm unallocation of build stock" msgstr "Zuweisungsaufhebung bestätigen" -#: build/views.py:167 stock/views.py:405 +#: build/views.py:167 stock/views.py:421 msgid "Check the confirmation box" msgstr "Bestätigungsbox bestätigen" @@ -819,7 +844,7 @@ msgstr "Baufertigstellung bestätigen" msgid "Invalid location selected" msgstr "Ungültige Ortsauswahl" -#: build/views.py:302 stock/views.py:1621 +#: build/views.py:302 stock/views.py:1653 #, python-brace-format msgid "The following serial numbers already exist: ({sn})" msgstr "Die folgende Seriennummer existiert bereits: ({sn})" @@ -828,77 +853,69 @@ msgstr "Die folgende Seriennummer existiert bereits: ({sn})" msgid "Build marked as COMPLETE" msgstr "Bau als FERTIG markiert" -#: build/views.py:403 -msgid "Start new Build" -msgstr "Neuen Bau beginnen" - -#: build/views.py:429 +#: build/views.py:431 msgid "Created new build" msgstr "Neuen Bau angelegt" -#: build/views.py:439 +#: build/views.py:441 msgid "Edit Build Details" msgstr "Baudetails bearbeiten" -#: build/views.py:445 +#: build/views.py:447 msgid "Edited build" msgstr "Bau bearbeitet" -#: build/views.py:471 +#: build/views.py:473 msgid "Removed parts from build allocation" msgstr "Teile von Bauzuordnung entfernt" -#: build/views.py:481 +#: build/views.py:483 msgid "Allocate new Part" msgstr "Neues Teil zuordnen" -#: build/views.py:635 +#: build/views.py:637 msgid "Edit Stock Allocation" msgstr "Teilzuordnung bearbeiten" -#: build/views.py:640 +#: build/views.py:642 msgid "Updated Build Item" msgstr "Bauobjekt aktualisiert" -#: common/models.py:75 +#: common/models.py:107 msgid "Settings key (must be unique - case insensitive" msgstr "" "Einstellungs-Schlüssel (muss einzigartig sein, Groß-/ Kleinschreibung wird " "nicht beachtet)" -#: common/models.py:77 +#: common/models.py:109 msgid "Settings value" msgstr "Einstellungs-Wert" -#: common/models.py:79 -msgid "Settings description" -msgstr "Einstellungs-Beschreibung" - -#: common/models.py:92 +#: common/models.py:122 msgid "Key string must be unique" msgstr "Schlüsseltext muss eindeutig sein" -#: common/models.py:113 +#: common/models.py:143 msgid "Currency Symbol e.g. $" msgstr "Währungs-Symbol (z.B. €)" -#: common/models.py:115 +#: common/models.py:145 msgid "Currency Suffix e.g. AUD" msgstr "Währungs-Suffix (z.B. EUR)" -#: common/models.py:117 +#: common/models.py:147 msgid "Currency Description" msgstr "Währungs-Beschreibung" -#: common/models.py:119 +#: common/models.py:149 msgid "Currency Value" msgstr "Währungs-Wert" -#: common/models.py:121 +#: common/models.py:151 msgid "Use this currency as the base currency" msgstr "Benutze diese Währung als Basis-Währung" -#: common/models.py:204 +#: common/models.py:234 #, fuzzy #| msgid "Default Location" msgid "Default" @@ -916,6 +933,12 @@ msgstr "Währung bearbeiten" msgid "Delete Currency" msgstr "Währung entfernen" +#: common/views.py:47 +#, fuzzy +#| msgid "Settings" +msgid "Change Setting" +msgstr "Einstellungen" + #: company/models.py:86 company/models.py:87 msgid "Company name" msgstr "Firmenname" @@ -990,7 +1013,7 @@ msgid "Does this company manufacture parts?" msgstr "Produziert diese Firma Teile?" #: company/models.py:279 stock/models.py:335 -#: stock/templates/stock/item_base.html:148 +#: stock/templates/stock/item_base.html:164 msgid "Base Part" msgstr "Basisteil" @@ -1061,16 +1084,16 @@ msgstr "Hersteller" #: company/templates/company/detail.html:21 #: company/templates/company/supplier_part_base.html:66 #: company/templates/company/supplier_part_detail.html:21 -#: order/templates/order/order_base.html:81 +#: order/templates/order/order_base.html:79 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170 -#: stock/templates/stock/item_base.html:251 templates/js/company.html:48 +#: stock/templates/stock/item_base.html:273 templates/js/company.html:48 #: templates/js/company.html:162 templates/js/order.html:146 msgid "Supplier" msgstr "Zulieferer" #: company/templates/company/detail.html:26 -#: order/templates/order/sales_order_base.html:80 stock/models.py:370 -#: stock/models.py:371 stock/templates/stock/item_base.html:169 +#: order/templates/order/sales_order_base.html:81 stock/models.py:370 +#: stock/models.py:371 stock/templates/stock/item_base.html:191 #: templates/js/company.html:40 templates/js/order.html:221 msgid "Customer" msgstr "Kunde" @@ -1170,7 +1193,8 @@ msgstr "" #: order/templates/order/purchase_orders.html:7 #: order/templates/order/purchase_orders.html:12 #: part/templates/part/orders.html:9 part/templates/part/tabs.html:48 -#: templates/navbar.html:33 users/models.py:31 +#: templates/InvenTree/settings/tabs.html:27 templates/navbar.html:33 +#: users/models.py:31 msgid "Purchase Orders" msgstr "Bestellungen" @@ -1189,7 +1213,8 @@ msgstr "Neue Bestellung" #: order/templates/order/sales_orders.html:7 #: order/templates/order/sales_orders.html:12 #: part/templates/part/sales_orders.html:9 part/templates/part/tabs.html:56 -#: templates/navbar.html:42 users/models.py:32 +#: templates/InvenTree/settings/tabs.html:30 templates/navbar.html:42 +#: users/models.py:32 msgid "Sales Orders" msgstr "Bestellungen" @@ -1205,7 +1230,7 @@ msgstr "Neuer Auftrag" #: company/templates/company/supplier_part_base.html:6 #: company/templates/company/supplier_part_base.html:19 stock/models.py:344 -#: stock/templates/stock/item_base.html:256 templates/js/company.html:178 +#: stock/templates/stock/item_base.html:278 templates/js/company.html:178 msgid "Supplier Part" msgstr "Zulieferer-Teil" @@ -1248,11 +1273,11 @@ msgstr "MPN" msgid "Note" msgstr "Notiz" -#: company/templates/company/supplier_part_orders.html:11 +#: company/templates/company/supplier_part_orders.html:9 msgid "Supplier Part Orders" msgstr "Zuliefererbestellungen" -#: company/templates/company/supplier_part_pricing.html:12 +#: company/templates/company/supplier_part_pricing.html:10 msgid "Pricing Information" msgstr "Preisinformationen ansehen" @@ -1287,7 +1312,7 @@ msgstr "Preisstaffel bearbeiten" msgid "Delete price break" msgstr "Preisstaffel löschen" -#: company/templates/company/supplier_part_stock.html:11 +#: company/templates/company/supplier_part_stock.html:9 msgid "Supplier Part Stock" msgstr "Zuliefererbestand" @@ -1298,8 +1323,9 @@ msgstr "Bepreisung" #: company/templates/company/supplier_part_tabs.html:8 #: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18 #: stock/templates/stock/location.html:17 templates/InvenTree/search.html:155 -#: templates/js/part.html:124 templates/js/part.html:372 -#: templates/js/stock.html:452 templates/navbar.html:22 users/models.py:29 +#: templates/InvenTree/settings/tabs.html:21 templates/js/part.html:124 +#: templates/js/part.html:372 templates/js/stock.html:452 +#: templates/navbar.html:22 users/models.py:29 msgid "Stock" msgstr "Lagerbestand" @@ -1310,7 +1336,8 @@ msgstr "Bestellungen" #: company/templates/company/tabs.html:9 #: order/templates/order/receive_parts.html:14 part/models.py:294 #: part/templates/part/cat_link.html:7 part/templates/part/category.html:94 -#: part/templates/part/category_tabs.html:6 templates/navbar.html:19 +#: part/templates/part/category_tabs.html:6 +#: templates/InvenTree/settings/tabs.html:18 templates/navbar.html:19 #: templates/stats.html:8 templates/stats.html:17 users/models.py:28 msgid "Parts" msgstr "Teile" @@ -1430,20 +1457,20 @@ msgstr "" msgid "Enabled" msgstr "" -#: order/forms.py:24 order/templates/order/order_base.html:40 +#: order/forms.py:24 order/templates/order/order_base.html:39 msgid "Place order" msgstr "Bestellung aufgeben" -#: order/forms.py:35 order/templates/order/order_base.html:47 +#: order/forms.py:35 order/templates/order/order_base.html:46 msgid "Mark order as complete" msgstr "Bestellung als vollständig markieren" -#: order/forms.py:46 order/forms.py:57 order/templates/order/order_base.html:52 -#: order/templates/order/sales_order_base.html:52 +#: order/forms.py:46 order/forms.py:57 order/templates/order/order_base.html:51 +#: order/templates/order/sales_order_base.html:53 msgid "Cancel order" msgstr "Bestellung stornieren" -#: order/forms.py:68 order/templates/order/sales_order_base.html:49 +#: order/forms.py:68 order/templates/order/sales_order_base.html:50 msgid "Ship order" msgstr "Bestellung versenden" @@ -1453,9 +1480,9 @@ msgstr "Teile in diesen Ort empfangen" #: order/forms.py:99 #, fuzzy -#| msgid "Select a purchase order for" -msgid "Enter purchase order number" -msgstr "Bestellung auswählen für" +#| msgid "Order reference" +msgid "Purchase Order reference" +msgstr "Bestell-Referenz" #: order/forms.py:126 #, fuzzy @@ -1541,8 +1568,8 @@ msgid "Line item notes" msgstr "Position - Notizen" #: order/models.py:466 order/templates/order/order_base.html:9 -#: order/templates/order/order_base.html:23 -#: stock/templates/stock/item_base.html:230 templates/js/order.html:138 +#: order/templates/order/order_base.html:24 +#: stock/templates/stock/item_base.html:252 templates/js/order.html:138 msgid "Purchase Order" msgstr "Kaufvertrag" @@ -1584,48 +1611,48 @@ msgstr "Zuordnungsanzahl eingeben" msgid "Are you sure you want to delete this attachment?" msgstr "Sind Sie sicher, dass Sie diesen Anhang löschen wollen?" -#: order/templates/order/order_base.html:36 +#: order/templates/order/order_base.html:35 #, fuzzy #| msgid "Edited company information" msgid "Edit order information" msgstr "Firmeninformation bearbeitet" -#: order/templates/order/order_base.html:44 +#: order/templates/order/order_base.html:43 #, fuzzy #| msgid "Receive line item" msgid "Receive items" msgstr "Position empfangen" -#: order/templates/order/order_base.html:57 +#: order/templates/order/order_base.html:56 msgid "Export order to file" msgstr "" -#: order/templates/order/order_base.html:66 +#: order/templates/order/order_base.html:64 msgid "Purchase Order Details" msgstr "Bestelldetails" -#: order/templates/order/order_base.html:71 -#: order/templates/order/sales_order_base.html:70 +#: order/templates/order/order_base.html:69 +#: order/templates/order/sales_order_base.html:71 msgid "Order Reference" msgstr "Bestellreferenz" -#: order/templates/order/order_base.html:76 -#: order/templates/order/sales_order_base.html:75 +#: order/templates/order/order_base.html:74 +#: order/templates/order/sales_order_base.html:76 msgid "Order Status" msgstr "Bestellstatus" -#: order/templates/order/order_base.html:87 templates/js/order.html:153 +#: order/templates/order/order_base.html:85 templates/js/order.html:153 msgid "Supplier Reference" msgstr "Zuliefererreferenz" -#: order/templates/order/order_base.html:106 +#: order/templates/order/order_base.html:104 msgid "Issued" msgstr "Aufgegeben" -#: order/templates/order/order_base.html:113 +#: order/templates/order/order_base.html:111 #: order/templates/order/purchase_order_detail.html:182 #: order/templates/order/receive_parts.html:22 -#: order/templates/order/sales_order_base.html:112 +#: order/templates/order/sales_order_base.html:113 msgid "Received" msgstr "Empfangen" @@ -1671,8 +1698,7 @@ msgid "Select existing purchase orders, or create new orders." msgstr "Bestellungen auswählen oder anlegen." #: order/templates/order/order_wizard/select_pos.html:31 -#: order/templates/order/po_tabs.html:5 templates/js/order.html:177 -#: templates/js/order.html:257 +#: templates/js/order.html:177 templates/js/order.html:257 msgid "Items" msgstr "Positionen" @@ -1688,7 +1714,20 @@ msgstr "Bestellung auswählen für" msgid "Purchase Order Attachments" msgstr "Bestellanhänge" -#: order/templates/order/po_tabs.html:8 order/templates/order/so_tabs.html:16 +#: order/templates/order/po_received_items.html:11 +#: order/templates/order/po_tabs.html:8 +#, fuzzy +#| msgid "Receive line item" +msgid "Received Items" +msgstr "Position empfangen" + +#: order/templates/order/po_tabs.html:5 +#, fuzzy +#| msgid "Add Line Item" +msgid "Line Items" +msgstr "Position hinzufügen" + +#: order/templates/order/po_tabs.html:11 order/templates/order/so_tabs.html:16 #: part/templates/part/tabs.html:67 stock/templates/stock/tabs.html:32 msgid "Attachments" msgstr "Anhänge" @@ -1712,7 +1751,7 @@ msgstr "Neuer Standort" #: order/templates/order/purchase_order_detail.html:39 #: order/templates/order/purchase_order_detail.html:119 -#: stock/templates/stock/location.html:21 +#: stock/templates/stock/location.html:22 msgid "Create new stock location" msgstr "Neuen Lagerort anlegen" @@ -1765,15 +1804,15 @@ msgstr "" msgid "This SalesOrder has not been fully allocated" msgstr "Dieser Auftrag ist nicht vollständig zugeordnet" -#: order/templates/order/sales_order_base.html:57 +#: order/templates/order/sales_order_base.html:58 msgid "Packing List" msgstr "Packliste" -#: order/templates/order/sales_order_base.html:65 +#: order/templates/order/sales_order_base.html:66 msgid "Sales Order Details" msgstr "Auftragsdetails" -#: order/templates/order/sales_order_base.html:86 templates/js/order.html:228 +#: order/templates/order/sales_order_base.html:87 templates/js/order.html:228 msgid "Customer Reference" msgstr "Kundenreferenz" @@ -1845,7 +1884,7 @@ msgstr "Bestellungspositionen" msgid "Add Purchase Order Attachment" msgstr "Bestellanhang hinzufügen" -#: order/views.py:109 order/views.py:157 part/views.py:92 stock/views.py:167 +#: order/views.py:109 order/views.py:157 part/views.py:92 stock/views.py:175 msgid "Added attachment" msgstr "Anhang hinzugefügt" @@ -1865,7 +1904,7 @@ msgstr "Anhang aktualisiert" msgid "Delete Attachment" msgstr "Anhang löschen" -#: order/views.py:233 order/views.py:248 stock/views.py:223 +#: order/views.py:233 order/views.py:248 stock/views.py:233 msgid "Deleted attachment" msgstr "Anhang gelöscht" @@ -2389,17 +2428,12 @@ msgstr "Bestellung" #: part/templates/part/allocation.html:45 #: stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:58 -#: stock/templates/stock/item_base.html:238 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:112 +#: stock/templates/stock/item_base.html:260 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:126 #: templates/js/stock.html:660 templates/js/stock.html:896 msgid "Stock Item" msgstr "Lagerobjekt" -#: part/templates/part/allocation.html:20 -#: stock/templates/stock/item_base.html:192 -msgid "Build Order" -msgstr "Bauauftrag" - #: part/templates/part/attachments.html:8 msgid "Part Attachments" msgstr "Anhänge" @@ -2638,7 +2672,7 @@ msgstr "Teilkategorie anlegen" msgid "Create new Part Category" msgstr "Teilkategorie anlegen" -#: part/templates/part/category.html:214 stock/views.py:1314 +#: part/templates/part/category.html:214 stock/views.py:1343 msgid "Create new Stock Location" msgstr "Neuen Lager-Standort erstellen" @@ -2823,7 +2857,7 @@ msgstr "Teilparameter" msgid "Add new parameter" msgstr "Parameter hinzufügen" -#: part/templates/part/params.html:14 templates/InvenTree/settings/part.html:12 +#: part/templates/part/params.html:14 templates/InvenTree/settings/part.html:17 msgid "New Parameter" msgstr "Neuer Parameter" @@ -2869,24 +2903,24 @@ msgid "Star this part" msgstr "Teil favorisieren" #: part/templates/part/part_base.html:49 -#: stock/templates/stock/item_base.html:81 -#: stock/templates/stock/location.html:27 +#: stock/templates/stock/item_base.html:88 +#: stock/templates/stock/location.html:29 #, fuzzy #| msgid "Source Location" msgid "Barcode actions" msgstr "Quell-Standort" #: part/templates/part/part_base.html:51 -#: stock/templates/stock/item_base.html:83 -#: stock/templates/stock/location.html:29 +#: stock/templates/stock/item_base.html:90 +#: stock/templates/stock/location.html:31 #, fuzzy #| msgid "Part QR Code" msgid "Show QR Code" msgstr "Teil-QR-Code" #: part/templates/part/part_base.html:52 -#: stock/templates/stock/item_base.html:84 -#: stock/templates/stock/location.html:30 +#: stock/templates/stock/item_base.html:91 +#: stock/templates/stock/location.html:32 msgid "Print Label" msgstr "" @@ -3039,7 +3073,7 @@ msgstr "Stückliste" msgid "Used In" msgstr "Benutzt in" -#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:282 +#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:304 msgid "Tests" msgstr "" @@ -3077,7 +3111,7 @@ msgstr "Varianten" msgid "Add part attachment" msgstr "Teilanhang hinzufügen" -#: part/views.py:131 templates/attachment_table.html:30 +#: part/views.py:131 templates/attachment_table.html:32 msgid "Edit attachment" msgstr "Anhang bearbeiten" @@ -3360,7 +3394,7 @@ msgstr "Ziel-Lagerbestand" msgid "Add note (required)" msgstr "" -#: stock/forms.py:370 stock/views.py:895 stock/views.py:1092 +#: stock/forms.py:370 stock/views.py:921 stock/views.py:1119 msgid "Confirm stock adjustment" msgstr "Bestands-Anpassung bestätigen" @@ -3430,7 +3464,7 @@ msgstr "Lagerort" msgid "Where is this stock item located?" msgstr "Wo wird dieses Teil normalerweise gelagert?" -#: stock/models.py:358 stock/templates/stock/item_base.html:177 +#: stock/models.py:358 stock/templates/stock/item_base.html:199 msgid "Installed In" msgstr "Installiert in" @@ -3678,130 +3712,132 @@ msgstr "" "Dieses Lagerobjekt wird automatisch gelöscht wenn der Lagerbestand " "aufgebraucht ist." -#: stock/templates/stock/item_base.html:86 templates/js/barcode.html:283 +#: stock/templates/stock/item_base.html:94 templates/js/barcode.html:283 #: templates/js/barcode.html:288 msgid "Unlink Barcode" msgstr "" -#: stock/templates/stock/item_base.html:88 +#: stock/templates/stock/item_base.html:96 msgid "Link Barcode" msgstr "" -#: stock/templates/stock/item_base.html:94 +#: stock/templates/stock/item_base.html:104 #, fuzzy #| msgid "Confirm stock adjustment" msgid "Stock adjustment actions" msgstr "Bestands-Anpassung bestätigen" -#: stock/templates/stock/item_base.html:98 -#: stock/templates/stock/location.html:38 templates/stock_table.html:19 +#: stock/templates/stock/item_base.html:108 +#: stock/templates/stock/location.html:41 templates/stock_table.html:19 msgid "Count stock" msgstr "Bestand zählen" -#: stock/templates/stock/item_base.html:99 templates/stock_table.html:17 +#: stock/templates/stock/item_base.html:109 templates/stock_table.html:17 msgid "Add stock" msgstr "Bestand hinzufügen" -#: stock/templates/stock/item_base.html:100 templates/stock_table.html:18 +#: stock/templates/stock/item_base.html:110 templates/stock_table.html:18 msgid "Remove stock" msgstr "Bestand entfernen" -#: stock/templates/stock/item_base.html:102 +#: stock/templates/stock/item_base.html:112 #, fuzzy #| msgid "Order stock" msgid "Transfer stock" msgstr "Bestand bestellen" -#: stock/templates/stock/item_base.html:104 +#: stock/templates/stock/item_base.html:114 #, fuzzy #| msgid "Serialize Stock" msgid "Serialize stock" msgstr "Lagerbestand erfassen" -#: stock/templates/stock/item_base.html:108 +#: stock/templates/stock/item_base.html:118 #, fuzzy #| msgid "Item assigned to customer?" msgid "Assign to customer" msgstr "Ist dieses Objekt einem Kunden zugeteilt?" -#: stock/templates/stock/item_base.html:111 +#: stock/templates/stock/item_base.html:121 #, fuzzy #| msgid "Count stock" msgid "Return to stock" msgstr "Bestand zählen" -#: stock/templates/stock/item_base.html:115 templates/js/stock.html:933 +#: stock/templates/stock/item_base.html:125 templates/js/stock.html:933 #, fuzzy #| msgid "Installed in Stock Item" msgid "Uninstall stock item" msgstr "In Lagerobjekt installiert" -#: stock/templates/stock/item_base.html:115 +#: stock/templates/stock/item_base.html:125 msgid "Uninstall" msgstr "" -#: stock/templates/stock/item_base.html:122 -#: stock/templates/stock/location.html:35 +#: stock/templates/stock/item_base.html:134 +#: stock/templates/stock/location.html:38 #, fuzzy #| msgid "Stock Locations" msgid "Stock actions" msgstr "Lagerobjekt-Standorte" -#: stock/templates/stock/item_base.html:126 +#: stock/templates/stock/item_base.html:137 #, fuzzy #| msgid "Count stock items" msgid "Convert to variant" msgstr "Lagerobjekte zählen" -#: stock/templates/stock/item_base.html:128 +#: stock/templates/stock/item_base.html:140 #, fuzzy #| msgid "Count stock items" msgid "Duplicate stock item" msgstr "Lagerobjekte zählen" -#: stock/templates/stock/item_base.html:129 +#: stock/templates/stock/item_base.html:142 #, fuzzy #| msgid "Edit Stock Item" msgid "Edit stock item" msgstr "Lagerobjekt bearbeiten" -#: stock/templates/stock/item_base.html:131 +#: stock/templates/stock/item_base.html:145 #, fuzzy #| msgid "Delete Stock Item" msgid "Delete stock item" msgstr "Lagerobjekt löschen" -#: stock/templates/stock/item_base.html:135 +#: stock/templates/stock/item_base.html:151 msgid "Generate test report" msgstr "" -#: stock/templates/stock/item_base.html:143 +#: stock/templates/stock/item_base.html:159 msgid "Stock Item Details" msgstr "Lagerbestands-Details" -#: stock/templates/stock/item_base.html:202 +#: stock/templates/stock/item_base.html:224 #, fuzzy #| msgid "No stock location set" msgid "No location set" msgstr "Kein Lagerort gesetzt" -#: stock/templates/stock/item_base.html:209 -msgid "Unique Identifier" +#: stock/templates/stock/item_base.html:231 +#, fuzzy +#| msgid "Unique Identifier" +msgid "Barcode Identifier" msgstr "Eindeutiger Bezeichner" -#: stock/templates/stock/item_base.html:237 +#: stock/templates/stock/item_base.html:259 msgid "Parent Item" msgstr "Elternposition" -#: stock/templates/stock/item_base.html:262 +#: stock/templates/stock/item_base.html:284 msgid "Last Updated" msgstr "Zuletzt aktualisiert" -#: stock/templates/stock/item_base.html:267 +#: stock/templates/stock/item_base.html:289 msgid "Last Stocktake" msgstr "Letzte Inventur" -#: stock/templates/stock/item_base.html:271 +#: stock/templates/stock/item_base.html:293 msgid "No stocktake performed" msgstr "Keine Inventur ausgeführt" @@ -3877,58 +3913,58 @@ msgstr "" msgid "All stock items" msgstr "Alle Lagerobjekte" -#: stock/templates/stock/location.html:31 +#: stock/templates/stock/location.html:33 #, fuzzy #| msgid "Child Stock Items" msgid "Check-in Items" msgstr "Kind-Lagerobjekte" -#: stock/templates/stock/location.html:42 +#: stock/templates/stock/location.html:45 #, fuzzy #| msgid "Location Description" msgid "Location actions" msgstr "Standort-Beschreibung" -#: stock/templates/stock/location.html:44 +#: stock/templates/stock/location.html:47 #, fuzzy #| msgid "Edit stock location" msgid "Edit location" msgstr "Lagerort bearbeiten" -#: stock/templates/stock/location.html:45 +#: stock/templates/stock/location.html:49 #, fuzzy #| msgid "Delete stock location" msgid "Delete location" msgstr "Lagerort löschen" -#: stock/templates/stock/location.html:53 +#: stock/templates/stock/location.html:59 msgid "Location Details" msgstr "Standort-Details" -#: stock/templates/stock/location.html:58 +#: stock/templates/stock/location.html:64 msgid "Location Path" msgstr "Standord-Pfad" -#: stock/templates/stock/location.html:63 +#: stock/templates/stock/location.html:69 msgid "Location Description" msgstr "Standort-Beschreibung" -#: stock/templates/stock/location.html:68 +#: stock/templates/stock/location.html:74 msgid "Sublocations" msgstr "Sub-Standorte" -#: stock/templates/stock/location.html:73 -#: stock/templates/stock/location.html:88 +#: stock/templates/stock/location.html:79 +#: stock/templates/stock/location.html:94 #: templates/InvenTree/search_stock_items.html:6 templates/stats.html:21 #: templates/stats.html:30 msgid "Stock Items" msgstr "Lagerobjekte" -#: stock/templates/stock/location.html:78 +#: stock/templates/stock/location.html:84 msgid "Stock Details" msgstr "Objekt-Details" -#: stock/templates/stock/location.html:83 +#: stock/templates/stock/location.html:89 #: templates/InvenTree/search_stock_location.html:6 templates/stats.html:25 msgid "Stock Locations" msgstr "Lagerobjekt-Standorte" @@ -3945,7 +3981,7 @@ msgstr "Sind Sie sicher, dass Sie diesen Anhang löschen wollen?" msgid "The following stock items will be uninstalled" msgstr "Die folgenden Objekte werden erstellt" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1287 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1315 #, fuzzy #| msgid "Count Stock Items" msgid "Convert Stock Item" @@ -3983,252 +4019,252 @@ msgstr "Kinder" msgid "Installed Items" msgstr "Installiert in" -#: stock/views.py:114 +#: stock/views.py:119 msgid "Edit Stock Location" msgstr "Lagerobjekt-Standort bearbeiten" -#: stock/views.py:138 +#: stock/views.py:144 msgid "Stock Location QR code" msgstr "QR-Code für diesen Standort" -#: stock/views.py:156 +#: stock/views.py:163 #, fuzzy #| msgid "Add Attachment" msgid "Add Stock Item Attachment" msgstr "Anhang hinzufügen" -#: stock/views.py:201 +#: stock/views.py:209 #, fuzzy #| msgid "Edit Stock Item" msgid "Edit Stock Item Attachment" msgstr "Lagerobjekt bearbeiten" -#: stock/views.py:217 +#: stock/views.py:226 #, fuzzy #| msgid "Delete Part Attachment" msgid "Delete Stock Item Attachment" msgstr "Teilanhang löschen" -#: stock/views.py:233 +#: stock/views.py:243 #, fuzzy #| msgid "Item assigned to customer?" msgid "Assign to Customer" msgstr "Ist dieses Objekt einem Kunden zugeteilt?" -#: stock/views.py:270 +#: stock/views.py:281 #, fuzzy #| msgid "Part Stock" msgid "Return to Stock" msgstr "Teilbestand" -#: stock/views.py:289 +#: stock/views.py:301 #, fuzzy #| msgid "Include sublocations" msgid "Specify a valid location" msgstr "Unterlagerorte einschließen" -#: stock/views.py:293 +#: stock/views.py:305 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:305 +#: stock/views.py:317 #, fuzzy #| msgid "Select valid part" msgid "Select Label Template" msgstr "Bitte ein gültiges Teil auswählen" -#: stock/views.py:327 +#: stock/views.py:340 #, fuzzy #| msgid "Select valid part" msgid "Select valid label" msgstr "Bitte ein gültiges Teil auswählen" -#: stock/views.py:389 +#: stock/views.py:404 #, fuzzy #| msgid "Delete Template" msgid "Delete All Test Data" msgstr "Vorlage löschen" -#: stock/views.py:404 +#: stock/views.py:420 #, fuzzy #| msgid "Confirm Part Deletion" msgid "Confirm test data deletion" msgstr "Löschen des Teils bestätigen" -#: stock/views.py:424 +#: stock/views.py:440 msgid "Add Test Result" msgstr "" -#: stock/views.py:461 +#: stock/views.py:478 #, fuzzy #| msgid "Edit Template" msgid "Edit Test Result" msgstr "Vorlage bearbeiten" -#: stock/views.py:478 +#: stock/views.py:496 #, fuzzy #| msgid "Delete Template" msgid "Delete Test Result" msgstr "Vorlage löschen" -#: stock/views.py:489 +#: stock/views.py:508 #, fuzzy #| msgid "Delete Template" msgid "Select Test Report Template" msgstr "Vorlage löschen" -#: stock/views.py:503 +#: stock/views.py:523 #, fuzzy #| msgid "Select valid part" msgid "Select valid template" msgstr "Bitte ein gültiges Teil auswählen" -#: stock/views.py:555 +#: stock/views.py:576 msgid "Stock Export Options" msgstr "Lagerbestandsexportoptionen" -#: stock/views.py:675 +#: stock/views.py:698 msgid "Stock Item QR Code" msgstr "Lagerobjekt-QR-Code" -#: stock/views.py:700 +#: stock/views.py:724 #, fuzzy #| msgid "Installed in Stock Item" msgid "Install Stock Item" msgstr "In Lagerobjekt installiert" -#: stock/views.py:799 +#: stock/views.py:824 #, fuzzy #| msgid "Installed in Stock Item" msgid "Uninstall Stock Items" msgstr "In Lagerobjekt installiert" -#: stock/views.py:906 +#: stock/views.py:932 #, fuzzy #| msgid "Installed in Stock Item" msgid "Uninstalled stock items" msgstr "In Lagerobjekt installiert" -#: stock/views.py:931 +#: stock/views.py:957 msgid "Adjust Stock" msgstr "Lagerbestand anpassen" -#: stock/views.py:1040 +#: stock/views.py:1067 msgid "Move Stock Items" msgstr "Lagerobjekte bewegen" -#: stock/views.py:1041 +#: stock/views.py:1068 msgid "Count Stock Items" msgstr "Lagerobjekte zählen" -#: stock/views.py:1042 +#: stock/views.py:1069 msgid "Remove From Stock" msgstr "Aus Lagerbestand entfernen" -#: stock/views.py:1043 +#: stock/views.py:1070 msgid "Add Stock Items" msgstr "Lagerobjekte hinzufügen" -#: stock/views.py:1044 +#: stock/views.py:1071 msgid "Delete Stock Items" msgstr "Lagerobjekte löschen" -#: stock/views.py:1072 +#: stock/views.py:1099 msgid "Must enter integer value" msgstr "Nur Ganzzahl eingeben" -#: stock/views.py:1077 +#: stock/views.py:1104 msgid "Quantity must be positive" msgstr "Anzahl muss positiv sein" -#: stock/views.py:1084 +#: stock/views.py:1111 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "Anzahl darf {x} nicht überschreiten" -#: stock/views.py:1163 +#: stock/views.py:1190 #, python-brace-format msgid "Added stock to {n} items" msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt" -#: stock/views.py:1178 +#: stock/views.py:1205 #, python-brace-format msgid "Removed stock from {n} items" msgstr "Vorrat von {n} Lagerobjekten entfernt" -#: stock/views.py:1191 +#: stock/views.py:1218 #, python-brace-format msgid "Counted stock for {n} items" msgstr "Bestand für {n} Objekte erfasst" -#: stock/views.py:1219 +#: stock/views.py:1246 msgid "No items were moved" msgstr "Keine Lagerobjekte wurden bewegt" -#: stock/views.py:1222 +#: stock/views.py:1249 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "{n} Teile nach {dest} bewegt" -#: stock/views.py:1241 +#: stock/views.py:1268 #, python-brace-format msgid "Deleted {n} stock items" msgstr "{n} Teile im Lager gelöscht" -#: stock/views.py:1253 +#: stock/views.py:1280 msgid "Edit Stock Item" msgstr "Lagerobjekt bearbeiten" -#: stock/views.py:1335 +#: stock/views.py:1365 msgid "Serialize Stock" msgstr "Lagerbestand erfassen" -#: stock/views.py:1527 +#: stock/views.py:1559 #, fuzzy #| msgid "Count stock items" msgid "Duplicate Stock Item" msgstr "Lagerobjekte zählen" -#: stock/views.py:1593 +#: stock/views.py:1625 msgid "Invalid quantity" msgstr "Ungültige Menge" -#: stock/views.py:1596 +#: stock/views.py:1628 #, fuzzy #| msgid "Quantity must be greater than zero" msgid "Quantity cannot be less than zero" msgstr "Anzahl muss größer Null sein" -#: stock/views.py:1600 +#: stock/views.py:1632 msgid "Invalid part selection" msgstr "Ungültige Teileauswahl" -#: stock/views.py:1649 +#: stock/views.py:1681 #, python-brace-format msgid "Created {n} new stock items" msgstr "{n} neue Lagerobjekte erstellt" -#: stock/views.py:1668 stock/views.py:1684 +#: stock/views.py:1700 stock/views.py:1716 msgid "Created new stock item" msgstr "Neues Lagerobjekt erstellt" -#: stock/views.py:1703 +#: stock/views.py:1735 msgid "Delete Stock Location" msgstr "Standort löschen" -#: stock/views.py:1716 +#: stock/views.py:1749 msgid "Delete Stock Item" msgstr "Lagerobjekt löschen" -#: stock/views.py:1727 +#: stock/views.py:1761 msgid "Delete Stock Tracking Entry" msgstr "Lagerbestands-Tracking-Eintrag löschen" -#: stock/views.py:1744 +#: stock/views.py:1780 msgid "Edit Stock Tracking Entry" msgstr "Lagerbestands-Tracking-Eintrag bearbeiten" -#: stock/views.py:1753 +#: stock/views.py:1790 msgid "Add Stock Tracking Entry" msgstr "Lagerbestands-Tracking-Eintrag hinzufügen" @@ -4240,6 +4276,18 @@ msgstr "" msgid "You do not have permission to view this page." msgstr "" +#: templates/404.html:5 templates/404.html:11 +#, fuzzy +#| msgid "Part image not found" +msgid "Page Not Found" +msgstr "Teilbild nicht gefunden" + +#: templates/404.html:14 +#, fuzzy +#| msgid "Part does not exist" +msgid "The requested page does not exist" +msgstr "Teil existiert nicht" + #: templates/InvenTree/bom_invalid.html:7 msgid "BOM Waiting Validation" msgstr "" @@ -4304,25 +4352,137 @@ msgstr "Kein Lagerort gesetzt" msgid "Searching" msgstr "Suche" +#: templates/InvenTree/settings/build.html:10 +#, fuzzy +#| msgid "Build Orders" +msgid "Build Order Settings" +msgstr "Bauaufträge" + +#: templates/InvenTree/settings/build.html:19 +#, fuzzy +#| msgid "Reference" +msgid "Reference Prefix" +msgstr "Referenz" + +#: templates/InvenTree/settings/build.html:21 +#, fuzzy +#| msgid "Order reference" +msgid "Prefix for Build Order reference" +msgstr "Bestell-Referenz" + +#: templates/InvenTree/settings/build.html:24 +#, fuzzy +#| msgid "Reference" +msgid "Reference Regex" +msgstr "Referenz" + +#: templates/InvenTree/settings/build.html:26 +msgid "Regex validator for Build Order reference" +msgstr "" + +#: templates/InvenTree/settings/currency.html:5 +#, fuzzy +#| msgid "Settings" +msgid "General Settings" +msgstr "Einstellungen" + +#: templates/InvenTree/settings/currency.html:14 +#, fuzzy +#| msgid "Currency Value" +msgid "Currencies" +msgstr "Währungs-Wert" + +#: templates/InvenTree/settings/currency.html:17 +#, fuzzy +#| msgid "Delete Currency" +msgid "New Currency" +msgstr "Währung entfernen" + #: templates/InvenTree/settings/part.html:9 #, fuzzy +#| msgid "Settings" +msgid "Part Settings" +msgstr "Einstellungen" + +#: templates/InvenTree/settings/part.html:14 +#, fuzzy #| msgid "Edit Part Parameter Template" msgid "Part Parameter Templates" msgstr "Teilparametervorlage bearbeiten" -#: templates/InvenTree/settings/part.html:28 +#: templates/InvenTree/settings/part.html:33 msgid "No part parameter templates found" msgstr "Keine Teilparametervorlagen gefunden" -#: templates/InvenTree/settings/part.html:48 +#: templates/InvenTree/settings/part.html:53 msgid "Edit Template" msgstr "Vorlage bearbeiten" -#: templates/InvenTree/settings/part.html:49 +#: templates/InvenTree/settings/part.html:54 msgid "Delete Template" msgstr "Vorlage löschen" -#: templates/InvenTree/settings/theme.html:25 +#: templates/InvenTree/settings/po.html:9 +#, fuzzy +#| msgid "Purchase Order Details" +msgid "Purchase Order Settings" +msgstr "Bestelldetails" + +#: templates/InvenTree/settings/settings.html:7 +#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:62 +msgid "Settings" +msgstr "Einstellungen" + +#: templates/InvenTree/settings/so.html:9 +#, fuzzy +#| msgid "Sales Order Details" +msgid "Sales Order Settings" +msgstr "Auftragsdetails" + +#: templates/InvenTree/settings/stock.html:9 +#, fuzzy +#| msgid "Stock Locations" +msgid "Stock Settings" +msgstr "Lagerobjekt-Standorte" + +#: templates/InvenTree/settings/tabs.html:3 +#: templates/InvenTree/settings/user.html:10 +#, fuzzy +#| msgid "Settings" +msgid "User Settings" +msgstr "Einstellungen" + +#: templates/InvenTree/settings/tabs.html:6 +msgid "Account" +msgstr "" + +#: templates/InvenTree/settings/tabs.html:9 +msgid "Theme" +msgstr "" + +#: templates/InvenTree/settings/tabs.html:12 +#, fuzzy +#| msgid "InvenTree Version" +msgid "InvenTree Settings" +msgstr "InvenTree-Version" + +#: templates/InvenTree/settings/tabs.html:15 +#, fuzzy +#| msgid "Edit Currency" +msgid "Currency" +msgstr "Währung bearbeiten" + +#: templates/InvenTree/settings/theme.html:10 +#, fuzzy +#| msgid "Settings" +msgid "Theme Settings" +msgstr "Einstellungen" + +#: templates/InvenTree/settings/theme.html:17 +msgid "Color Themes" +msgstr "" + +#: templates/InvenTree/settings/theme.html:29 #, python-format msgid "" "\n" @@ -4332,6 +4492,36 @@ msgid "" "\t" msgstr "" +#: templates/InvenTree/settings/user.html:16 +#, fuzzy +#| msgid "No user information" +msgid "User Information" +msgstr "Keine Benutzerinformation" + +#: templates/InvenTree/settings/user.html:24 +#, fuzzy +#| msgid "User" +msgid "Username" +msgstr "Benutzer" + +#: templates/InvenTree/settings/user.html:28 +#, fuzzy +#| msgid "Instance Name" +msgid "First Name" +msgstr "Instanzname" + +#: templates/InvenTree/settings/user.html:32 +#, fuzzy +#| msgid "Instance Name" +msgid "Last Name" +msgstr "Instanzname" + +#: templates/InvenTree/settings/user.html:36 +#, fuzzy +#| msgid "Address" +msgid "Email Address" +msgstr "Adresse" + #: templates/InvenTree/so_outstanding.html:7 #, fuzzy #| msgid "Destination Sales Order" @@ -4378,23 +4568,23 @@ msgstr "Code auf GitHub ansehen" msgid "Submit Bug Report" msgstr "Fehlerbericht senden" -#: templates/attachment_table.html:5 +#: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "Anhang hinzufügen" -#: templates/attachment_table.html:13 +#: templates/attachment_table.html:15 msgid "File" msgstr "Datei" -#: templates/attachment_table.html:14 +#: templates/attachment_table.html:16 msgid "Comment" msgstr "Kommentar" -#: templates/attachment_table.html:15 +#: templates/attachment_table.html:17 msgid "Uploaded" msgstr "" -#: templates/attachment_table.html:33 +#: templates/attachment_table.html:35 msgid "Delete attachment" msgstr "Anhang löschen" @@ -4511,7 +4701,7 @@ msgstr "Unterbaugruppe öffnen" msgid "Optional" msgstr "Optionen" -#: templates/js/bom.html:188 templates/js/build.html:119 +#: templates/js/bom.html:188 templates/js/build.html:133 msgid "Available" msgstr "verfügbar" @@ -4541,11 +4731,11 @@ msgstr "BOM-Position bearbeiten" msgid "Delete BOM Item" msgstr "BOM-Position löschen" -#: templates/js/build.html:23 +#: templates/js/build.html:24 msgid "No builds matching query" msgstr "Keine Baue passen zur Anfrage" -#: templates/js/build.html:108 +#: templates/js/build.html:122 msgid "No parts allocated for" msgstr "Keine Teile zugeordnet zu" @@ -4953,10 +5143,6 @@ msgstr "" msgid "Admin" msgstr "Admin" -#: templates/navbar.html:62 -msgid "Settings" -msgstr "Einstellungen" - #: templates/navbar.html:63 msgid "Logout" msgstr "Ausloggen" @@ -5099,6 +5285,20 @@ msgstr "" msgid "Permission to delete items" msgstr "Ausgewählte Stücklistenpositionen entfernen" +#~ msgid "Build Title" +#~ msgstr "Bau-Titel" + +#~ msgid "Start new Build" +#~ msgstr "Neuen Bau beginnen" + +#~ msgid "Settings description" +#~ msgstr "Einstellungs-Beschreibung" + +#, fuzzy +#~| msgid "Select a purchase order for" +#~ msgid "Enter purchase order number" +#~ msgstr "Bestellung auswählen für" + #, fuzzy #~| msgid "Created" #~ msgid "Create" @@ -5156,9 +5356,6 @@ msgstr "Ausgewählte Stücklistenpositionen entfernen" #~ msgid "Barcode plugin returned incorrect response" #~ msgstr "Ungültige Antwort vom Strichcode-Plugin" -#~ msgid "Part does not exist" -#~ msgstr "Teil existiert nicht" - #~ msgid "StockLocation does not exist" #~ msgstr "Lagerort existiert nicht" diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po index 74b435c791..5c6d3a00c1 100644 --- a/InvenTree/locale/en/LC_MESSAGES/django.po +++ b/InvenTree/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-06 09:31+0000\n" +"POT-Creation-Date: 2020-10-19 21:40+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -26,7 +26,7 @@ msgstr "" msgid "No matching action found" msgstr "" -#: InvenTree/forms.py:102 build/forms.py:37 +#: InvenTree/forms.py:102 build/forms.py:49 msgid "Confirm" msgstr "" @@ -46,34 +46,34 @@ msgstr "" msgid "Apply Theme" msgstr "" -#: InvenTree/helpers.py:339 order/models.py:187 order/models.py:261 +#: InvenTree/helpers.py:348 order/models.py:187 order/models.py:261 msgid "Invalid quantity provided" msgstr "" -#: InvenTree/helpers.py:342 +#: InvenTree/helpers.py:351 msgid "Empty serial number string" msgstr "" -#: InvenTree/helpers.py:363 +#: InvenTree/helpers.py:372 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:367 InvenTree/helpers.py:370 InvenTree/helpers.py:373 +#: InvenTree/helpers.py:376 InvenTree/helpers.py:379 InvenTree/helpers.py:382 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:378 +#: InvenTree/helpers.py:387 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:386 +#: InvenTree/helpers.py:395 msgid "No serial numbers found" msgstr "" -#: InvenTree/helpers.py:390 +#: InvenTree/helpers.py:399 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" @@ -144,7 +144,7 @@ msgid "Returned" msgstr "" #: InvenTree/status_codes.py:136 -#: order/templates/order/sales_order_base.html:105 +#: order/templates/order/sales_order_base.html:106 msgid "Shipped" msgstr "" @@ -170,7 +170,7 @@ msgstr "" #: InvenTree/status_codes.py:223 build/templates/build/allocate.html:358 #: order/templates/order/sales_order_detail.html:221 -#: part/templates/part/tabs.html:23 templates/js/build.html:126 +#: part/templates/part/tabs.html:23 templates/js/build.html:140 msgid "Allocated" msgstr "" @@ -182,20 +182,25 @@ msgstr "" msgid "IPN must match regex pattern" msgstr "" -#: InvenTree/validators.py:60 +#: InvenTree/validators.py:66 InvenTree/validators.py:80 +#: InvenTree/validators.py:94 +msgid "Reference must match pattern" +msgstr "" + +#: InvenTree/validators.py:102 #, python-brace-format msgid "Illegal character in name ({x})" msgstr "" -#: InvenTree/validators.py:79 InvenTree/validators.py:95 +#: InvenTree/validators.py:121 InvenTree/validators.py:137 msgid "Overage value must not be negative" msgstr "" -#: InvenTree/validators.py:97 +#: InvenTree/validators.py:139 msgid "Overage must not exceed 100%" msgstr "" -#: InvenTree/validators.py:104 +#: InvenTree/validators.py:146 msgid "Overage must be an integer value or a percentage" msgstr "" @@ -243,45 +248,83 @@ msgstr "" msgid "Barcode associated with StockItem" msgstr "" -#: build/forms.py:58 +#: build/forms.py:28 +msgid "Build Order reference" +msgstr "" + +#: build/forms.py:70 msgid "Location of completed parts" msgstr "" -#: build/forms.py:62 +#: build/forms.py:74 msgid "Serial numbers" msgstr "" -#: build/forms.py:64 stock/forms.py:111 +#: build/forms.py:76 stock/forms.py:111 msgid "Enter unique serial numbers (or leave blank)" msgstr "" -#: build/forms.py:67 +#: build/forms.py:79 msgid "Confirm build completion" msgstr "" -#: build/models.py:67 +#: build/models.py:54 build/templates/build/build_base.html:8 +#: build/templates/build/build_base.html:35 +#: part/templates/part/allocation.html:20 +#: stock/templates/stock/item_base.html:214 +msgid "Build Order" +msgstr "" + +#: build/models.py:55 build/templates/build/index.html:6 +#: build/templates/build/index.html:14 order/templates/order/so_builds.html:11 +#: order/templates/order/so_tabs.html:9 part/templates/part/tabs.html:31 +#: templates/InvenTree/settings/tabs.html:24 users/models.py:30 +msgid "Build Orders" +msgstr "" + +#: build/models.py:77 msgid "Build quantity must be integer value for trackable parts" msgstr "" -#: build/models.py:73 build/templates/build/build_base.html:72 -msgid "Build Title" +#: build/models.py:86 build/templates/build/build_base.html:73 +msgid "Build Order Reference" msgstr "" -#: build/models.py:76 +#: build/models.py:87 build/templates/build/allocate.html:342 +#: order/templates/order/purchase_order_detail.html:172 +#: templates/js/bom.html:154 +msgid "Reference" +msgstr "" + +#: build/models.py:94 build/templates/build/allocate.html:337 +#: company/templates/company/supplier_part_base.html:53 +#: company/templates/company/supplier_part_detail.html:27 +#: order/templates/order/purchase_order_detail.html:159 +#: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 +#: templates/InvenTree/search.html:147 templates/js/bom.html:147 +#: templates/js/build.html:56 templates/js/company.html:56 +#: templates/js/order.html:159 templates/js/order.html:234 +#: templates/js/part.html:120 templates/js/part.html:203 +#: templates/js/part.html:345 templates/js/part.html:526 +#: templates/js/stock.html:444 templates/js/stock.html:671 +msgid "Description" +msgstr "" + +#: build/models.py:97 msgid "Brief description of the build" msgstr "" -#: build/models.py:84 build/templates/build/build_base.html:93 +#: build/models.py:105 build/templates/build/build_base.html:94 msgid "Parent Build" msgstr "" -#: build/models.py:85 +#: build/models.py:106 msgid "Parent build to which this build is allocated" msgstr "" -#: build/models.py:90 build/templates/build/allocate.html:329 +#: build/models.py:111 build/templates/build/allocate.html:329 #: build/templates/build/auto_allocate.html:19 -#: build/templates/build/build_base.html:77 +#: build/templates/build/build_base.html:78 #: build/templates/build/detail.html:22 order/models.py:501 #: order/templates/order/order_wizard/select_parts.html:30 #: order/templates/order/purchase_order_detail.html:147 @@ -289,72 +332,72 @@ msgstr "" #: part/templates/part/part_app_base.html:7 #: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133 #: templates/js/barcode.html:336 templates/js/bom.html:124 -#: templates/js/build.html:47 templates/js/company.html:137 +#: templates/js/build.html:61 templates/js/company.html:137 #: templates/js/part.html:184 templates/js/part.html:289 #: templates/js/stock.html:421 templates/js/stock.html:977 msgid "Part" msgstr "" -#: build/models.py:99 +#: build/models.py:120 msgid "Select part to build" msgstr "" -#: build/models.py:104 +#: build/models.py:125 msgid "Sales Order Reference" msgstr "" -#: build/models.py:108 +#: build/models.py:129 msgid "SalesOrder to which this build is allocated" msgstr "" -#: build/models.py:113 +#: build/models.py:134 msgid "Source Location" msgstr "" -#: build/models.py:117 +#: build/models.py:138 msgid "" "Select location to take stock from for this build (leave blank to take from " "any stock location)" msgstr "" -#: build/models.py:121 +#: build/models.py:142 msgid "Build Quantity" msgstr "" -#: build/models.py:124 +#: build/models.py:145 msgid "Number of parts to build" msgstr "" -#: build/models.py:128 part/templates/part/part_base.html:155 +#: build/models.py:149 part/templates/part/part_base.html:155 msgid "Build Status" msgstr "" -#: build/models.py:132 +#: build/models.py:153 msgid "Build status code" msgstr "" -#: build/models.py:136 stock/models.py:387 +#: build/models.py:157 stock/models.py:387 msgid "Batch Code" msgstr "" -#: build/models.py:140 +#: build/models.py:161 msgid "Batch code for this build output" msgstr "" -#: build/models.py:155 build/templates/build/detail.html:55 +#: build/models.py:176 build/templates/build/detail.html:55 #: company/templates/company/supplier_part_base.html:60 #: company/templates/company/supplier_part_detail.html:24 #: part/templates/part/detail.html:80 part/templates/part/part_base.html:102 -#: stock/models.py:381 stock/templates/stock/item_base.html:244 +#: stock/models.py:381 stock/templates/stock/item_base.html:266 msgid "External Link" msgstr "" -#: build/models.py:156 stock/models.py:383 +#: build/models.py:177 stock/models.py:383 msgid "Link to external URL" msgstr "" -#: build/models.py:160 build/templates/build/tabs.html:14 company/models.py:310 -#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15 +#: build/models.py:181 build/templates/build/tabs.html:14 company/models.py:310 +#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18 #: order/templates/order/purchase_order_detail.html:202 #: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:70 #: stock/forms.py:306 stock/forms.py:338 stock/forms.py:366 stock/models.py:453 @@ -364,41 +407,41 @@ msgstr "" msgid "Notes" msgstr "" -#: build/models.py:161 +#: build/models.py:182 msgid "Extra build notes" msgstr "" -#: build/models.py:467 +#: build/models.py:520 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:470 +#: build/models.py:523 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:476 order/models.py:585 +#: build/models.py:529 order/models.py:585 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:479 order/models.py:588 +#: build/models.py:532 order/models.py:588 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:482 +#: build/models.py:535 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:511 +#: build/models.py:564 msgid "Build to allocate parts" msgstr "" -#: build/models.py:518 +#: build/models.py:571 msgid "Stock Item to allocate to build" msgstr "" -#: build/models.py:531 +#: build/models.py:584 msgid "Stock quantity to allocate to build" msgstr "" @@ -424,20 +467,20 @@ msgstr "" msgid "New Stock Item" msgstr "" -#: build/templates/build/allocate.html:88 stock/views.py:1428 +#: build/templates/build/allocate.html:88 stock/views.py:1459 msgid "Create new Stock Item" msgstr "" #: build/templates/build/allocate.html:170 #: order/templates/order/sales_order_detail.html:68 #: order/templates/order/sales_order_detail.html:150 stock/models.py:375 -#: stock/templates/stock/item_base.html:156 +#: stock/templates/stock/item_base.html:178 msgid "Serial Number" msgstr "" #: build/templates/build/allocate.html:172 #: build/templates/build/auto_allocate.html:20 -#: build/templates/build/build_base.html:82 +#: build/templates/build/build_base.html:83 #: build/templates/build/detail.html:27 #: company/templates/company/supplier_part_pricing.html:71 #: order/templates/order/order_wizard/select_parts.html:32 @@ -449,16 +492,16 @@ msgstr "" #: part/templates/part/sale_prices.html:80 stock/forms.py:297 #: stock/templates/stock/item_base.html:26 #: stock/templates/stock/item_base.html:32 -#: stock/templates/stock/item_base.html:162 +#: stock/templates/stock/item_base.html:184 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338 -#: templates/js/bom.html:162 templates/js/build.html:58 +#: templates/js/bom.html:162 templates/js/build.html:72 #: templates/js/stock.html:690 templates/js/stock.html:905 msgid "Quantity" msgstr "" #: build/templates/build/allocate.html:186 #: build/templates/build/auto_allocate.html:21 stock/forms.py:336 -#: stock/templates/stock/item_base.html:198 +#: stock/templates/stock/item_base.html:220 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:183 templates/js/barcode.html:337 #: templates/js/stock.html:518 @@ -466,12 +509,12 @@ msgid "Location" msgstr "" #: build/templates/build/allocate.html:210 -#: order/templates/order/sales_order_detail.html:92 templates/js/build.html:130 +#: order/templates/order/sales_order_detail.html:92 templates/js/build.html:144 msgid "Edit stock allocation" msgstr "" #: build/templates/build/allocate.html:211 -#: order/templates/order/sales_order_detail.html:93 templates/js/build.html:131 +#: order/templates/order/sales_order_detail.html:93 templates/js/build.html:145 msgid "Delete stock allocation" msgstr "" @@ -479,26 +522,6 @@ msgstr "" msgid "No BOM items found" msgstr "" -#: build/templates/build/allocate.html:337 -#: company/templates/company/supplier_part_base.html:53 -#: company/templates/company/supplier_part_detail.html:27 -#: order/templates/order/purchase_order_detail.html:159 -#: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 -#: templates/InvenTree/search.html:147 templates/js/bom.html:147 -#: templates/js/company.html:56 templates/js/order.html:159 -#: templates/js/order.html:234 templates/js/part.html:120 -#: templates/js/part.html:203 templates/js/part.html:345 -#: templates/js/part.html:526 templates/js/stock.html:444 -#: templates/js/stock.html:671 -msgid "Description" -msgstr "" - -#: build/templates/build/allocate.html:342 -#: order/templates/order/purchase_order_detail.html:172 -#: templates/js/bom.html:154 -msgid "Reference" -msgstr "" - #: build/templates/build/allocate.html:347 part/models.py:1401 #: templates/js/part.html:530 templates/js/table_filters.html:121 msgid "Required" @@ -544,81 +567,73 @@ msgstr "" msgid "Stock items will have to be manually allocated" msgstr "" -#: build/templates/build/build_base.html:8 -#: build/templates/build/build_base.html:34 -#: build/templates/build/complete.html:6 -#: stock/templates/stock/item_base.html:223 templates/js/build.html:39 -#: templates/navbar.html:25 -msgid "Build" -msgstr "" - #: build/templates/build/build_base.html:14 -msgid "This build is allocated to Sales Order" +msgid "This Build Order is allocated to Sales Order" msgstr "" #: build/templates/build/build_base.html:19 -msgid "This build is a child of Build" +msgid "This Build Order is a child of Build Order" msgstr "" -#: build/templates/build/build_base.html:39 +#: build/templates/build/build_base.html:37 #: company/templates/company/company_base.html:27 -#: order/templates/order/order_base.html:28 -#: order/templates/order/sales_order_base.html:38 +#: order/templates/order/order_base.html:26 +#: order/templates/order/sales_order_base.html:35 #: part/templates/part/category.html:13 part/templates/part/part_base.html:32 -#: stock/templates/stock/item_base.html:69 +#: stock/templates/stock/item_base.html:76 #: stock/templates/stock/location.html:12 msgid "Admin view" msgstr "" -#: build/templates/build/build_base.html:45 +#: build/templates/build/build_base.html:46 msgid "Edit Build" msgstr "" -#: build/templates/build/build_base.html:49 build/views.py:190 +#: build/templates/build/build_base.html:50 build/views.py:190 msgid "Complete Build" msgstr "" -#: build/templates/build/build_base.html:52 build/views.py:58 +#: build/templates/build/build_base.html:53 build/views.py:58 msgid "Cancel Build" msgstr "" -#: build/templates/build/build_base.html:58 build/views.py:454 +#: build/templates/build/build_base.html:59 build/views.py:456 msgid "Delete Build" msgstr "" -#: build/templates/build/build_base.html:68 build/templates/build/detail.html:9 +#: build/templates/build/build_base.html:69 build/templates/build/detail.html:9 msgid "Build Details" msgstr "" -#: build/templates/build/build_base.html:87 +#: build/templates/build/build_base.html:88 #: build/templates/build/detail.html:42 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:276 templates/InvenTree/search.html:175 -#: templates/js/barcode.html:42 templates/js/build.html:63 +#: stock/templates/stock/item_base.html:298 templates/InvenTree/search.html:175 +#: templates/js/barcode.html:42 templates/js/build.html:77 #: templates/js/order.html:164 templates/js/order.html:239 #: templates/js/stock.html:505 templates/js/stock.html:913 msgid "Status" msgstr "" -#: build/templates/build/build_base.html:100 order/models.py:499 +#: build/templates/build/build_base.html:101 order/models.py:499 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:33 #: order/templates/order/sales_order_notes.html:10 #: order/templates/order/sales_order_ship.html:25 #: part/templates/part/allocation.html:27 -#: stock/templates/stock/item_base.html:186 templates/js/order.html:213 +#: stock/templates/stock/item_base.html:208 templates/js/order.html:213 msgid "Sales Order" msgstr "" -#: build/templates/build/build_base.html:106 +#: build/templates/build/build_base.html:107 msgid "BOM Price" msgstr "" -#: build/templates/build/build_base.html:111 +#: build/templates/build/build_base.html:112 msgid "BOM pricing is incomplete" msgstr "" -#: build/templates/build/build_base.html:114 +#: build/templates/build/build_base.html:115 msgid "No pricing information" msgstr "" @@ -626,6 +641,12 @@ msgstr "" msgid "Build Outputs" msgstr "" +#: build/templates/build/complete.html:6 +#: stock/templates/stock/item_base.html:245 templates/js/build.html:40 +#: templates/navbar.html:25 +msgid "Build" +msgstr "" + #: build/templates/build/complete.html:10 msgid "Build order allocation is complete" msgstr "" @@ -673,15 +694,15 @@ msgid "Stock can be taken from any available location." msgstr "" #: build/templates/build/detail.html:48 -#: stock/templates/stock/item_base.html:216 templates/js/stock.html:513 +#: stock/templates/stock/item_base.html:238 templates/js/stock.html:513 #: templates/js/stock.html:920 templates/js/table_filters.html:34 #: templates/js/table_filters.html:100 msgid "Batch" msgstr "" #: build/templates/build/detail.html:61 -#: order/templates/order/order_base.html:100 -#: order/templates/order/sales_order_base.html:99 templates/js/build.html:71 +#: order/templates/order/order_base.html:98 +#: order/templates/order/sales_order_base.html:100 templates/js/build.html:85 msgid "Created" msgstr "" @@ -697,17 +718,11 @@ msgstr "" msgid "No" msgstr "" -#: build/templates/build/detail.html:80 templates/js/build.html:76 +#: build/templates/build/detail.html:80 templates/js/build.html:90 msgid "Completed" msgstr "" -#: build/templates/build/index.html:6 build/templates/build/index.html:14 -#: order/templates/order/so_builds.html:11 order/templates/order/so_tabs.html:9 -#: part/templates/part/tabs.html:31 users/models.py:30 -msgid "Build Orders" -msgstr "" - -#: build/templates/build/index.html:24 +#: build/templates/build/index.html:24 build/views.py:403 msgid "New Build Order" msgstr "" @@ -766,7 +781,7 @@ msgstr "" msgid "Check the confirmation box at the bottom of the list" msgstr "" -#: build/views.py:152 build/views.py:465 +#: build/views.py:152 build/views.py:467 msgid "Unallocate Stock" msgstr "" @@ -774,7 +789,7 @@ msgstr "" msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:167 stock/views.py:405 +#: build/views.py:167 stock/views.py:421 msgid "Check the confirmation box" msgstr "" @@ -786,7 +801,7 @@ msgstr "" msgid "Invalid location selected" msgstr "" -#: build/views.py:302 stock/views.py:1621 +#: build/views.py:302 stock/views.py:1653 #, python-brace-format msgid "The following serial numbers already exist: ({sn})" msgstr "" @@ -795,75 +810,67 @@ msgstr "" msgid "Build marked as COMPLETE" msgstr "" -#: build/views.py:403 -msgid "Start new Build" -msgstr "" - -#: build/views.py:429 +#: build/views.py:431 msgid "Created new build" msgstr "" -#: build/views.py:439 +#: build/views.py:441 msgid "Edit Build Details" msgstr "" -#: build/views.py:445 +#: build/views.py:447 msgid "Edited build" msgstr "" -#: build/views.py:471 +#: build/views.py:473 msgid "Removed parts from build allocation" msgstr "" -#: build/views.py:481 +#: build/views.py:483 msgid "Allocate new Part" msgstr "" -#: build/views.py:635 +#: build/views.py:637 msgid "Edit Stock Allocation" msgstr "" -#: build/views.py:640 +#: build/views.py:642 msgid "Updated Build Item" msgstr "" -#: common/models.py:75 +#: common/models.py:107 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:77 +#: common/models.py:109 msgid "Settings value" msgstr "" -#: common/models.py:79 -msgid "Settings description" -msgstr "" - -#: common/models.py:92 +#: common/models.py:122 msgid "Key string must be unique" msgstr "" -#: common/models.py:113 +#: common/models.py:143 msgid "Currency Symbol e.g. $" msgstr "" -#: common/models.py:115 +#: common/models.py:145 msgid "Currency Suffix e.g. AUD" msgstr "" -#: common/models.py:117 +#: common/models.py:147 msgid "Currency Description" msgstr "" -#: common/models.py:119 +#: common/models.py:149 msgid "Currency Value" msgstr "" -#: common/models.py:121 +#: common/models.py:151 msgid "Use this currency as the base currency" msgstr "" -#: common/models.py:204 +#: common/models.py:234 msgid "Default" msgstr "" @@ -879,6 +886,10 @@ msgstr "" msgid "Delete Currency" msgstr "" +#: common/views.py:47 +msgid "Change Setting" +msgstr "" + #: company/models.py:86 company/models.py:87 msgid "Company name" msgstr "" @@ -949,7 +960,7 @@ msgid "Does this company manufacture parts?" msgstr "" #: company/models.py:279 stock/models.py:335 -#: stock/templates/stock/item_base.html:148 +#: stock/templates/stock/item_base.html:164 msgid "Base Part" msgstr "" @@ -1018,16 +1029,16 @@ msgstr "" #: company/templates/company/detail.html:21 #: company/templates/company/supplier_part_base.html:66 #: company/templates/company/supplier_part_detail.html:21 -#: order/templates/order/order_base.html:81 +#: order/templates/order/order_base.html:79 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170 -#: stock/templates/stock/item_base.html:251 templates/js/company.html:48 +#: stock/templates/stock/item_base.html:273 templates/js/company.html:48 #: templates/js/company.html:162 templates/js/order.html:146 msgid "Supplier" msgstr "" #: company/templates/company/detail.html:26 -#: order/templates/order/sales_order_base.html:80 stock/models.py:370 -#: stock/models.py:371 stock/templates/stock/item_base.html:169 +#: order/templates/order/sales_order_base.html:81 stock/models.py:370 +#: stock/models.py:371 stock/templates/stock/item_base.html:191 #: templates/js/company.html:40 templates/js/order.html:221 msgid "Customer" msgstr "" @@ -1122,7 +1133,8 @@ msgstr "" #: order/templates/order/purchase_orders.html:7 #: order/templates/order/purchase_orders.html:12 #: part/templates/part/orders.html:9 part/templates/part/tabs.html:48 -#: templates/navbar.html:33 users/models.py:31 +#: templates/InvenTree/settings/tabs.html:27 templates/navbar.html:33 +#: users/models.py:31 msgid "Purchase Orders" msgstr "" @@ -1141,7 +1153,8 @@ msgstr "" #: order/templates/order/sales_orders.html:7 #: order/templates/order/sales_orders.html:12 #: part/templates/part/sales_orders.html:9 part/templates/part/tabs.html:56 -#: templates/navbar.html:42 users/models.py:32 +#: templates/InvenTree/settings/tabs.html:30 templates/navbar.html:42 +#: users/models.py:32 msgid "Sales Orders" msgstr "" @@ -1157,7 +1170,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:6 #: company/templates/company/supplier_part_base.html:19 stock/models.py:344 -#: stock/templates/stock/item_base.html:256 templates/js/company.html:178 +#: stock/templates/stock/item_base.html:278 templates/js/company.html:178 msgid "Supplier Part" msgstr "" @@ -1200,11 +1213,11 @@ msgstr "" msgid "Note" msgstr "" -#: company/templates/company/supplier_part_orders.html:11 +#: company/templates/company/supplier_part_orders.html:9 msgid "Supplier Part Orders" msgstr "" -#: company/templates/company/supplier_part_pricing.html:12 +#: company/templates/company/supplier_part_pricing.html:10 msgid "Pricing Information" msgstr "" @@ -1233,7 +1246,7 @@ msgstr "" msgid "Delete price break" msgstr "" -#: company/templates/company/supplier_part_stock.html:11 +#: company/templates/company/supplier_part_stock.html:9 msgid "Supplier Part Stock" msgstr "" @@ -1244,8 +1257,9 @@ msgstr "" #: company/templates/company/supplier_part_tabs.html:8 #: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18 #: stock/templates/stock/location.html:17 templates/InvenTree/search.html:155 -#: templates/js/part.html:124 templates/js/part.html:372 -#: templates/js/stock.html:452 templates/navbar.html:22 users/models.py:29 +#: templates/InvenTree/settings/tabs.html:21 templates/js/part.html:124 +#: templates/js/part.html:372 templates/js/stock.html:452 +#: templates/navbar.html:22 users/models.py:29 msgid "Stock" msgstr "" @@ -1256,7 +1270,8 @@ msgstr "" #: company/templates/company/tabs.html:9 #: order/templates/order/receive_parts.html:14 part/models.py:294 #: part/templates/part/cat_link.html:7 part/templates/part/category.html:94 -#: part/templates/part/category_tabs.html:6 templates/navbar.html:19 +#: part/templates/part/category_tabs.html:6 +#: templates/InvenTree/settings/tabs.html:18 templates/navbar.html:19 #: templates/stats.html:8 templates/stats.html:17 users/models.py:28 msgid "Parts" msgstr "" @@ -1370,20 +1385,20 @@ msgstr "" msgid "Enabled" msgstr "" -#: order/forms.py:24 order/templates/order/order_base.html:40 +#: order/forms.py:24 order/templates/order/order_base.html:39 msgid "Place order" msgstr "" -#: order/forms.py:35 order/templates/order/order_base.html:47 +#: order/forms.py:35 order/templates/order/order_base.html:46 msgid "Mark order as complete" msgstr "" -#: order/forms.py:46 order/forms.py:57 order/templates/order/order_base.html:52 -#: order/templates/order/sales_order_base.html:52 +#: order/forms.py:46 order/forms.py:57 order/templates/order/order_base.html:51 +#: order/templates/order/sales_order_base.html:53 msgid "Cancel order" msgstr "" -#: order/forms.py:68 order/templates/order/sales_order_base.html:49 +#: order/forms.py:68 order/templates/order/sales_order_base.html:50 msgid "Ship order" msgstr "" @@ -1392,7 +1407,7 @@ msgid "Receive parts to this location" msgstr "" #: order/forms.py:99 -msgid "Enter purchase order number" +msgid "Purchase Order reference" msgstr "" #: order/forms.py:126 @@ -1473,8 +1488,8 @@ msgid "Line item notes" msgstr "" #: order/models.py:466 order/templates/order/order_base.html:9 -#: order/templates/order/order_base.html:23 -#: stock/templates/stock/item_base.html:230 templates/js/order.html:138 +#: order/templates/order/order_base.html:24 +#: stock/templates/stock/item_base.html:252 templates/js/order.html:138 msgid "Purchase Order" msgstr "" @@ -1516,44 +1531,44 @@ msgstr "" msgid "Are you sure you want to delete this attachment?" msgstr "" -#: order/templates/order/order_base.html:36 +#: order/templates/order/order_base.html:35 msgid "Edit order information" msgstr "" -#: order/templates/order/order_base.html:44 +#: order/templates/order/order_base.html:43 msgid "Receive items" msgstr "" -#: order/templates/order/order_base.html:57 +#: order/templates/order/order_base.html:56 msgid "Export order to file" msgstr "" -#: order/templates/order/order_base.html:66 +#: order/templates/order/order_base.html:64 msgid "Purchase Order Details" msgstr "" -#: order/templates/order/order_base.html:71 -#: order/templates/order/sales_order_base.html:70 +#: order/templates/order/order_base.html:69 +#: order/templates/order/sales_order_base.html:71 msgid "Order Reference" msgstr "" -#: order/templates/order/order_base.html:76 -#: order/templates/order/sales_order_base.html:75 +#: order/templates/order/order_base.html:74 +#: order/templates/order/sales_order_base.html:76 msgid "Order Status" msgstr "" -#: order/templates/order/order_base.html:87 templates/js/order.html:153 +#: order/templates/order/order_base.html:85 templates/js/order.html:153 msgid "Supplier Reference" msgstr "" -#: order/templates/order/order_base.html:106 +#: order/templates/order/order_base.html:104 msgid "Issued" msgstr "" -#: order/templates/order/order_base.html:113 +#: order/templates/order/order_base.html:111 #: order/templates/order/purchase_order_detail.html:182 #: order/templates/order/receive_parts.html:22 -#: order/templates/order/sales_order_base.html:112 +#: order/templates/order/sales_order_base.html:113 msgid "Received" msgstr "" @@ -1598,8 +1613,7 @@ msgid "Select existing purchase orders, or create new orders." msgstr "" #: order/templates/order/order_wizard/select_pos.html:31 -#: order/templates/order/po_tabs.html:5 templates/js/order.html:177 -#: templates/js/order.html:257 +#: templates/js/order.html:177 templates/js/order.html:257 msgid "Items" msgstr "" @@ -1615,7 +1629,16 @@ msgstr "" msgid "Purchase Order Attachments" msgstr "" -#: order/templates/order/po_tabs.html:8 order/templates/order/so_tabs.html:16 +#: order/templates/order/po_received_items.html:11 +#: order/templates/order/po_tabs.html:8 +msgid "Received Items" +msgstr "" + +#: order/templates/order/po_tabs.html:5 +msgid "Line Items" +msgstr "" + +#: order/templates/order/po_tabs.html:11 order/templates/order/so_tabs.html:16 #: part/templates/part/tabs.html:67 stock/templates/stock/tabs.html:32 msgid "Attachments" msgstr "" @@ -1639,7 +1662,7 @@ msgstr "" #: order/templates/order/purchase_order_detail.html:39 #: order/templates/order/purchase_order_detail.html:119 -#: stock/templates/stock/location.html:21 +#: stock/templates/stock/location.html:22 msgid "Create new stock location" msgstr "" @@ -1690,15 +1713,15 @@ msgstr "" msgid "This SalesOrder has not been fully allocated" msgstr "" -#: order/templates/order/sales_order_base.html:57 +#: order/templates/order/sales_order_base.html:58 msgid "Packing List" msgstr "" -#: order/templates/order/sales_order_base.html:65 +#: order/templates/order/sales_order_base.html:66 msgid "Sales Order Details" msgstr "" -#: order/templates/order/sales_order_base.html:86 templates/js/order.html:228 +#: order/templates/order/sales_order_base.html:87 templates/js/order.html:228 msgid "Customer Reference" msgstr "" @@ -1766,7 +1789,7 @@ msgstr "" msgid "Add Purchase Order Attachment" msgstr "" -#: order/views.py:109 order/views.py:157 part/views.py:92 stock/views.py:167 +#: order/views.py:109 order/views.py:157 part/views.py:92 stock/views.py:175 msgid "Added attachment" msgstr "" @@ -1786,7 +1809,7 @@ msgstr "" msgid "Delete Attachment" msgstr "" -#: order/views.py:233 order/views.py:248 stock/views.py:223 +#: order/views.py:233 order/views.py:248 stock/views.py:233 msgid "Deleted attachment" msgstr "" @@ -2266,17 +2289,12 @@ msgstr "" #: part/templates/part/allocation.html:45 #: stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:58 -#: stock/templates/stock/item_base.html:238 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:112 +#: stock/templates/stock/item_base.html:260 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:126 #: templates/js/stock.html:660 templates/js/stock.html:896 msgid "Stock Item" msgstr "" -#: part/templates/part/allocation.html:20 -#: stock/templates/stock/item_base.html:192 -msgid "Build Order" -msgstr "" - #: part/templates/part/attachments.html:8 msgid "Part Attachments" msgstr "" @@ -2473,7 +2491,7 @@ msgstr "" msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:214 stock/views.py:1314 +#: part/templates/part/category.html:214 stock/views.py:1343 msgid "Create new Stock Location" msgstr "" @@ -2644,7 +2662,7 @@ msgstr "" msgid "Add new parameter" msgstr "" -#: part/templates/part/params.html:14 templates/InvenTree/settings/part.html:12 +#: part/templates/part/params.html:14 templates/InvenTree/settings/part.html:17 msgid "New Parameter" msgstr "" @@ -2688,20 +2706,20 @@ msgid "Star this part" msgstr "" #: part/templates/part/part_base.html:49 -#: stock/templates/stock/item_base.html:81 -#: stock/templates/stock/location.html:27 +#: stock/templates/stock/item_base.html:88 +#: stock/templates/stock/location.html:29 msgid "Barcode actions" msgstr "" #: part/templates/part/part_base.html:51 -#: stock/templates/stock/item_base.html:83 -#: stock/templates/stock/location.html:29 +#: stock/templates/stock/item_base.html:90 +#: stock/templates/stock/location.html:31 msgid "Show QR Code" msgstr "" #: part/templates/part/part_base.html:52 -#: stock/templates/stock/item_base.html:84 -#: stock/templates/stock/location.html:30 +#: stock/templates/stock/item_base.html:91 +#: stock/templates/stock/location.html:32 msgid "Print Label" msgstr "" @@ -2830,7 +2848,7 @@ msgstr "" msgid "Used In" msgstr "" -#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:282 +#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:304 msgid "Tests" msgstr "" @@ -2862,7 +2880,7 @@ msgstr "" msgid "Add part attachment" msgstr "" -#: part/views.py:131 templates/attachment_table.html:30 +#: part/views.py:131 templates/attachment_table.html:32 msgid "Edit attachment" msgstr "" @@ -3111,7 +3129,7 @@ msgstr "" msgid "Add note (required)" msgstr "" -#: stock/forms.py:370 stock/views.py:895 stock/views.py:1092 +#: stock/forms.py:370 stock/views.py:921 stock/views.py:1119 msgid "Confirm stock adjustment" msgstr "" @@ -3176,7 +3194,7 @@ msgstr "" msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:358 stock/templates/stock/item_base.html:177 +#: stock/models.py:358 stock/templates/stock/item_base.html:199 msgid "Installed In" msgstr "" @@ -3386,106 +3404,106 @@ msgid "" "This stock item will be automatically deleted when all stock is depleted." msgstr "" -#: stock/templates/stock/item_base.html:86 templates/js/barcode.html:283 +#: stock/templates/stock/item_base.html:94 templates/js/barcode.html:283 #: templates/js/barcode.html:288 msgid "Unlink Barcode" msgstr "" -#: stock/templates/stock/item_base.html:88 +#: stock/templates/stock/item_base.html:96 msgid "Link Barcode" msgstr "" -#: stock/templates/stock/item_base.html:94 +#: stock/templates/stock/item_base.html:104 msgid "Stock adjustment actions" msgstr "" -#: stock/templates/stock/item_base.html:98 -#: stock/templates/stock/location.html:38 templates/stock_table.html:19 +#: stock/templates/stock/item_base.html:108 +#: stock/templates/stock/location.html:41 templates/stock_table.html:19 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:99 templates/stock_table.html:17 +#: stock/templates/stock/item_base.html:109 templates/stock_table.html:17 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:100 templates/stock_table.html:18 +#: stock/templates/stock/item_base.html:110 templates/stock_table.html:18 msgid "Remove stock" msgstr "" -#: stock/templates/stock/item_base.html:102 +#: stock/templates/stock/item_base.html:112 msgid "Transfer stock" msgstr "" -#: stock/templates/stock/item_base.html:104 +#: stock/templates/stock/item_base.html:114 msgid "Serialize stock" msgstr "" -#: stock/templates/stock/item_base.html:108 +#: stock/templates/stock/item_base.html:118 msgid "Assign to customer" msgstr "" -#: stock/templates/stock/item_base.html:111 +#: stock/templates/stock/item_base.html:121 msgid "Return to stock" msgstr "" -#: stock/templates/stock/item_base.html:115 templates/js/stock.html:933 +#: stock/templates/stock/item_base.html:125 templates/js/stock.html:933 msgid "Uninstall stock item" msgstr "" -#: stock/templates/stock/item_base.html:115 +#: stock/templates/stock/item_base.html:125 msgid "Uninstall" msgstr "" -#: stock/templates/stock/item_base.html:122 -#: stock/templates/stock/location.html:35 +#: stock/templates/stock/item_base.html:134 +#: stock/templates/stock/location.html:38 msgid "Stock actions" msgstr "" -#: stock/templates/stock/item_base.html:126 +#: stock/templates/stock/item_base.html:137 msgid "Convert to variant" msgstr "" -#: stock/templates/stock/item_base.html:128 +#: stock/templates/stock/item_base.html:140 msgid "Duplicate stock item" msgstr "" -#: stock/templates/stock/item_base.html:129 +#: stock/templates/stock/item_base.html:142 msgid "Edit stock item" msgstr "" -#: stock/templates/stock/item_base.html:131 +#: stock/templates/stock/item_base.html:145 msgid "Delete stock item" msgstr "" -#: stock/templates/stock/item_base.html:135 +#: stock/templates/stock/item_base.html:151 msgid "Generate test report" msgstr "" -#: stock/templates/stock/item_base.html:143 +#: stock/templates/stock/item_base.html:159 msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:202 +#: stock/templates/stock/item_base.html:224 msgid "No location set" msgstr "" -#: stock/templates/stock/item_base.html:209 -msgid "Unique Identifier" +#: stock/templates/stock/item_base.html:231 +msgid "Barcode Identifier" msgstr "" -#: stock/templates/stock/item_base.html:237 +#: stock/templates/stock/item_base.html:259 msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:262 +#: stock/templates/stock/item_base.html:284 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:267 +#: stock/templates/stock/item_base.html:289 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:271 +#: stock/templates/stock/item_base.html:293 msgid "No stocktake performed" msgstr "" @@ -3549,50 +3567,50 @@ msgstr "" msgid "All stock items" msgstr "" -#: stock/templates/stock/location.html:31 +#: stock/templates/stock/location.html:33 msgid "Check-in Items" msgstr "" -#: stock/templates/stock/location.html:42 +#: stock/templates/stock/location.html:45 msgid "Location actions" msgstr "" -#: stock/templates/stock/location.html:44 +#: stock/templates/stock/location.html:47 msgid "Edit location" msgstr "" -#: stock/templates/stock/location.html:45 +#: stock/templates/stock/location.html:49 msgid "Delete location" msgstr "" -#: stock/templates/stock/location.html:53 +#: stock/templates/stock/location.html:59 msgid "Location Details" msgstr "" -#: stock/templates/stock/location.html:58 +#: stock/templates/stock/location.html:64 msgid "Location Path" msgstr "" -#: stock/templates/stock/location.html:63 +#: stock/templates/stock/location.html:69 msgid "Location Description" msgstr "" -#: stock/templates/stock/location.html:68 +#: stock/templates/stock/location.html:74 msgid "Sublocations" msgstr "" -#: stock/templates/stock/location.html:73 -#: stock/templates/stock/location.html:88 +#: stock/templates/stock/location.html:79 +#: stock/templates/stock/location.html:94 #: templates/InvenTree/search_stock_items.html:6 templates/stats.html:21 #: templates/stats.html:30 msgid "Stock Items" msgstr "" -#: stock/templates/stock/location.html:78 +#: stock/templates/stock/location.html:84 msgid "Stock Details" msgstr "" -#: stock/templates/stock/location.html:83 +#: stock/templates/stock/location.html:89 #: templates/InvenTree/search_stock_location.html:6 templates/stats.html:25 msgid "Stock Locations" msgstr "" @@ -3605,7 +3623,7 @@ msgstr "" msgid "The following stock items will be uninstalled" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1287 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1315 msgid "Convert Stock Item" msgstr "" @@ -3637,214 +3655,214 @@ msgstr "" msgid "Installed Items" msgstr "" -#: stock/views.py:114 +#: stock/views.py:119 msgid "Edit Stock Location" msgstr "" -#: stock/views.py:138 +#: stock/views.py:144 msgid "Stock Location QR code" msgstr "" -#: stock/views.py:156 +#: stock/views.py:163 msgid "Add Stock Item Attachment" msgstr "" -#: stock/views.py:201 +#: stock/views.py:209 msgid "Edit Stock Item Attachment" msgstr "" -#: stock/views.py:217 +#: stock/views.py:226 msgid "Delete Stock Item Attachment" msgstr "" -#: stock/views.py:233 +#: stock/views.py:243 msgid "Assign to Customer" msgstr "" -#: stock/views.py:270 +#: stock/views.py:281 msgid "Return to Stock" msgstr "" -#: stock/views.py:289 +#: stock/views.py:301 msgid "Specify a valid location" msgstr "" -#: stock/views.py:293 +#: stock/views.py:305 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:305 +#: stock/views.py:317 msgid "Select Label Template" msgstr "" -#: stock/views.py:327 +#: stock/views.py:340 msgid "Select valid label" msgstr "" -#: stock/views.py:389 +#: stock/views.py:404 msgid "Delete All Test Data" msgstr "" -#: stock/views.py:404 +#: stock/views.py:420 msgid "Confirm test data deletion" msgstr "" -#: stock/views.py:424 +#: stock/views.py:440 msgid "Add Test Result" msgstr "" -#: stock/views.py:461 +#: stock/views.py:478 msgid "Edit Test Result" msgstr "" -#: stock/views.py:478 +#: stock/views.py:496 msgid "Delete Test Result" msgstr "" -#: stock/views.py:489 +#: stock/views.py:508 msgid "Select Test Report Template" msgstr "" -#: stock/views.py:503 +#: stock/views.py:523 msgid "Select valid template" msgstr "" -#: stock/views.py:555 +#: stock/views.py:576 msgid "Stock Export Options" msgstr "" -#: stock/views.py:675 +#: stock/views.py:698 msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:700 +#: stock/views.py:724 msgid "Install Stock Item" msgstr "" -#: stock/views.py:799 +#: stock/views.py:824 msgid "Uninstall Stock Items" msgstr "" -#: stock/views.py:906 +#: stock/views.py:932 msgid "Uninstalled stock items" msgstr "" -#: stock/views.py:931 +#: stock/views.py:957 msgid "Adjust Stock" msgstr "" -#: stock/views.py:1040 +#: stock/views.py:1067 msgid "Move Stock Items" msgstr "" -#: stock/views.py:1041 +#: stock/views.py:1068 msgid "Count Stock Items" msgstr "" -#: stock/views.py:1042 +#: stock/views.py:1069 msgid "Remove From Stock" msgstr "" -#: stock/views.py:1043 +#: stock/views.py:1070 msgid "Add Stock Items" msgstr "" -#: stock/views.py:1044 +#: stock/views.py:1071 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:1072 +#: stock/views.py:1099 msgid "Must enter integer value" msgstr "" -#: stock/views.py:1077 +#: stock/views.py:1104 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:1084 +#: stock/views.py:1111 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:1163 +#: stock/views.py:1190 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:1178 +#: stock/views.py:1205 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:1191 +#: stock/views.py:1218 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:1219 +#: stock/views.py:1246 msgid "No items were moved" msgstr "" -#: stock/views.py:1222 +#: stock/views.py:1249 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1241 +#: stock/views.py:1268 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1253 +#: stock/views.py:1280 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1335 +#: stock/views.py:1365 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1527 +#: stock/views.py:1559 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1593 +#: stock/views.py:1625 msgid "Invalid quantity" msgstr "" -#: stock/views.py:1596 +#: stock/views.py:1628 msgid "Quantity cannot be less than zero" msgstr "" -#: stock/views.py:1600 +#: stock/views.py:1632 msgid "Invalid part selection" msgstr "" -#: stock/views.py:1649 +#: stock/views.py:1681 #, python-brace-format msgid "Created {n} new stock items" msgstr "" -#: stock/views.py:1668 stock/views.py:1684 +#: stock/views.py:1700 stock/views.py:1716 msgid "Created new stock item" msgstr "" -#: stock/views.py:1703 +#: stock/views.py:1735 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1716 +#: stock/views.py:1749 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1727 +#: stock/views.py:1761 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1744 +#: stock/views.py:1780 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1753 +#: stock/views.py:1790 msgid "Add Stock Tracking Entry" msgstr "" @@ -3856,6 +3874,14 @@ msgstr "" msgid "You do not have permission to view this page." msgstr "" +#: templates/404.html:5 templates/404.html:11 +msgid "Page Not Found" +msgstr "" + +#: templates/404.html:14 +msgid "The requested page does not exist" +msgstr "" + #: templates/InvenTree/bom_invalid.html:7 msgid "BOM Waiting Validation" msgstr "" @@ -3904,23 +3930,105 @@ msgstr "" msgid "Searching" msgstr "" +#: templates/InvenTree/settings/build.html:10 +msgid "Build Order Settings" +msgstr "" + +#: templates/InvenTree/settings/build.html:19 +msgid "Reference Prefix" +msgstr "" + +#: templates/InvenTree/settings/build.html:21 +msgid "Prefix for Build Order reference" +msgstr "" + +#: templates/InvenTree/settings/build.html:24 +msgid "Reference Regex" +msgstr "" + +#: templates/InvenTree/settings/build.html:26 +msgid "Regex validator for Build Order reference" +msgstr "" + +#: templates/InvenTree/settings/currency.html:5 +msgid "General Settings" +msgstr "" + +#: templates/InvenTree/settings/currency.html:14 +msgid "Currencies" +msgstr "" + +#: templates/InvenTree/settings/currency.html:17 +msgid "New Currency" +msgstr "" + #: templates/InvenTree/settings/part.html:9 +msgid "Part Settings" +msgstr "" + +#: templates/InvenTree/settings/part.html:14 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:28 +#: templates/InvenTree/settings/part.html:33 msgid "No part parameter templates found" msgstr "" -#: templates/InvenTree/settings/part.html:48 +#: templates/InvenTree/settings/part.html:53 msgid "Edit Template" msgstr "" -#: templates/InvenTree/settings/part.html:49 +#: templates/InvenTree/settings/part.html:54 msgid "Delete Template" msgstr "" -#: templates/InvenTree/settings/theme.html:25 +#: templates/InvenTree/settings/po.html:9 +msgid "Purchase Order Settings" +msgstr "" + +#: templates/InvenTree/settings/settings.html:7 +#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:62 +msgid "Settings" +msgstr "" + +#: templates/InvenTree/settings/so.html:9 +msgid "Sales Order Settings" +msgstr "" + +#: templates/InvenTree/settings/stock.html:9 +msgid "Stock Settings" +msgstr "" + +#: templates/InvenTree/settings/tabs.html:3 +#: templates/InvenTree/settings/user.html:10 +msgid "User Settings" +msgstr "" + +#: templates/InvenTree/settings/tabs.html:6 +msgid "Account" +msgstr "" + +#: templates/InvenTree/settings/tabs.html:9 +msgid "Theme" +msgstr "" + +#: templates/InvenTree/settings/tabs.html:12 +msgid "InvenTree Settings" +msgstr "" + +#: templates/InvenTree/settings/tabs.html:15 +msgid "Currency" +msgstr "" + +#: templates/InvenTree/settings/theme.html:10 +msgid "Theme Settings" +msgstr "" + +#: templates/InvenTree/settings/theme.html:17 +msgid "Color Themes" +msgstr "" + +#: templates/InvenTree/settings/theme.html:29 #, python-format msgid "" "\n" @@ -3930,6 +4038,26 @@ msgid "" "\t" msgstr "" +#: templates/InvenTree/settings/user.html:16 +msgid "User Information" +msgstr "" + +#: templates/InvenTree/settings/user.html:24 +msgid "Username" +msgstr "" + +#: templates/InvenTree/settings/user.html:28 +msgid "First Name" +msgstr "" + +#: templates/InvenTree/settings/user.html:32 +msgid "Last Name" +msgstr "" + +#: templates/InvenTree/settings/user.html:36 +msgid "Email Address" +msgstr "" + #: templates/InvenTree/so_outstanding.html:7 msgid "Outstanding Sales Orders" msgstr "" @@ -3974,23 +4102,23 @@ msgstr "" msgid "Submit Bug Report" msgstr "" -#: templates/attachment_table.html:5 +#: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "" -#: templates/attachment_table.html:13 +#: templates/attachment_table.html:15 msgid "File" msgstr "" -#: templates/attachment_table.html:14 +#: templates/attachment_table.html:16 msgid "Comment" msgstr "" -#: templates/attachment_table.html:15 +#: templates/attachment_table.html:17 msgid "Uploaded" msgstr "" -#: templates/attachment_table.html:33 +#: templates/attachment_table.html:35 msgid "Delete attachment" msgstr "" @@ -4079,7 +4207,7 @@ msgstr "" msgid "Optional" msgstr "" -#: templates/js/bom.html:188 templates/js/build.html:119 +#: templates/js/bom.html:188 templates/js/build.html:133 msgid "Available" msgstr "" @@ -4107,11 +4235,11 @@ msgstr "" msgid "Delete BOM Item" msgstr "" -#: templates/js/build.html:23 +#: templates/js/build.html:24 msgid "No builds matching query" msgstr "" -#: templates/js/build.html:108 +#: templates/js/build.html:122 msgid "No parts allocated for" msgstr "" @@ -4449,10 +4577,6 @@ msgstr "" msgid "Admin" msgstr "" -#: templates/navbar.html:62 -msgid "Settings" -msgstr "" - #: templates/navbar.html:63 msgid "Logout" msgstr "" diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po index 74b435c791..5c6d3a00c1 100644 --- a/InvenTree/locale/es/LC_MESSAGES/django.po +++ b/InvenTree/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-06 09:31+0000\n" +"POT-Creation-Date: 2020-10-19 21:40+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -26,7 +26,7 @@ msgstr "" msgid "No matching action found" msgstr "" -#: InvenTree/forms.py:102 build/forms.py:37 +#: InvenTree/forms.py:102 build/forms.py:49 msgid "Confirm" msgstr "" @@ -46,34 +46,34 @@ msgstr "" msgid "Apply Theme" msgstr "" -#: InvenTree/helpers.py:339 order/models.py:187 order/models.py:261 +#: InvenTree/helpers.py:348 order/models.py:187 order/models.py:261 msgid "Invalid quantity provided" msgstr "" -#: InvenTree/helpers.py:342 +#: InvenTree/helpers.py:351 msgid "Empty serial number string" msgstr "" -#: InvenTree/helpers.py:363 +#: InvenTree/helpers.py:372 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:367 InvenTree/helpers.py:370 InvenTree/helpers.py:373 +#: InvenTree/helpers.py:376 InvenTree/helpers.py:379 InvenTree/helpers.py:382 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:378 +#: InvenTree/helpers.py:387 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:386 +#: InvenTree/helpers.py:395 msgid "No serial numbers found" msgstr "" -#: InvenTree/helpers.py:390 +#: InvenTree/helpers.py:399 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" @@ -144,7 +144,7 @@ msgid "Returned" msgstr "" #: InvenTree/status_codes.py:136 -#: order/templates/order/sales_order_base.html:105 +#: order/templates/order/sales_order_base.html:106 msgid "Shipped" msgstr "" @@ -170,7 +170,7 @@ msgstr "" #: InvenTree/status_codes.py:223 build/templates/build/allocate.html:358 #: order/templates/order/sales_order_detail.html:221 -#: part/templates/part/tabs.html:23 templates/js/build.html:126 +#: part/templates/part/tabs.html:23 templates/js/build.html:140 msgid "Allocated" msgstr "" @@ -182,20 +182,25 @@ msgstr "" msgid "IPN must match regex pattern" msgstr "" -#: InvenTree/validators.py:60 +#: InvenTree/validators.py:66 InvenTree/validators.py:80 +#: InvenTree/validators.py:94 +msgid "Reference must match pattern" +msgstr "" + +#: InvenTree/validators.py:102 #, python-brace-format msgid "Illegal character in name ({x})" msgstr "" -#: InvenTree/validators.py:79 InvenTree/validators.py:95 +#: InvenTree/validators.py:121 InvenTree/validators.py:137 msgid "Overage value must not be negative" msgstr "" -#: InvenTree/validators.py:97 +#: InvenTree/validators.py:139 msgid "Overage must not exceed 100%" msgstr "" -#: InvenTree/validators.py:104 +#: InvenTree/validators.py:146 msgid "Overage must be an integer value or a percentage" msgstr "" @@ -243,45 +248,83 @@ msgstr "" msgid "Barcode associated with StockItem" msgstr "" -#: build/forms.py:58 +#: build/forms.py:28 +msgid "Build Order reference" +msgstr "" + +#: build/forms.py:70 msgid "Location of completed parts" msgstr "" -#: build/forms.py:62 +#: build/forms.py:74 msgid "Serial numbers" msgstr "" -#: build/forms.py:64 stock/forms.py:111 +#: build/forms.py:76 stock/forms.py:111 msgid "Enter unique serial numbers (or leave blank)" msgstr "" -#: build/forms.py:67 +#: build/forms.py:79 msgid "Confirm build completion" msgstr "" -#: build/models.py:67 +#: build/models.py:54 build/templates/build/build_base.html:8 +#: build/templates/build/build_base.html:35 +#: part/templates/part/allocation.html:20 +#: stock/templates/stock/item_base.html:214 +msgid "Build Order" +msgstr "" + +#: build/models.py:55 build/templates/build/index.html:6 +#: build/templates/build/index.html:14 order/templates/order/so_builds.html:11 +#: order/templates/order/so_tabs.html:9 part/templates/part/tabs.html:31 +#: templates/InvenTree/settings/tabs.html:24 users/models.py:30 +msgid "Build Orders" +msgstr "" + +#: build/models.py:77 msgid "Build quantity must be integer value for trackable parts" msgstr "" -#: build/models.py:73 build/templates/build/build_base.html:72 -msgid "Build Title" +#: build/models.py:86 build/templates/build/build_base.html:73 +msgid "Build Order Reference" msgstr "" -#: build/models.py:76 +#: build/models.py:87 build/templates/build/allocate.html:342 +#: order/templates/order/purchase_order_detail.html:172 +#: templates/js/bom.html:154 +msgid "Reference" +msgstr "" + +#: build/models.py:94 build/templates/build/allocate.html:337 +#: company/templates/company/supplier_part_base.html:53 +#: company/templates/company/supplier_part_detail.html:27 +#: order/templates/order/purchase_order_detail.html:159 +#: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 +#: templates/InvenTree/search.html:147 templates/js/bom.html:147 +#: templates/js/build.html:56 templates/js/company.html:56 +#: templates/js/order.html:159 templates/js/order.html:234 +#: templates/js/part.html:120 templates/js/part.html:203 +#: templates/js/part.html:345 templates/js/part.html:526 +#: templates/js/stock.html:444 templates/js/stock.html:671 +msgid "Description" +msgstr "" + +#: build/models.py:97 msgid "Brief description of the build" msgstr "" -#: build/models.py:84 build/templates/build/build_base.html:93 +#: build/models.py:105 build/templates/build/build_base.html:94 msgid "Parent Build" msgstr "" -#: build/models.py:85 +#: build/models.py:106 msgid "Parent build to which this build is allocated" msgstr "" -#: build/models.py:90 build/templates/build/allocate.html:329 +#: build/models.py:111 build/templates/build/allocate.html:329 #: build/templates/build/auto_allocate.html:19 -#: build/templates/build/build_base.html:77 +#: build/templates/build/build_base.html:78 #: build/templates/build/detail.html:22 order/models.py:501 #: order/templates/order/order_wizard/select_parts.html:30 #: order/templates/order/purchase_order_detail.html:147 @@ -289,72 +332,72 @@ msgstr "" #: part/templates/part/part_app_base.html:7 #: part/templates/part/set_category.html:13 templates/InvenTree/search.html:133 #: templates/js/barcode.html:336 templates/js/bom.html:124 -#: templates/js/build.html:47 templates/js/company.html:137 +#: templates/js/build.html:61 templates/js/company.html:137 #: templates/js/part.html:184 templates/js/part.html:289 #: templates/js/stock.html:421 templates/js/stock.html:977 msgid "Part" msgstr "" -#: build/models.py:99 +#: build/models.py:120 msgid "Select part to build" msgstr "" -#: build/models.py:104 +#: build/models.py:125 msgid "Sales Order Reference" msgstr "" -#: build/models.py:108 +#: build/models.py:129 msgid "SalesOrder to which this build is allocated" msgstr "" -#: build/models.py:113 +#: build/models.py:134 msgid "Source Location" msgstr "" -#: build/models.py:117 +#: build/models.py:138 msgid "" "Select location to take stock from for this build (leave blank to take from " "any stock location)" msgstr "" -#: build/models.py:121 +#: build/models.py:142 msgid "Build Quantity" msgstr "" -#: build/models.py:124 +#: build/models.py:145 msgid "Number of parts to build" msgstr "" -#: build/models.py:128 part/templates/part/part_base.html:155 +#: build/models.py:149 part/templates/part/part_base.html:155 msgid "Build Status" msgstr "" -#: build/models.py:132 +#: build/models.py:153 msgid "Build status code" msgstr "" -#: build/models.py:136 stock/models.py:387 +#: build/models.py:157 stock/models.py:387 msgid "Batch Code" msgstr "" -#: build/models.py:140 +#: build/models.py:161 msgid "Batch code for this build output" msgstr "" -#: build/models.py:155 build/templates/build/detail.html:55 +#: build/models.py:176 build/templates/build/detail.html:55 #: company/templates/company/supplier_part_base.html:60 #: company/templates/company/supplier_part_detail.html:24 #: part/templates/part/detail.html:80 part/templates/part/part_base.html:102 -#: stock/models.py:381 stock/templates/stock/item_base.html:244 +#: stock/models.py:381 stock/templates/stock/item_base.html:266 msgid "External Link" msgstr "" -#: build/models.py:156 stock/models.py:383 +#: build/models.py:177 stock/models.py:383 msgid "Link to external URL" msgstr "" -#: build/models.py:160 build/templates/build/tabs.html:14 company/models.py:310 -#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15 +#: build/models.py:181 build/templates/build/tabs.html:14 company/models.py:310 +#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:18 #: order/templates/order/purchase_order_detail.html:202 #: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:70 #: stock/forms.py:306 stock/forms.py:338 stock/forms.py:366 stock/models.py:453 @@ -364,41 +407,41 @@ msgstr "" msgid "Notes" msgstr "" -#: build/models.py:161 +#: build/models.py:182 msgid "Extra build notes" msgstr "" -#: build/models.py:467 +#: build/models.py:520 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:470 +#: build/models.py:523 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:476 order/models.py:585 +#: build/models.py:529 order/models.py:585 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:479 order/models.py:588 +#: build/models.py:532 order/models.py:588 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:482 +#: build/models.py:535 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:511 +#: build/models.py:564 msgid "Build to allocate parts" msgstr "" -#: build/models.py:518 +#: build/models.py:571 msgid "Stock Item to allocate to build" msgstr "" -#: build/models.py:531 +#: build/models.py:584 msgid "Stock quantity to allocate to build" msgstr "" @@ -424,20 +467,20 @@ msgstr "" msgid "New Stock Item" msgstr "" -#: build/templates/build/allocate.html:88 stock/views.py:1428 +#: build/templates/build/allocate.html:88 stock/views.py:1459 msgid "Create new Stock Item" msgstr "" #: build/templates/build/allocate.html:170 #: order/templates/order/sales_order_detail.html:68 #: order/templates/order/sales_order_detail.html:150 stock/models.py:375 -#: stock/templates/stock/item_base.html:156 +#: stock/templates/stock/item_base.html:178 msgid "Serial Number" msgstr "" #: build/templates/build/allocate.html:172 #: build/templates/build/auto_allocate.html:20 -#: build/templates/build/build_base.html:82 +#: build/templates/build/build_base.html:83 #: build/templates/build/detail.html:27 #: company/templates/company/supplier_part_pricing.html:71 #: order/templates/order/order_wizard/select_parts.html:32 @@ -449,16 +492,16 @@ msgstr "" #: part/templates/part/sale_prices.html:80 stock/forms.py:297 #: stock/templates/stock/item_base.html:26 #: stock/templates/stock/item_base.html:32 -#: stock/templates/stock/item_base.html:162 +#: stock/templates/stock/item_base.html:184 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338 -#: templates/js/bom.html:162 templates/js/build.html:58 +#: templates/js/bom.html:162 templates/js/build.html:72 #: templates/js/stock.html:690 templates/js/stock.html:905 msgid "Quantity" msgstr "" #: build/templates/build/allocate.html:186 #: build/templates/build/auto_allocate.html:21 stock/forms.py:336 -#: stock/templates/stock/item_base.html:198 +#: stock/templates/stock/item_base.html:220 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:183 templates/js/barcode.html:337 #: templates/js/stock.html:518 @@ -466,12 +509,12 @@ msgid "Location" msgstr "" #: build/templates/build/allocate.html:210 -#: order/templates/order/sales_order_detail.html:92 templates/js/build.html:130 +#: order/templates/order/sales_order_detail.html:92 templates/js/build.html:144 msgid "Edit stock allocation" msgstr "" #: build/templates/build/allocate.html:211 -#: order/templates/order/sales_order_detail.html:93 templates/js/build.html:131 +#: order/templates/order/sales_order_detail.html:93 templates/js/build.html:145 msgid "Delete stock allocation" msgstr "" @@ -479,26 +522,6 @@ msgstr "" msgid "No BOM items found" msgstr "" -#: build/templates/build/allocate.html:337 -#: company/templates/company/supplier_part_base.html:53 -#: company/templates/company/supplier_part_detail.html:27 -#: order/templates/order/purchase_order_detail.html:159 -#: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 -#: templates/InvenTree/search.html:147 templates/js/bom.html:147 -#: templates/js/company.html:56 templates/js/order.html:159 -#: templates/js/order.html:234 templates/js/part.html:120 -#: templates/js/part.html:203 templates/js/part.html:345 -#: templates/js/part.html:526 templates/js/stock.html:444 -#: templates/js/stock.html:671 -msgid "Description" -msgstr "" - -#: build/templates/build/allocate.html:342 -#: order/templates/order/purchase_order_detail.html:172 -#: templates/js/bom.html:154 -msgid "Reference" -msgstr "" - #: build/templates/build/allocate.html:347 part/models.py:1401 #: templates/js/part.html:530 templates/js/table_filters.html:121 msgid "Required" @@ -544,81 +567,73 @@ msgstr "" msgid "Stock items will have to be manually allocated" msgstr "" -#: build/templates/build/build_base.html:8 -#: build/templates/build/build_base.html:34 -#: build/templates/build/complete.html:6 -#: stock/templates/stock/item_base.html:223 templates/js/build.html:39 -#: templates/navbar.html:25 -msgid "Build" -msgstr "" - #: build/templates/build/build_base.html:14 -msgid "This build is allocated to Sales Order" +msgid "This Build Order is allocated to Sales Order" msgstr "" #: build/templates/build/build_base.html:19 -msgid "This build is a child of Build" +msgid "This Build Order is a child of Build Order" msgstr "" -#: build/templates/build/build_base.html:39 +#: build/templates/build/build_base.html:37 #: company/templates/company/company_base.html:27 -#: order/templates/order/order_base.html:28 -#: order/templates/order/sales_order_base.html:38 +#: order/templates/order/order_base.html:26 +#: order/templates/order/sales_order_base.html:35 #: part/templates/part/category.html:13 part/templates/part/part_base.html:32 -#: stock/templates/stock/item_base.html:69 +#: stock/templates/stock/item_base.html:76 #: stock/templates/stock/location.html:12 msgid "Admin view" msgstr "" -#: build/templates/build/build_base.html:45 +#: build/templates/build/build_base.html:46 msgid "Edit Build" msgstr "" -#: build/templates/build/build_base.html:49 build/views.py:190 +#: build/templates/build/build_base.html:50 build/views.py:190 msgid "Complete Build" msgstr "" -#: build/templates/build/build_base.html:52 build/views.py:58 +#: build/templates/build/build_base.html:53 build/views.py:58 msgid "Cancel Build" msgstr "" -#: build/templates/build/build_base.html:58 build/views.py:454 +#: build/templates/build/build_base.html:59 build/views.py:456 msgid "Delete Build" msgstr "" -#: build/templates/build/build_base.html:68 build/templates/build/detail.html:9 +#: build/templates/build/build_base.html:69 build/templates/build/detail.html:9 msgid "Build Details" msgstr "" -#: build/templates/build/build_base.html:87 +#: build/templates/build/build_base.html:88 #: build/templates/build/detail.html:42 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:276 templates/InvenTree/search.html:175 -#: templates/js/barcode.html:42 templates/js/build.html:63 +#: stock/templates/stock/item_base.html:298 templates/InvenTree/search.html:175 +#: templates/js/barcode.html:42 templates/js/build.html:77 #: templates/js/order.html:164 templates/js/order.html:239 #: templates/js/stock.html:505 templates/js/stock.html:913 msgid "Status" msgstr "" -#: build/templates/build/build_base.html:100 order/models.py:499 +#: build/templates/build/build_base.html:101 order/models.py:499 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:33 #: order/templates/order/sales_order_notes.html:10 #: order/templates/order/sales_order_ship.html:25 #: part/templates/part/allocation.html:27 -#: stock/templates/stock/item_base.html:186 templates/js/order.html:213 +#: stock/templates/stock/item_base.html:208 templates/js/order.html:213 msgid "Sales Order" msgstr "" -#: build/templates/build/build_base.html:106 +#: build/templates/build/build_base.html:107 msgid "BOM Price" msgstr "" -#: build/templates/build/build_base.html:111 +#: build/templates/build/build_base.html:112 msgid "BOM pricing is incomplete" msgstr "" -#: build/templates/build/build_base.html:114 +#: build/templates/build/build_base.html:115 msgid "No pricing information" msgstr "" @@ -626,6 +641,12 @@ msgstr "" msgid "Build Outputs" msgstr "" +#: build/templates/build/complete.html:6 +#: stock/templates/stock/item_base.html:245 templates/js/build.html:40 +#: templates/navbar.html:25 +msgid "Build" +msgstr "" + #: build/templates/build/complete.html:10 msgid "Build order allocation is complete" msgstr "" @@ -673,15 +694,15 @@ msgid "Stock can be taken from any available location." msgstr "" #: build/templates/build/detail.html:48 -#: stock/templates/stock/item_base.html:216 templates/js/stock.html:513 +#: stock/templates/stock/item_base.html:238 templates/js/stock.html:513 #: templates/js/stock.html:920 templates/js/table_filters.html:34 #: templates/js/table_filters.html:100 msgid "Batch" msgstr "" #: build/templates/build/detail.html:61 -#: order/templates/order/order_base.html:100 -#: order/templates/order/sales_order_base.html:99 templates/js/build.html:71 +#: order/templates/order/order_base.html:98 +#: order/templates/order/sales_order_base.html:100 templates/js/build.html:85 msgid "Created" msgstr "" @@ -697,17 +718,11 @@ msgstr "" msgid "No" msgstr "" -#: build/templates/build/detail.html:80 templates/js/build.html:76 +#: build/templates/build/detail.html:80 templates/js/build.html:90 msgid "Completed" msgstr "" -#: build/templates/build/index.html:6 build/templates/build/index.html:14 -#: order/templates/order/so_builds.html:11 order/templates/order/so_tabs.html:9 -#: part/templates/part/tabs.html:31 users/models.py:30 -msgid "Build Orders" -msgstr "" - -#: build/templates/build/index.html:24 +#: build/templates/build/index.html:24 build/views.py:403 msgid "New Build Order" msgstr "" @@ -766,7 +781,7 @@ msgstr "" msgid "Check the confirmation box at the bottom of the list" msgstr "" -#: build/views.py:152 build/views.py:465 +#: build/views.py:152 build/views.py:467 msgid "Unallocate Stock" msgstr "" @@ -774,7 +789,7 @@ msgstr "" msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:167 stock/views.py:405 +#: build/views.py:167 stock/views.py:421 msgid "Check the confirmation box" msgstr "" @@ -786,7 +801,7 @@ msgstr "" msgid "Invalid location selected" msgstr "" -#: build/views.py:302 stock/views.py:1621 +#: build/views.py:302 stock/views.py:1653 #, python-brace-format msgid "The following serial numbers already exist: ({sn})" msgstr "" @@ -795,75 +810,67 @@ msgstr "" msgid "Build marked as COMPLETE" msgstr "" -#: build/views.py:403 -msgid "Start new Build" -msgstr "" - -#: build/views.py:429 +#: build/views.py:431 msgid "Created new build" msgstr "" -#: build/views.py:439 +#: build/views.py:441 msgid "Edit Build Details" msgstr "" -#: build/views.py:445 +#: build/views.py:447 msgid "Edited build" msgstr "" -#: build/views.py:471 +#: build/views.py:473 msgid "Removed parts from build allocation" msgstr "" -#: build/views.py:481 +#: build/views.py:483 msgid "Allocate new Part" msgstr "" -#: build/views.py:635 +#: build/views.py:637 msgid "Edit Stock Allocation" msgstr "" -#: build/views.py:640 +#: build/views.py:642 msgid "Updated Build Item" msgstr "" -#: common/models.py:75 +#: common/models.py:107 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:77 +#: common/models.py:109 msgid "Settings value" msgstr "" -#: common/models.py:79 -msgid "Settings description" -msgstr "" - -#: common/models.py:92 +#: common/models.py:122 msgid "Key string must be unique" msgstr "" -#: common/models.py:113 +#: common/models.py:143 msgid "Currency Symbol e.g. $" msgstr "" -#: common/models.py:115 +#: common/models.py:145 msgid "Currency Suffix e.g. AUD" msgstr "" -#: common/models.py:117 +#: common/models.py:147 msgid "Currency Description" msgstr "" -#: common/models.py:119 +#: common/models.py:149 msgid "Currency Value" msgstr "" -#: common/models.py:121 +#: common/models.py:151 msgid "Use this currency as the base currency" msgstr "" -#: common/models.py:204 +#: common/models.py:234 msgid "Default" msgstr "" @@ -879,6 +886,10 @@ msgstr "" msgid "Delete Currency" msgstr "" +#: common/views.py:47 +msgid "Change Setting" +msgstr "" + #: company/models.py:86 company/models.py:87 msgid "Company name" msgstr "" @@ -949,7 +960,7 @@ msgid "Does this company manufacture parts?" msgstr "" #: company/models.py:279 stock/models.py:335 -#: stock/templates/stock/item_base.html:148 +#: stock/templates/stock/item_base.html:164 msgid "Base Part" msgstr "" @@ -1018,16 +1029,16 @@ msgstr "" #: company/templates/company/detail.html:21 #: company/templates/company/supplier_part_base.html:66 #: company/templates/company/supplier_part_detail.html:21 -#: order/templates/order/order_base.html:81 +#: order/templates/order/order_base.html:79 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170 -#: stock/templates/stock/item_base.html:251 templates/js/company.html:48 +#: stock/templates/stock/item_base.html:273 templates/js/company.html:48 #: templates/js/company.html:162 templates/js/order.html:146 msgid "Supplier" msgstr "" #: company/templates/company/detail.html:26 -#: order/templates/order/sales_order_base.html:80 stock/models.py:370 -#: stock/models.py:371 stock/templates/stock/item_base.html:169 +#: order/templates/order/sales_order_base.html:81 stock/models.py:370 +#: stock/models.py:371 stock/templates/stock/item_base.html:191 #: templates/js/company.html:40 templates/js/order.html:221 msgid "Customer" msgstr "" @@ -1122,7 +1133,8 @@ msgstr "" #: order/templates/order/purchase_orders.html:7 #: order/templates/order/purchase_orders.html:12 #: part/templates/part/orders.html:9 part/templates/part/tabs.html:48 -#: templates/navbar.html:33 users/models.py:31 +#: templates/InvenTree/settings/tabs.html:27 templates/navbar.html:33 +#: users/models.py:31 msgid "Purchase Orders" msgstr "" @@ -1141,7 +1153,8 @@ msgstr "" #: order/templates/order/sales_orders.html:7 #: order/templates/order/sales_orders.html:12 #: part/templates/part/sales_orders.html:9 part/templates/part/tabs.html:56 -#: templates/navbar.html:42 users/models.py:32 +#: templates/InvenTree/settings/tabs.html:30 templates/navbar.html:42 +#: users/models.py:32 msgid "Sales Orders" msgstr "" @@ -1157,7 +1170,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:6 #: company/templates/company/supplier_part_base.html:19 stock/models.py:344 -#: stock/templates/stock/item_base.html:256 templates/js/company.html:178 +#: stock/templates/stock/item_base.html:278 templates/js/company.html:178 msgid "Supplier Part" msgstr "" @@ -1200,11 +1213,11 @@ msgstr "" msgid "Note" msgstr "" -#: company/templates/company/supplier_part_orders.html:11 +#: company/templates/company/supplier_part_orders.html:9 msgid "Supplier Part Orders" msgstr "" -#: company/templates/company/supplier_part_pricing.html:12 +#: company/templates/company/supplier_part_pricing.html:10 msgid "Pricing Information" msgstr "" @@ -1233,7 +1246,7 @@ msgstr "" msgid "Delete price break" msgstr "" -#: company/templates/company/supplier_part_stock.html:11 +#: company/templates/company/supplier_part_stock.html:9 msgid "Supplier Part Stock" msgstr "" @@ -1244,8 +1257,9 @@ msgstr "" #: company/templates/company/supplier_part_tabs.html:8 #: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18 #: stock/templates/stock/location.html:17 templates/InvenTree/search.html:155 -#: templates/js/part.html:124 templates/js/part.html:372 -#: templates/js/stock.html:452 templates/navbar.html:22 users/models.py:29 +#: templates/InvenTree/settings/tabs.html:21 templates/js/part.html:124 +#: templates/js/part.html:372 templates/js/stock.html:452 +#: templates/navbar.html:22 users/models.py:29 msgid "Stock" msgstr "" @@ -1256,7 +1270,8 @@ msgstr "" #: company/templates/company/tabs.html:9 #: order/templates/order/receive_parts.html:14 part/models.py:294 #: part/templates/part/cat_link.html:7 part/templates/part/category.html:94 -#: part/templates/part/category_tabs.html:6 templates/navbar.html:19 +#: part/templates/part/category_tabs.html:6 +#: templates/InvenTree/settings/tabs.html:18 templates/navbar.html:19 #: templates/stats.html:8 templates/stats.html:17 users/models.py:28 msgid "Parts" msgstr "" @@ -1370,20 +1385,20 @@ msgstr "" msgid "Enabled" msgstr "" -#: order/forms.py:24 order/templates/order/order_base.html:40 +#: order/forms.py:24 order/templates/order/order_base.html:39 msgid "Place order" msgstr "" -#: order/forms.py:35 order/templates/order/order_base.html:47 +#: order/forms.py:35 order/templates/order/order_base.html:46 msgid "Mark order as complete" msgstr "" -#: order/forms.py:46 order/forms.py:57 order/templates/order/order_base.html:52 -#: order/templates/order/sales_order_base.html:52 +#: order/forms.py:46 order/forms.py:57 order/templates/order/order_base.html:51 +#: order/templates/order/sales_order_base.html:53 msgid "Cancel order" msgstr "" -#: order/forms.py:68 order/templates/order/sales_order_base.html:49 +#: order/forms.py:68 order/templates/order/sales_order_base.html:50 msgid "Ship order" msgstr "" @@ -1392,7 +1407,7 @@ msgid "Receive parts to this location" msgstr "" #: order/forms.py:99 -msgid "Enter purchase order number" +msgid "Purchase Order reference" msgstr "" #: order/forms.py:126 @@ -1473,8 +1488,8 @@ msgid "Line item notes" msgstr "" #: order/models.py:466 order/templates/order/order_base.html:9 -#: order/templates/order/order_base.html:23 -#: stock/templates/stock/item_base.html:230 templates/js/order.html:138 +#: order/templates/order/order_base.html:24 +#: stock/templates/stock/item_base.html:252 templates/js/order.html:138 msgid "Purchase Order" msgstr "" @@ -1516,44 +1531,44 @@ msgstr "" msgid "Are you sure you want to delete this attachment?" msgstr "" -#: order/templates/order/order_base.html:36 +#: order/templates/order/order_base.html:35 msgid "Edit order information" msgstr "" -#: order/templates/order/order_base.html:44 +#: order/templates/order/order_base.html:43 msgid "Receive items" msgstr "" -#: order/templates/order/order_base.html:57 +#: order/templates/order/order_base.html:56 msgid "Export order to file" msgstr "" -#: order/templates/order/order_base.html:66 +#: order/templates/order/order_base.html:64 msgid "Purchase Order Details" msgstr "" -#: order/templates/order/order_base.html:71 -#: order/templates/order/sales_order_base.html:70 +#: order/templates/order/order_base.html:69 +#: order/templates/order/sales_order_base.html:71 msgid "Order Reference" msgstr "" -#: order/templates/order/order_base.html:76 -#: order/templates/order/sales_order_base.html:75 +#: order/templates/order/order_base.html:74 +#: order/templates/order/sales_order_base.html:76 msgid "Order Status" msgstr "" -#: order/templates/order/order_base.html:87 templates/js/order.html:153 +#: order/templates/order/order_base.html:85 templates/js/order.html:153 msgid "Supplier Reference" msgstr "" -#: order/templates/order/order_base.html:106 +#: order/templates/order/order_base.html:104 msgid "Issued" msgstr "" -#: order/templates/order/order_base.html:113 +#: order/templates/order/order_base.html:111 #: order/templates/order/purchase_order_detail.html:182 #: order/templates/order/receive_parts.html:22 -#: order/templates/order/sales_order_base.html:112 +#: order/templates/order/sales_order_base.html:113 msgid "Received" msgstr "" @@ -1598,8 +1613,7 @@ msgid "Select existing purchase orders, or create new orders." msgstr "" #: order/templates/order/order_wizard/select_pos.html:31 -#: order/templates/order/po_tabs.html:5 templates/js/order.html:177 -#: templates/js/order.html:257 +#: templates/js/order.html:177 templates/js/order.html:257 msgid "Items" msgstr "" @@ -1615,7 +1629,16 @@ msgstr "" msgid "Purchase Order Attachments" msgstr "" -#: order/templates/order/po_tabs.html:8 order/templates/order/so_tabs.html:16 +#: order/templates/order/po_received_items.html:11 +#: order/templates/order/po_tabs.html:8 +msgid "Received Items" +msgstr "" + +#: order/templates/order/po_tabs.html:5 +msgid "Line Items" +msgstr "" + +#: order/templates/order/po_tabs.html:11 order/templates/order/so_tabs.html:16 #: part/templates/part/tabs.html:67 stock/templates/stock/tabs.html:32 msgid "Attachments" msgstr "" @@ -1639,7 +1662,7 @@ msgstr "" #: order/templates/order/purchase_order_detail.html:39 #: order/templates/order/purchase_order_detail.html:119 -#: stock/templates/stock/location.html:21 +#: stock/templates/stock/location.html:22 msgid "Create new stock location" msgstr "" @@ -1690,15 +1713,15 @@ msgstr "" msgid "This SalesOrder has not been fully allocated" msgstr "" -#: order/templates/order/sales_order_base.html:57 +#: order/templates/order/sales_order_base.html:58 msgid "Packing List" msgstr "" -#: order/templates/order/sales_order_base.html:65 +#: order/templates/order/sales_order_base.html:66 msgid "Sales Order Details" msgstr "" -#: order/templates/order/sales_order_base.html:86 templates/js/order.html:228 +#: order/templates/order/sales_order_base.html:87 templates/js/order.html:228 msgid "Customer Reference" msgstr "" @@ -1766,7 +1789,7 @@ msgstr "" msgid "Add Purchase Order Attachment" msgstr "" -#: order/views.py:109 order/views.py:157 part/views.py:92 stock/views.py:167 +#: order/views.py:109 order/views.py:157 part/views.py:92 stock/views.py:175 msgid "Added attachment" msgstr "" @@ -1786,7 +1809,7 @@ msgstr "" msgid "Delete Attachment" msgstr "" -#: order/views.py:233 order/views.py:248 stock/views.py:223 +#: order/views.py:233 order/views.py:248 stock/views.py:233 msgid "Deleted attachment" msgstr "" @@ -2266,17 +2289,12 @@ msgstr "" #: part/templates/part/allocation.html:45 #: stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:58 -#: stock/templates/stock/item_base.html:238 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:112 +#: stock/templates/stock/item_base.html:260 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:126 #: templates/js/stock.html:660 templates/js/stock.html:896 msgid "Stock Item" msgstr "" -#: part/templates/part/allocation.html:20 -#: stock/templates/stock/item_base.html:192 -msgid "Build Order" -msgstr "" - #: part/templates/part/attachments.html:8 msgid "Part Attachments" msgstr "" @@ -2473,7 +2491,7 @@ msgstr "" msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:214 stock/views.py:1314 +#: part/templates/part/category.html:214 stock/views.py:1343 msgid "Create new Stock Location" msgstr "" @@ -2644,7 +2662,7 @@ msgstr "" msgid "Add new parameter" msgstr "" -#: part/templates/part/params.html:14 templates/InvenTree/settings/part.html:12 +#: part/templates/part/params.html:14 templates/InvenTree/settings/part.html:17 msgid "New Parameter" msgstr "" @@ -2688,20 +2706,20 @@ msgid "Star this part" msgstr "" #: part/templates/part/part_base.html:49 -#: stock/templates/stock/item_base.html:81 -#: stock/templates/stock/location.html:27 +#: stock/templates/stock/item_base.html:88 +#: stock/templates/stock/location.html:29 msgid "Barcode actions" msgstr "" #: part/templates/part/part_base.html:51 -#: stock/templates/stock/item_base.html:83 -#: stock/templates/stock/location.html:29 +#: stock/templates/stock/item_base.html:90 +#: stock/templates/stock/location.html:31 msgid "Show QR Code" msgstr "" #: part/templates/part/part_base.html:52 -#: stock/templates/stock/item_base.html:84 -#: stock/templates/stock/location.html:30 +#: stock/templates/stock/item_base.html:91 +#: stock/templates/stock/location.html:32 msgid "Print Label" msgstr "" @@ -2830,7 +2848,7 @@ msgstr "" msgid "Used In" msgstr "" -#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:282 +#: part/templates/part/tabs.html:61 stock/templates/stock/item_base.html:304 msgid "Tests" msgstr "" @@ -2862,7 +2880,7 @@ msgstr "" msgid "Add part attachment" msgstr "" -#: part/views.py:131 templates/attachment_table.html:30 +#: part/views.py:131 templates/attachment_table.html:32 msgid "Edit attachment" msgstr "" @@ -3111,7 +3129,7 @@ msgstr "" msgid "Add note (required)" msgstr "" -#: stock/forms.py:370 stock/views.py:895 stock/views.py:1092 +#: stock/forms.py:370 stock/views.py:921 stock/views.py:1119 msgid "Confirm stock adjustment" msgstr "" @@ -3176,7 +3194,7 @@ msgstr "" msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:358 stock/templates/stock/item_base.html:177 +#: stock/models.py:358 stock/templates/stock/item_base.html:199 msgid "Installed In" msgstr "" @@ -3386,106 +3404,106 @@ msgid "" "This stock item will be automatically deleted when all stock is depleted." msgstr "" -#: stock/templates/stock/item_base.html:86 templates/js/barcode.html:283 +#: stock/templates/stock/item_base.html:94 templates/js/barcode.html:283 #: templates/js/barcode.html:288 msgid "Unlink Barcode" msgstr "" -#: stock/templates/stock/item_base.html:88 +#: stock/templates/stock/item_base.html:96 msgid "Link Barcode" msgstr "" -#: stock/templates/stock/item_base.html:94 +#: stock/templates/stock/item_base.html:104 msgid "Stock adjustment actions" msgstr "" -#: stock/templates/stock/item_base.html:98 -#: stock/templates/stock/location.html:38 templates/stock_table.html:19 +#: stock/templates/stock/item_base.html:108 +#: stock/templates/stock/location.html:41 templates/stock_table.html:19 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:99 templates/stock_table.html:17 +#: stock/templates/stock/item_base.html:109 templates/stock_table.html:17 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:100 templates/stock_table.html:18 +#: stock/templates/stock/item_base.html:110 templates/stock_table.html:18 msgid "Remove stock" msgstr "" -#: stock/templates/stock/item_base.html:102 +#: stock/templates/stock/item_base.html:112 msgid "Transfer stock" msgstr "" -#: stock/templates/stock/item_base.html:104 +#: stock/templates/stock/item_base.html:114 msgid "Serialize stock" msgstr "" -#: stock/templates/stock/item_base.html:108 +#: stock/templates/stock/item_base.html:118 msgid "Assign to customer" msgstr "" -#: stock/templates/stock/item_base.html:111 +#: stock/templates/stock/item_base.html:121 msgid "Return to stock" msgstr "" -#: stock/templates/stock/item_base.html:115 templates/js/stock.html:933 +#: stock/templates/stock/item_base.html:125 templates/js/stock.html:933 msgid "Uninstall stock item" msgstr "" -#: stock/templates/stock/item_base.html:115 +#: stock/templates/stock/item_base.html:125 msgid "Uninstall" msgstr "" -#: stock/templates/stock/item_base.html:122 -#: stock/templates/stock/location.html:35 +#: stock/templates/stock/item_base.html:134 +#: stock/templates/stock/location.html:38 msgid "Stock actions" msgstr "" -#: stock/templates/stock/item_base.html:126 +#: stock/templates/stock/item_base.html:137 msgid "Convert to variant" msgstr "" -#: stock/templates/stock/item_base.html:128 +#: stock/templates/stock/item_base.html:140 msgid "Duplicate stock item" msgstr "" -#: stock/templates/stock/item_base.html:129 +#: stock/templates/stock/item_base.html:142 msgid "Edit stock item" msgstr "" -#: stock/templates/stock/item_base.html:131 +#: stock/templates/stock/item_base.html:145 msgid "Delete stock item" msgstr "" -#: stock/templates/stock/item_base.html:135 +#: stock/templates/stock/item_base.html:151 msgid "Generate test report" msgstr "" -#: stock/templates/stock/item_base.html:143 +#: stock/templates/stock/item_base.html:159 msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:202 +#: stock/templates/stock/item_base.html:224 msgid "No location set" msgstr "" -#: stock/templates/stock/item_base.html:209 -msgid "Unique Identifier" +#: stock/templates/stock/item_base.html:231 +msgid "Barcode Identifier" msgstr "" -#: stock/templates/stock/item_base.html:237 +#: stock/templates/stock/item_base.html:259 msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:262 +#: stock/templates/stock/item_base.html:284 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:267 +#: stock/templates/stock/item_base.html:289 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:271 +#: stock/templates/stock/item_base.html:293 msgid "No stocktake performed" msgstr "" @@ -3549,50 +3567,50 @@ msgstr "" msgid "All stock items" msgstr "" -#: stock/templates/stock/location.html:31 +#: stock/templates/stock/location.html:33 msgid "Check-in Items" msgstr "" -#: stock/templates/stock/location.html:42 +#: stock/templates/stock/location.html:45 msgid "Location actions" msgstr "" -#: stock/templates/stock/location.html:44 +#: stock/templates/stock/location.html:47 msgid "Edit location" msgstr "" -#: stock/templates/stock/location.html:45 +#: stock/templates/stock/location.html:49 msgid "Delete location" msgstr "" -#: stock/templates/stock/location.html:53 +#: stock/templates/stock/location.html:59 msgid "Location Details" msgstr "" -#: stock/templates/stock/location.html:58 +#: stock/templates/stock/location.html:64 msgid "Location Path" msgstr "" -#: stock/templates/stock/location.html:63 +#: stock/templates/stock/location.html:69 msgid "Location Description" msgstr "" -#: stock/templates/stock/location.html:68 +#: stock/templates/stock/location.html:74 msgid "Sublocations" msgstr "" -#: stock/templates/stock/location.html:73 -#: stock/templates/stock/location.html:88 +#: stock/templates/stock/location.html:79 +#: stock/templates/stock/location.html:94 #: templates/InvenTree/search_stock_items.html:6 templates/stats.html:21 #: templates/stats.html:30 msgid "Stock Items" msgstr "" -#: stock/templates/stock/location.html:78 +#: stock/templates/stock/location.html:84 msgid "Stock Details" msgstr "" -#: stock/templates/stock/location.html:83 +#: stock/templates/stock/location.html:89 #: templates/InvenTree/search_stock_location.html:6 templates/stats.html:25 msgid "Stock Locations" msgstr "" @@ -3605,7 +3623,7 @@ msgstr "" msgid "The following stock items will be uninstalled" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1287 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1315 msgid "Convert Stock Item" msgstr "" @@ -3637,214 +3655,214 @@ msgstr "" msgid "Installed Items" msgstr "" -#: stock/views.py:114 +#: stock/views.py:119 msgid "Edit Stock Location" msgstr "" -#: stock/views.py:138 +#: stock/views.py:144 msgid "Stock Location QR code" msgstr "" -#: stock/views.py:156 +#: stock/views.py:163 msgid "Add Stock Item Attachment" msgstr "" -#: stock/views.py:201 +#: stock/views.py:209 msgid "Edit Stock Item Attachment" msgstr "" -#: stock/views.py:217 +#: stock/views.py:226 msgid "Delete Stock Item Attachment" msgstr "" -#: stock/views.py:233 +#: stock/views.py:243 msgid "Assign to Customer" msgstr "" -#: stock/views.py:270 +#: stock/views.py:281 msgid "Return to Stock" msgstr "" -#: stock/views.py:289 +#: stock/views.py:301 msgid "Specify a valid location" msgstr "" -#: stock/views.py:293 +#: stock/views.py:305 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:305 +#: stock/views.py:317 msgid "Select Label Template" msgstr "" -#: stock/views.py:327 +#: stock/views.py:340 msgid "Select valid label" msgstr "" -#: stock/views.py:389 +#: stock/views.py:404 msgid "Delete All Test Data" msgstr "" -#: stock/views.py:404 +#: stock/views.py:420 msgid "Confirm test data deletion" msgstr "" -#: stock/views.py:424 +#: stock/views.py:440 msgid "Add Test Result" msgstr "" -#: stock/views.py:461 +#: stock/views.py:478 msgid "Edit Test Result" msgstr "" -#: stock/views.py:478 +#: stock/views.py:496 msgid "Delete Test Result" msgstr "" -#: stock/views.py:489 +#: stock/views.py:508 msgid "Select Test Report Template" msgstr "" -#: stock/views.py:503 +#: stock/views.py:523 msgid "Select valid template" msgstr "" -#: stock/views.py:555 +#: stock/views.py:576 msgid "Stock Export Options" msgstr "" -#: stock/views.py:675 +#: stock/views.py:698 msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:700 +#: stock/views.py:724 msgid "Install Stock Item" msgstr "" -#: stock/views.py:799 +#: stock/views.py:824 msgid "Uninstall Stock Items" msgstr "" -#: stock/views.py:906 +#: stock/views.py:932 msgid "Uninstalled stock items" msgstr "" -#: stock/views.py:931 +#: stock/views.py:957 msgid "Adjust Stock" msgstr "" -#: stock/views.py:1040 +#: stock/views.py:1067 msgid "Move Stock Items" msgstr "" -#: stock/views.py:1041 +#: stock/views.py:1068 msgid "Count Stock Items" msgstr "" -#: stock/views.py:1042 +#: stock/views.py:1069 msgid "Remove From Stock" msgstr "" -#: stock/views.py:1043 +#: stock/views.py:1070 msgid "Add Stock Items" msgstr "" -#: stock/views.py:1044 +#: stock/views.py:1071 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:1072 +#: stock/views.py:1099 msgid "Must enter integer value" msgstr "" -#: stock/views.py:1077 +#: stock/views.py:1104 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:1084 +#: stock/views.py:1111 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:1163 +#: stock/views.py:1190 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:1178 +#: stock/views.py:1205 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:1191 +#: stock/views.py:1218 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:1219 +#: stock/views.py:1246 msgid "No items were moved" msgstr "" -#: stock/views.py:1222 +#: stock/views.py:1249 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1241 +#: stock/views.py:1268 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1253 +#: stock/views.py:1280 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1335 +#: stock/views.py:1365 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1527 +#: stock/views.py:1559 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1593 +#: stock/views.py:1625 msgid "Invalid quantity" msgstr "" -#: stock/views.py:1596 +#: stock/views.py:1628 msgid "Quantity cannot be less than zero" msgstr "" -#: stock/views.py:1600 +#: stock/views.py:1632 msgid "Invalid part selection" msgstr "" -#: stock/views.py:1649 +#: stock/views.py:1681 #, python-brace-format msgid "Created {n} new stock items" msgstr "" -#: stock/views.py:1668 stock/views.py:1684 +#: stock/views.py:1700 stock/views.py:1716 msgid "Created new stock item" msgstr "" -#: stock/views.py:1703 +#: stock/views.py:1735 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1716 +#: stock/views.py:1749 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1727 +#: stock/views.py:1761 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1744 +#: stock/views.py:1780 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1753 +#: stock/views.py:1790 msgid "Add Stock Tracking Entry" msgstr "" @@ -3856,6 +3874,14 @@ msgstr "" msgid "You do not have permission to view this page." msgstr "" +#: templates/404.html:5 templates/404.html:11 +msgid "Page Not Found" +msgstr "" + +#: templates/404.html:14 +msgid "The requested page does not exist" +msgstr "" + #: templates/InvenTree/bom_invalid.html:7 msgid "BOM Waiting Validation" msgstr "" @@ -3904,23 +3930,105 @@ msgstr "" msgid "Searching" msgstr "" +#: templates/InvenTree/settings/build.html:10 +msgid "Build Order Settings" +msgstr "" + +#: templates/InvenTree/settings/build.html:19 +msgid "Reference Prefix" +msgstr "" + +#: templates/InvenTree/settings/build.html:21 +msgid "Prefix for Build Order reference" +msgstr "" + +#: templates/InvenTree/settings/build.html:24 +msgid "Reference Regex" +msgstr "" + +#: templates/InvenTree/settings/build.html:26 +msgid "Regex validator for Build Order reference" +msgstr "" + +#: templates/InvenTree/settings/currency.html:5 +msgid "General Settings" +msgstr "" + +#: templates/InvenTree/settings/currency.html:14 +msgid "Currencies" +msgstr "" + +#: templates/InvenTree/settings/currency.html:17 +msgid "New Currency" +msgstr "" + #: templates/InvenTree/settings/part.html:9 +msgid "Part Settings" +msgstr "" + +#: templates/InvenTree/settings/part.html:14 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:28 +#: templates/InvenTree/settings/part.html:33 msgid "No part parameter templates found" msgstr "" -#: templates/InvenTree/settings/part.html:48 +#: templates/InvenTree/settings/part.html:53 msgid "Edit Template" msgstr "" -#: templates/InvenTree/settings/part.html:49 +#: templates/InvenTree/settings/part.html:54 msgid "Delete Template" msgstr "" -#: templates/InvenTree/settings/theme.html:25 +#: templates/InvenTree/settings/po.html:9 +msgid "Purchase Order Settings" +msgstr "" + +#: templates/InvenTree/settings/settings.html:7 +#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:62 +msgid "Settings" +msgstr "" + +#: templates/InvenTree/settings/so.html:9 +msgid "Sales Order Settings" +msgstr "" + +#: templates/InvenTree/settings/stock.html:9 +msgid "Stock Settings" +msgstr "" + +#: templates/InvenTree/settings/tabs.html:3 +#: templates/InvenTree/settings/user.html:10 +msgid "User Settings" +msgstr "" + +#: templates/InvenTree/settings/tabs.html:6 +msgid "Account" +msgstr "" + +#: templates/InvenTree/settings/tabs.html:9 +msgid "Theme" +msgstr "" + +#: templates/InvenTree/settings/tabs.html:12 +msgid "InvenTree Settings" +msgstr "" + +#: templates/InvenTree/settings/tabs.html:15 +msgid "Currency" +msgstr "" + +#: templates/InvenTree/settings/theme.html:10 +msgid "Theme Settings" +msgstr "" + +#: templates/InvenTree/settings/theme.html:17 +msgid "Color Themes" +msgstr "" + +#: templates/InvenTree/settings/theme.html:29 #, python-format msgid "" "\n" @@ -3930,6 +4038,26 @@ msgid "" "\t" msgstr "" +#: templates/InvenTree/settings/user.html:16 +msgid "User Information" +msgstr "" + +#: templates/InvenTree/settings/user.html:24 +msgid "Username" +msgstr "" + +#: templates/InvenTree/settings/user.html:28 +msgid "First Name" +msgstr "" + +#: templates/InvenTree/settings/user.html:32 +msgid "Last Name" +msgstr "" + +#: templates/InvenTree/settings/user.html:36 +msgid "Email Address" +msgstr "" + #: templates/InvenTree/so_outstanding.html:7 msgid "Outstanding Sales Orders" msgstr "" @@ -3974,23 +4102,23 @@ msgstr "" msgid "Submit Bug Report" msgstr "" -#: templates/attachment_table.html:5 +#: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "" -#: templates/attachment_table.html:13 +#: templates/attachment_table.html:15 msgid "File" msgstr "" -#: templates/attachment_table.html:14 +#: templates/attachment_table.html:16 msgid "Comment" msgstr "" -#: templates/attachment_table.html:15 +#: templates/attachment_table.html:17 msgid "Uploaded" msgstr "" -#: templates/attachment_table.html:33 +#: templates/attachment_table.html:35 msgid "Delete attachment" msgstr "" @@ -4079,7 +4207,7 @@ msgstr "" msgid "Optional" msgstr "" -#: templates/js/bom.html:188 templates/js/build.html:119 +#: templates/js/bom.html:188 templates/js/build.html:133 msgid "Available" msgstr "" @@ -4107,11 +4235,11 @@ msgstr "" msgid "Delete BOM Item" msgstr "" -#: templates/js/build.html:23 +#: templates/js/build.html:24 msgid "No builds matching query" msgstr "" -#: templates/js/build.html:108 +#: templates/js/build.html:122 msgid "No parts allocated for" msgstr "" @@ -4449,10 +4577,6 @@ msgstr "" msgid "Admin" msgstr "" -#: templates/navbar.html:62 -msgid "Settings" -msgstr "" - #: templates/navbar.html:63 msgid "Logout" msgstr "" From a2ee1720585b16c9e33b8ad3e73afeb787e02063 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Oct 2020 08:45:17 +1100 Subject: [PATCH 18/18] Updates tables for PurchaseOrder and SalesOrder --- InvenTree/templates/js/build.html | 2 +- InvenTree/templates/js/order.html | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/InvenTree/templates/js/build.html b/InvenTree/templates/js/build.html index 08d9ec2af9..6a12b97bfd 100644 --- a/InvenTree/templates/js/build.html +++ b/InvenTree/templates/js/build.html @@ -42,7 +42,7 @@ function loadBuildTable(table, options) { switchable: false, formatter: function(value, row, index, field) { - var prefix = "{% inventree_setting 'BUILDORDER_REFERENCE_PREFIX' 'BO' %}"; + var prefix = "{% inventree_setting 'BUILDORDER_REFERENCE_PREFIX' %}"; if (prefix) { value = `${prefix}${value}`; diff --git a/InvenTree/templates/js/order.html b/InvenTree/templates/js/order.html index c16b40583c..4dbfbefa13 100644 --- a/InvenTree/templates/js/order.html +++ b/InvenTree/templates/js/order.html @@ -1,4 +1,5 @@ {% load i18n %} +{% load inventree_extras %} function removeOrderRowFromOrderWizard(e) { /* Remove a part selection from an order form. */ @@ -137,6 +138,13 @@ function loadPurchaseOrderTable(table, options) { field: 'reference', title: '{% trans "Purchase Order" %}', formatter: function(value, row, index, field) { + + var prefix = "{% inventree_setting 'PURCHASEORDER_REFERENCE_PREFIX' %}"; + + if (prefix) { + value = `${prefix}${value}`; + } + return renderLink(value, `/order/purchase-order/${row.pk}/`); } }, @@ -212,6 +220,13 @@ function loadSalesOrderTable(table, options) { field: 'reference', title: '{% trans "Sales Order" %}', formatter: function(value, row, index, field) { + + var prefix = "{% inventree_setting 'SALESORDER_REFERENCE_PREFIX' %}"; + + if (prefix) { + value = `${prefix}${value}`; + } + return renderLink(value, `/order/sales-order/${row.pk}/`); }, },