From 55cdeef30ea7a659a0943e2731a87618322a9333 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 4 May 2021 21:33:00 +0200 Subject: [PATCH 01/56] adds price-calc to purchase order Fixes #1513 --- InvenTree/order/models.py | 18 +++++++++++++----- InvenTree/order/views.py | 14 +++++++++++++- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index ea70c3b56a..d3b09dec1e 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -223,7 +223,7 @@ class PurchaseOrder(Order): return reverse('po-detail', kwargs={'pk': self.id}) @transaction.atomic - def add_line_item(self, supplier_part, quantity, group=True, reference=''): + def add_line_item(self, supplier_part, quantity, group=True, reference='', purchase_price=None): """ Add a new line item to this purchase order. This function will check that: @@ -254,7 +254,12 @@ class PurchaseOrder(Order): if matches.count() > 0: line = matches.first() - line.quantity += quantity + # update quantity and price + quantity_new = line.quantity + quantity + line.quantity = quantity_new + supplier_price = supplier_part.get_price(quantity_new) + if line.purchase_price and supplier_price: + line.purchase_price = supplier_price / quantity_new line.save() return @@ -263,7 +268,9 @@ class PurchaseOrder(Order): order=self, part=supplier_part, quantity=quantity, - reference=reference) + reference=reference, + purchase_price=purchase_price, + ) line.save() @@ -329,7 +336,7 @@ class PurchaseOrder(Order): return self.pending_line_items().count() == 0 @transaction.atomic - def receive_line_item(self, line, location, quantity, user, status=StockStatus.OK): + def receive_line_item(self, line, location, quantity, user, status=StockStatus.OK, purchase_price=None): """ Receive a line item (or partial line item) against this PO """ @@ -353,7 +360,8 @@ class PurchaseOrder(Order): location=location, quantity=quantity, purchase_order=self, - status=status + status=status, + purchase_price=purchase_price, ) stock.save() diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index 284a24fcf5..c62a3816d5 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -776,6 +776,7 @@ class PurchaseOrderReceive(AjaxUpdateView): line.receive_quantity, self.request.user, status=line.status_code, + purchase_price=line.purchase_price, ) @@ -996,6 +997,14 @@ class OrderParts(AjaxView): part.order_supplier = supplier_part.id if supplier_part else None part.order_quantity = quantity + # set supplier-price + if supplier_part: + supplier_price = supplier_part.get_price(quantity) + if supplier_price: + part.purchase_price = supplier_price / quantity + if not hasattr(part, 'purchase_price'): + part.purchase_price = None + self.parts.append(part) if supplier_part is None: @@ -1095,7 +1104,10 @@ class OrderParts(AjaxView): sp=item.order_supplier)) continue - order.add_line_item(supplier_part, quantity) + # get purchase price + purchase_price = item.purchase_price + + order.add_line_item(supplier_part, quantity, purchase_price=purchase_price) class POLineItemCreate(AjaxCreateView): From 1614c6e08af3fdbd61e26448b8bc9c39516dea5c Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 4 May 2021 21:51:42 +0200 Subject: [PATCH 02/56] Add in sale price model --- InvenTree/order/forms.py | 1 + .../migrations/0045_auto_20210504_1946.py | 24 +++++++++++++++++++ InvenTree/order/models.py | 10 ++++++++ InvenTree/order/serializers.py | 4 ++++ tasks.py | 2 +- 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 InvenTree/order/migrations/0045_auto_20210504_1946.py diff --git a/InvenTree/order/forms.py b/InvenTree/order/forms.py index 4c9caf3b53..8536c71ef5 100644 --- a/InvenTree/order/forms.py +++ b/InvenTree/order/forms.py @@ -211,6 +211,7 @@ class EditSalesOrderLineItemForm(HelperForm): 'part', 'quantity', 'reference', + 'sale_price', 'notes' ] diff --git a/InvenTree/order/migrations/0045_auto_20210504_1946.py b/InvenTree/order/migrations/0045_auto_20210504_1946.py new file mode 100644 index 0000000000..a8d9469dc7 --- /dev/null +++ b/InvenTree/order/migrations/0045_auto_20210504_1946.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2 on 2021-05-04 19:46 + +from django.db import migrations +import djmoney.models.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('order', '0044_auto_20210404_2016'), + ] + + operations = [ + migrations.AddField( + model_name='salesorderlineitem', + name='sale_price', + field=djmoney.models.fields.MoneyField(blank=True, decimal_places=4, default_currency='USD', help_text='Unit sale price', max_digits=19, null=True, verbose_name='Sale Price'), + ), + migrations.AddField( + model_name='salesorderlineitem', + name='sale_price_currency', + field=djmoney.models.fields.CurrencyField(choices=[('AUD', 'Australian Dollar'), ('GBP', 'British Pound'), ('CAD', 'Canadian Dollar'), ('EUR', 'Euro'), ('JPY', 'Japanese Yen'), ('NZD', 'New Zealand Dollar'), ('USD', 'US Dollar')], default='USD', editable=False, max_length=3), + ), + ] diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index ea70c3b56a..f0df4a7ff1 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -664,12 +664,22 @@ class SalesOrderLineItem(OrderLineItem): Attributes: order: Link to the SalesOrder that this line item belongs to part: Link to a Part object (may be null) + sale_price: The unit sale price for this OrderLineItem """ order = models.ForeignKey(SalesOrder, on_delete=models.CASCADE, related_name='lines', verbose_name=_('Order'), help_text=_('Sales Order')) part = models.ForeignKey('part.Part', on_delete=models.SET_NULL, related_name='sales_order_line_items', null=True, verbose_name=_('Part'), help_text=_('Part'), limit_choices_to={'salable': True}) + sale_price = MoneyField( + max_digits=19, + decimal_places=4, + default_currency='USD', + null=True, blank=True, + verbose_name=_('Sale Price'), + help_text=_('Unit sale price'), + ) + class Meta: unique_together = [ ] diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index a04798c303..2f4545fc30 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -278,6 +278,7 @@ class SOLineItemSerializer(InvenTreeModelSerializer): quantity = serializers.FloatField() allocated = serializers.FloatField(source='allocated_quantity', read_only=True) fulfilled = serializers.FloatField(source='fulfilled_quantity', read_only=True) + sale_price_string = serializers.CharField(source='sale_price', read_only=True) class Meta: model = SalesOrderLineItem @@ -294,6 +295,9 @@ class SOLineItemSerializer(InvenTreeModelSerializer): 'order_detail', 'part', 'part_detail', + 'sale_price', + 'sale_price_currency', + 'sale_price_string', ] diff --git a/tasks.py b/tasks.py index 3065d97243..6eed4c488e 100644 --- a/tasks.py +++ b/tasks.py @@ -65,7 +65,7 @@ def manage(c, cmd, pty=False): cmd - django command to run """ - c.run('cd {path} && python3 manage.py {cmd}'.format( + c.run('cd "{path}" && python3 manage.py {cmd}'.format( path=managePyDir(), cmd=cmd ), pty=pty) From 294e86cc38ca05e7943a4806c448f13d1f60323f Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 4 May 2021 21:56:25 +0200 Subject: [PATCH 03/56] Add in sale price model --- InvenTree/order/forms.py | 1 + .../migrations/0045_auto_20210504_1946.py | 24 +++++++++++++++++++ InvenTree/order/models.py | 10 ++++++++ InvenTree/order/serializers.py | 4 ++++ 4 files changed, 39 insertions(+) create mode 100644 InvenTree/order/migrations/0045_auto_20210504_1946.py diff --git a/InvenTree/order/forms.py b/InvenTree/order/forms.py index 4c9caf3b53..8536c71ef5 100644 --- a/InvenTree/order/forms.py +++ b/InvenTree/order/forms.py @@ -211,6 +211,7 @@ class EditSalesOrderLineItemForm(HelperForm): 'part', 'quantity', 'reference', + 'sale_price', 'notes' ] diff --git a/InvenTree/order/migrations/0045_auto_20210504_1946.py b/InvenTree/order/migrations/0045_auto_20210504_1946.py new file mode 100644 index 0000000000..a8d9469dc7 --- /dev/null +++ b/InvenTree/order/migrations/0045_auto_20210504_1946.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2 on 2021-05-04 19:46 + +from django.db import migrations +import djmoney.models.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('order', '0044_auto_20210404_2016'), + ] + + operations = [ + migrations.AddField( + model_name='salesorderlineitem', + name='sale_price', + field=djmoney.models.fields.MoneyField(blank=True, decimal_places=4, default_currency='USD', help_text='Unit sale price', max_digits=19, null=True, verbose_name='Sale Price'), + ), + migrations.AddField( + model_name='salesorderlineitem', + name='sale_price_currency', + field=djmoney.models.fields.CurrencyField(choices=[('AUD', 'Australian Dollar'), ('GBP', 'British Pound'), ('CAD', 'Canadian Dollar'), ('EUR', 'Euro'), ('JPY', 'Japanese Yen'), ('NZD', 'New Zealand Dollar'), ('USD', 'US Dollar')], default='USD', editable=False, max_length=3), + ), + ] diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index ea70c3b56a..f0df4a7ff1 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -664,12 +664,22 @@ class SalesOrderLineItem(OrderLineItem): Attributes: order: Link to the SalesOrder that this line item belongs to part: Link to a Part object (may be null) + sale_price: The unit sale price for this OrderLineItem """ order = models.ForeignKey(SalesOrder, on_delete=models.CASCADE, related_name='lines', verbose_name=_('Order'), help_text=_('Sales Order')) part = models.ForeignKey('part.Part', on_delete=models.SET_NULL, related_name='sales_order_line_items', null=True, verbose_name=_('Part'), help_text=_('Part'), limit_choices_to={'salable': True}) + sale_price = MoneyField( + max_digits=19, + decimal_places=4, + default_currency='USD', + null=True, blank=True, + verbose_name=_('Sale Price'), + help_text=_('Unit sale price'), + ) + class Meta: unique_together = [ ] diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index a04798c303..2f4545fc30 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -278,6 +278,7 @@ class SOLineItemSerializer(InvenTreeModelSerializer): quantity = serializers.FloatField() allocated = serializers.FloatField(source='allocated_quantity', read_only=True) fulfilled = serializers.FloatField(source='fulfilled_quantity', read_only=True) + sale_price_string = serializers.CharField(source='sale_price', read_only=True) class Meta: model = SalesOrderLineItem @@ -294,6 +295,9 @@ class SOLineItemSerializer(InvenTreeModelSerializer): 'order_detail', 'part', 'part_detail', + 'sale_price', + 'sale_price_currency', + 'sale_price_string', ] From 28a67828e3ff88824eae97691865bf3d10f7e76d Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 4 May 2021 22:04:05 +0200 Subject: [PATCH 04/56] [BUG] invoke: too many arguments Fixes #1543 --- tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks.py b/tasks.py index 3065d97243..6eed4c488e 100644 --- a/tasks.py +++ b/tasks.py @@ -65,7 +65,7 @@ def manage(c, cmd, pty=False): cmd - django command to run """ - c.run('cd {path} && python3 manage.py {cmd}'.format( + c.run('cd "{path}" && python3 manage.py {cmd}'.format( path=managePyDir(), cmd=cmd ), pty=pty) From 7fa235282bb3ff91eddea2e6c8350e6dad649861 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 4 May 2021 22:50:04 +0200 Subject: [PATCH 05/56] sale price in ui --- InvenTree/order/templates/order/sales_order_detail.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/InvenTree/order/templates/order/sales_order_detail.html b/InvenTree/order/templates/order/sales_order_detail.html index 392a236931..e611ebc9e1 100644 --- a/InvenTree/order/templates/order/sales_order_detail.html +++ b/InvenTree/order/templates/order/sales_order_detail.html @@ -223,6 +223,14 @@ $("#so-lines-table").inventreeTable({ field: 'quantity', title: '{% trans "Quantity" %}', }, + { + sortable: true, + field: 'sale_price', + title: '{% trans "Unit Price" %}', + formatter: function(value, row) { + return row.sale_price_string || row.sale_price; + } + }, { field: 'allocated', {% if order.status == SalesOrderStatus.PENDING %} From 251603b69b81306a1a68083019492ec900457b19 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 4 May 2021 23:47:21 +0200 Subject: [PATCH 06/56] removing temp fix for invoke error --- tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks.py b/tasks.py index 6eed4c488e..3065d97243 100644 --- a/tasks.py +++ b/tasks.py @@ -65,7 +65,7 @@ def manage(c, cmd, pty=False): cmd - django command to run """ - c.run('cd "{path}" && python3 manage.py {cmd}'.format( + c.run('cd {path} && python3 manage.py {cmd}'.format( path=managePyDir(), cmd=cmd ), pty=pty) From 7a19145be15651be65af030480372c1feb5be878 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 5 May 2021 17:34:35 +1000 Subject: [PATCH 07/56] Disable wrapping for translation files This ensures that the updates pushed back from crowding don't have unnecessary file deltas Ref: https://docs.djangoproject.com/en/3.2/ref/django-admin/#django-admin-makemessages --- InvenTree/locale/de/LC_MESSAGES/django.mo | Bin 119528 -> 125311 bytes InvenTree/locale/de/LC_MESSAGES/django.po | 568 ++-- InvenTree/locale/en/LC_MESSAGES/django.po | 3236 +++++++++++---------- InvenTree/locale/es/LC_MESSAGES/django.mo | Bin 380 -> 327 bytes InvenTree/locale/es/LC_MESSAGES/django.po | 523 ++-- InvenTree/locale/fr/LC_MESSAGES/django.mo | Bin 379 -> 325 bytes InvenTree/locale/fr/LC_MESSAGES/django.po | 524 ++-- InvenTree/locale/it/LC_MESSAGES/django.mo | Bin 380 -> 327 bytes InvenTree/locale/it/LC_MESSAGES/django.po | 524 ++-- InvenTree/locale/ja/LC_MESSAGES/django.mo | Bin 373 -> 321 bytes InvenTree/locale/ja/LC_MESSAGES/django.po | 523 ++-- InvenTree/locale/pl/LC_MESSAGES/django.mo | Bin 526 -> 472 bytes InvenTree/locale/pl/LC_MESSAGES/django.po | 523 ++-- InvenTree/locale/ru/LC_MESSAGES/django.mo | Bin 518 -> 492 bytes InvenTree/locale/ru/LC_MESSAGES/django.po | 523 ++-- InvenTree/locale/tr/LC_MESSAGES/django.po | 640 ++-- InvenTree/locale/zh/LC_MESSAGES/django.mo | Bin 337 -> 331 bytes InvenTree/locale/zh/LC_MESSAGES/django.po | 524 ++-- tasks.py | 2 +- 19 files changed, 4358 insertions(+), 3752 deletions(-) diff --git a/InvenTree/locale/de/LC_MESSAGES/django.mo b/InvenTree/locale/de/LC_MESSAGES/django.mo index 0dd13dedf0651b756b6cefbf5f93f05f1616d5e0..e90eab101b28a03f6724b788ea17be06861a736b 100644 GIT binary patch delta 41270 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 delta 36008 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 wpO(!Ua;Xx+Z#ipwC%nJwT\n" +msgid "" +"There are %(count)s parts sourced from this company.
\n" "If this supplier is deleted, these supplier part entries will also be deleted." -msgstr "Es gibt %(count)s Teile, die von diesem Unternehmen bezogen werden.
\n" +msgstr "" +"Es gibt %(count)s Teile, die von diesem Unternehmen bezogen werden.
\n" "Wenn dieser Lieferant gelöscht wird, werden auch diese Zulieferer-Teile gelöscht." #: company/templates/company/detail.html:21 @@ -2034,7 +2041,7 @@ msgstr "Keine Website angegeben" msgid "Uses default currency" msgstr "verwendet Standard-Währung" -#: company/templates/company/detail.html:67 order/models.py:440 +#: company/templates/company/detail.html:67 order/models.py:450 #: order/templates/order/sales_order_base.html:92 stock/models.py:415 #: stock/models.py:416 stock/templates/stock/item_base.html:251 #: templates/js/company.js:40 templates/js/order.js:267 @@ -2123,13 +2130,13 @@ msgstr "Zulieferer-Teile" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:42 -#: order/templates/order/purchase_order_detail.html:75 +#: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "Neues Zulieferer-Teil anlegen" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 -#: order/templates/order/purchase_order_detail.html:74 +#: order/templates/order/purchase_order_detail.html:49 #: part/templates/part/supplier.html:17 templates/js/stock.js:1163 msgid "New Supplier Part" msgstr "Neues Zulieferer-Teil" @@ -2227,7 +2234,7 @@ msgstr "Zuliefererteil entfernen" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:184 +#: stock/views.py:1002 users/models.py:187 msgid "Delete" msgstr "Löschen" @@ -2253,7 +2260,7 @@ msgstr "Zulieferer-Teile" #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 #: templates/InvenTree/search.html:198 templates/js/stock.js:968 -#: templates/stats.html:72 templates/stats.html:81 users/models.py:40 +#: templates/stats.html:72 templates/stats.html:81 users/models.py:42 msgid "Stock Items" msgstr "BestandsObjekte" @@ -2267,7 +2274,7 @@ msgstr "BestandsObjekte" #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46 -#: users/models.py:43 +#: users/models.py:45 msgid "Sales Orders" msgstr "Aufträge" @@ -2279,7 +2286,7 @@ msgstr "Aufträge" #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37 -#: users/models.py:42 +#: users/models.py:44 msgid "Purchase Orders" msgstr "Bestellungen" @@ -2358,7 +2365,7 @@ msgid "Pricing Information" msgstr "Preisinformationen ansehen" #: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2624 +#: part/templates/part/sale_prices.html:17 part/views.py:2636 msgid "Add Price Break" msgstr "Preisstaffel hinzufügen" @@ -2468,15 +2475,15 @@ msgstr "Neues Zulieferer-Teil anlegen" msgid "Delete Supplier Part" msgstr "Zulieferer-Teil entfernen" -#: company/views.py:799 part/views.py:2628 +#: company/views.py:799 part/views.py:2640 msgid "Added new price break" msgstr "neue Preisstaffel hinzufügt" -#: company/views.py:855 part/views.py:2672 +#: company/views.py:855 part/views.py:2684 msgid "Edit Price Break" msgstr "Preisstaffel bearbeiten" -#: company/views.py:870 part/views.py:2686 +#: company/views.py:870 part/views.py:2698 msgid "Delete Price Break" msgstr "Preisstaffel löschen" @@ -2566,7 +2573,7 @@ msgstr "Zieldatum für Auftrags-Lieferung." msgid "Enter sales order number" msgstr "Auftrag-Nummer eingeben" -#: order/forms.py:145 order/models.py:452 +#: order/forms.py:145 order/models.py:462 msgid "Target date for order completion. Order will be overdue after this date." msgstr "Zieldatum für Auftrags-Fertigstellung." @@ -2602,7 +2609,7 @@ msgstr "Nutzer oder Gruppe der/die für diesen Auftrag zuständig ist/sind" msgid "Order notes" msgstr "Bestell-Notizen" -#: order/models.py:182 order/models.py:445 +#: order/models.py:182 order/models.py:455 msgid "Purchase order status" msgstr "Bestellungs-Status" @@ -2643,8 +2650,8 @@ msgstr "Geplantes Lieferdatum für Auftrag." msgid "Date order was completed" msgstr "Datum an dem der Auftrag fertigstellt wurde" -#: order/models.py:243 order/models.py:342 part/views.py:1586 -#: stock/models.py:270 stock/models.py:953 +#: order/models.py:243 part/views.py:1586 stock/models.py:270 +#: stock/models.py:953 msgid "Quantity must be greater than zero" msgstr "Anzahl muss größer Null sein" @@ -2652,120 +2659,132 @@ msgstr "Anzahl muss größer Null sein" msgid "Part supplier must match PO supplier" msgstr "Teile-Zulieferer muss dem Zulieferer der Bestellung entsprechen" -#: order/models.py:337 +#: order/models.py:344 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "Nur Teile aufgegebener Bestllungen können empfangen werden" -#: order/models.py:359 +#: order/models.py:348 +#, fuzzy +#| msgid "Quantity must be integer" +msgid "Quantity must be an integer" +msgstr "Anzahl muss eine Ganzzahl sein" + +#: order/models.py:350 +#, fuzzy +#| msgid "Quantity must be positive" +msgid "Quantity must be a positive number" +msgstr "Anzahl muss positiv sein" + +#: order/models.py:369 msgid "Received items" msgstr "Elemente empfangen" -#: order/models.py:441 +#: order/models.py:451 msgid "Company to which the items are being sold" msgstr "Firma an die die Teile verkauft werden" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer Reference " msgstr "Kundenreferenz" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer order reference code" msgstr "Bestellreferenz" -#: order/models.py:455 templates/js/order.js:303 +#: order/models.py:465 templates/js/order.js:303 msgid "Shipment Date" msgstr "Versanddatum" -#: order/models.py:462 +#: order/models.py:472 msgid "shipped by" msgstr "Versand von" -#: order/models.py:506 +#: order/models.py:516 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "Bestellung kann nicht versendet werden weil er nicht anhängig ist" -#: order/models.py:593 +#: order/models.py:603 msgid "Item quantity" msgstr "Anzahl" -#: order/models.py:595 +#: order/models.py:605 msgid "Line item reference" msgstr "Position - Referenz" -#: order/models.py:597 +#: order/models.py:607 msgid "Line item notes" msgstr "Position - Notizen" -#: order/models.py:623 order/models.py:667 +#: order/models.py:633 order/models.py:677 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "Bestellung" -#: order/models.py:624 order/templates/order/order_base.html:9 +#: order/models.py:634 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:313 templates/js/order.js:148 msgid "Purchase Order" msgstr "Bestellung" -#: order/models.py:638 +#: order/models.py:648 msgid "Supplier part" msgstr "Zulieferer-Teil" -#: order/models.py:641 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:214 +#: order/models.py:651 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:189 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:131 msgid "Received" msgstr "Empfangen" -#: order/models.py:641 +#: order/models.py:651 msgid "Number of items received" msgstr "Empfangene Objekt-Anzahl" -#: order/models.py:648 stock/models.py:508 +#: order/models.py:658 stock/models.py:508 #: stock/templates/stock/item_base.html:320 msgid "Purchase Price" msgstr "Preis" -#: order/models.py:649 +#: order/models.py:659 msgid "Unit purchase price" msgstr "Preis pro Einheit" -#: order/models.py:743 order/models.py:745 +#: order/models.py:753 order/models.py:755 msgid "Stock item has not been assigned" msgstr "BestandsObjekt wurde nicht zugewiesen" -#: order/models.py:749 +#: order/models.py:759 msgid "Cannot allocate stock item to a line with a different part" msgstr "Kann BestandsObjekt keiner Zeile mit einem anderen Teil hinzufügen" -#: order/models.py:751 +#: order/models.py:761 msgid "Cannot allocate stock to a line without a part" msgstr "Kann BestandsObjekt keiner Zeile ohne Teil hinzufügen" -#: order/models.py:754 +#: order/models.py:764 msgid "Allocation quantity cannot exceed stock quantity" msgstr "Die zugeordnete Anzahl darf nicht die verfügbare Anzahl überschreiten" -#: order/models.py:764 +#: order/models.py:774 msgid "Quantity must be 1 for serialized stock item" msgstr "Anzahl für BestandsObjekt mit Seriennummer muss 1 sein" -#: order/models.py:769 +#: order/models.py:779 msgid "Line" msgstr "Position" -#: order/models.py:780 +#: order/models.py:790 msgid "Item" msgstr "Position" -#: order/models.py:781 +#: order/models.py:791 msgid "Select stock item to allocate" msgstr "BestandsObjekt für Zuordnung auswählen" -#: order/models.py:784 +#: order/models.py:794 msgid "Enter stock allocation quantity" msgstr "Anzahl für Bestandszuordnung eingeben" @@ -2813,9 +2832,24 @@ msgstr "Bestellstatus" msgid "Issued" msgstr "Aufgegeben" -#: order/templates/order/order_cancel.html:7 -#: order/templates/order/sales_order_cancel.html:9 -msgid "Cancelling this order means that the order will no longer be editable." +#: order/templates/order/order_base.html:180 +#: order/templates/order/purchase_order_detail.html:100 +#: part/templates/part/category.html:185 part/templates/part/category.html:227 +#: stock/templates/stock/location.html:191 templates/js/stock.js:708 +#: templates/js/stock.js:1169 +msgid "New Location" +msgstr "Neuer Lagerort" + +#: order/templates/order/order_base.html:181 +#: order/templates/order/purchase_order_detail.html:101 +#: stock/templates/stock/location.html:42 +msgid "Create new stock location" +msgstr "Neuen Lagerort anlegen" + +#: order/templates/order/order_cancel.html:8 +#, fuzzy +#| msgid "Cancelling this order means that the order will no longer be editable." +msgid "Cancelling this order means that the order and line items will no longer be editable." msgstr "Abbruch dieser Bestellung bedeutet, dass sie nicht länger bearbeitbar ist." #: order/templates/order/order_complete.html:7 @@ -2827,10 +2861,12 @@ msgid "This order has line items which have not been marked as received." msgstr "Diese Bestellung enthält Positionen, die nicht als empfangen markiert wurden." #: order/templates/order/order_complete.html:11 -msgid "Marking this order as complete will remove these line items." -msgstr "Wenn Sie diese Bestellung als abgeschlossen markieren, werden diese Positionen entfernt." +#, fuzzy +#| msgid "Cancelling this order means that the order will no longer be editable." +msgid "Completing this order means that the order and line items will no longer be editable." +msgstr "Abbruch dieser Bestellung bedeutet, dass sie nicht länger bearbeitbar ist." -#: order/templates/order/order_issue.html:7 +#: order/templates/order/order_issue.html:8 msgid "After placing this purchase order, line items will no longer be editable." msgstr "Nachdem diese Bestellung plaziert ist können die Positionen nicht länger bearbeitbar ist." @@ -2882,11 +2918,15 @@ msgid "Select Purchase Order" msgstr "Bestellung auswählen" #: order/templates/order/order_wizard/select_pos.html:45 -msgid "Create new purchase order for {{ supplier.name }}" -msgstr "Neue Bestellung für {{ supplier.name }} anlegen" +#, fuzzy, python-format +#| msgid "Create new purchase order" +msgid "Create new purchase order for %(name)s" +msgstr "Neue Bestellung anlegen" #: order/templates/order/order_wizard/select_pos.html:68 -msgid "Select a purchase order for" +#, fuzzy, python-format +#| msgid "Select a purchase order for" +msgid "Select a purchase order for %(name)s" msgstr "Bestellung auswählen für" #: order/templates/order/po_attachments.html:12 @@ -2908,43 +2948,29 @@ msgid "Purchase Order Items" msgstr "Bestellungs-Positionen" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1108 -#: order/views.py:1191 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1120 +#: order/views.py:1203 msgid "Add Line Item" msgstr "Position hinzufügen" -#: order/templates/order/purchase_order_detail.html:45 -#: order/templates/order/purchase_order_detail.html:125 -#: part/templates/part/category.html:185 part/templates/part/category.html:227 -#: stock/templates/stock/location.html:191 templates/js/stock.js:708 -#: templates/js/stock.js:1169 -msgid "New Location" -msgstr "Neuer Lagerort" - -#: order/templates/order/purchase_order_detail.html:46 -#: order/templates/order/purchase_order_detail.html:126 -#: stock/templates/stock/location.html:42 -msgid "Create new stock location" -msgstr "Neuen Lagerort anlegen" - -#: order/templates/order/purchase_order_detail.html:139 +#: order/templates/order/purchase_order_detail.html:114 msgid "No line items found" msgstr "Keine Positionen gefunden" -#: order/templates/order/purchase_order_detail.html:205 +#: order/templates/order/purchase_order_detail.html:180 msgid "Unit Price" msgstr "Stück-Preis" -#: order/templates/order/purchase_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:221 #: order/templates/order/sales_order_detail.html:294 msgid "Edit line item" msgstr "Position bearbeiten" -#: order/templates/order/purchase_order_detail.html:247 +#: order/templates/order/purchase_order_detail.html:222 msgid "Delete line item" msgstr "Position löschen" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:227 msgid "Receive line item" msgstr "Position empfangen" @@ -2967,7 +2993,7 @@ msgstr "Ausstehende Teile für %(order)s - %(desc)s empfangen" #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:577 #: templates/navbar.html:23 templates/stats.html:59 templates/stats.html:68 -#: users/models.py:38 +#: users/models.py:40 msgid "Parts" msgstr "Teile" @@ -3020,6 +3046,10 @@ msgstr "Kundenreferenz" msgid "Warning" msgstr "Warnung" +#: order/templates/order/sales_order_cancel.html:9 +msgid "Cancelling this order means that the order will no longer be editable." +msgstr "Abbruch dieser Bestellung bedeutet, dass sie nicht länger bearbeitbar ist." + #: order/templates/order/sales_order_detail.html:13 msgid "Sales Order Items" msgstr "Auftrags-Positionen" @@ -3214,65 +3244,65 @@ msgstr "Anzahl kleiner null empfangen" msgid "No lines specified" msgstr "Keine Zeilen angegeben" -#: order/views.py:1060 +#: order/views.py:1069 #, python-brace-format msgid "Ordered {n} parts" msgstr "{n} Teile bestellt" -#: order/views.py:1117 +#: order/views.py:1129 msgid "Supplier part must be specified" msgstr "Zulieferer-Teil muss ausgewählt werden" -#: order/views.py:1123 +#: order/views.py:1135 msgid "Supplier must match for Part and Order" msgstr "Zulieferer muss zu Teil und Bestellung passen" -#: order/views.py:1242 order/views.py:1260 +#: order/views.py:1254 order/views.py:1272 msgid "Edit Line Item" msgstr "Position bearbeiten" -#: order/views.py:1276 order/views.py:1288 +#: order/views.py:1288 order/views.py:1300 msgid "Delete Line Item" msgstr "Position löschen" -#: order/views.py:1281 order/views.py:1293 +#: order/views.py:1293 order/views.py:1305 msgid "Deleted line item" msgstr "Position gelöscht" -#: order/views.py:1306 +#: order/views.py:1318 msgid "Allocate Serial Numbers" msgstr "Seriennummern zuweisen" -#: order/views.py:1351 +#: order/views.py:1363 #, python-brace-format msgid "Allocated {n} items" msgstr "{n} Positionen zugeordnet" -#: order/views.py:1367 +#: order/views.py:1379 msgid "Select line item" msgstr "Position auswählen" -#: order/views.py:1398 +#: order/views.py:1410 msgid "No matching item for serial" msgstr "Kein passends Teil für Seriennummer gefunden" -#: order/views.py:1408 +#: order/views.py:1420 msgid "is not in stock" msgstr "ist nicht auf Lager" -#: order/views.py:1416 +#: order/views.py:1428 msgid "already allocated to an order" msgstr "bereits einem Auftrag zugeordnet" -#: order/views.py:1470 +#: order/views.py:1482 msgid "Allocate Stock to Order" msgstr "Lagerbestand dem Auftrag zuweisen" -#: order/views.py:1544 +#: order/views.py:1556 msgid "Edit Allocation Quantity" msgstr "Zuordnung bearbeiten" -#: order/views.py:1559 +#: order/views.py:1571 msgid "Remove allocation" msgstr "Zuordnung entfernen" @@ -3458,7 +3488,7 @@ msgstr "Teil-Kategorie" #: part/models.py:83 part/templates/part/category.html:23 #: part/templates/part/category.html:94 part/templates/part/category.html:141 #: templates/InvenTree/search.html:127 templates/stats.html:63 -#: users/models.py:37 +#: users/models.py:39 msgid "Part Categories" msgstr "Teil-Kategorien" @@ -4005,7 +4035,7 @@ msgstr "Neuen Bauauftrag beginnen" msgid "All parts" msgstr "Alle Teile" -#: part/templates/part/category.html:29 part/views.py:2270 +#: part/templates/part/category.html:29 part/views.py:2282 msgid "Create new part category" msgstr "Teil-Kategorie anlegen" @@ -4695,63 +4725,63 @@ msgstr "Teil wurde gelöscht" msgid "Part Pricing" msgstr "Teilbepreisung" -#: part/views.py:2069 +#: part/views.py:2081 msgid "Create Part Parameter Template" msgstr "Teilparametervorlage anlegen" -#: part/views.py:2079 +#: part/views.py:2091 msgid "Edit Part Parameter Template" msgstr "Teilparametervorlage bearbeiten" -#: part/views.py:2086 +#: part/views.py:2098 msgid "Delete Part Parameter Template" msgstr "Teilparametervorlage löschen" -#: part/views.py:2094 +#: part/views.py:2106 msgid "Create Part Parameter" msgstr "Teilparameter anlegen" -#: part/views.py:2144 +#: part/views.py:2156 msgid "Edit Part Parameter" msgstr "Teilparameter bearbeiten" -#: part/views.py:2158 +#: part/views.py:2170 msgid "Delete Part Parameter" msgstr "Teilparameter löschen" -#: part/views.py:2218 +#: part/views.py:2230 msgid "Edit Part Category" msgstr "Teil-Kategorie bearbeiten" -#: part/views.py:2256 +#: part/views.py:2268 msgid "Delete Part Category" msgstr "Teil-Kategorie löschen" -#: part/views.py:2262 +#: part/views.py:2274 msgid "Part category was deleted" msgstr "Teil-Kategorie wurde gelöscht" -#: part/views.py:2314 +#: part/views.py:2326 msgid "Create Category Parameter Template" msgstr "Kategorieparametervorlage anlegen" -#: part/views.py:2415 +#: part/views.py:2427 msgid "Edit Category Parameter Template" msgstr "Kategorieparametervorlage bearbeiten" -#: part/views.py:2471 +#: part/views.py:2483 msgid "Delete Category Parameter Template" msgstr "Kategorieparametervorlage löschen" -#: part/views.py:2490 +#: part/views.py:2502 msgid "Create BOM Item" msgstr "Stücklisten-Position anlegen" -#: part/views.py:2560 +#: part/views.py:2572 msgid "Edit BOM item" msgstr "Stücklisten-Position bearbeiten" -#: part/views.py:2616 +#: part/views.py:2628 msgid "Confim BOM item deletion" msgstr "löschen von Stücklisten-Position bestätigen" @@ -5302,15 +5332,15 @@ msgid "Stock adjustment actions" msgstr "Bestands-Anpassungs Aktionen" #: stock/templates/stock/item_base.html:164 -#: stock/templates/stock/location.html:65 templates/stock_table.html:56 +#: stock/templates/stock/location.html:65 templates/stock_table.html:57 msgid "Count stock" msgstr "Bestand zählen" -#: stock/templates/stock/item_base.html:167 templates/stock_table.html:54 +#: stock/templates/stock/item_base.html:167 templates/stock_table.html:55 msgid "Add stock" msgstr "Bestand hinzufügen" -#: stock/templates/stock/item_base.html:170 templates/stock_table.html:55 +#: stock/templates/stock/item_base.html:170 templates/stock_table.html:56 msgid "Remove stock" msgstr "Bestand entfernen" @@ -5504,7 +5534,7 @@ msgid "Stock Details" msgstr "Objekt-Details" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:76 users/models.py:39 +#: templates/stats.html:76 users/models.py:41 msgid "Stock Locations" msgstr "Bestand-Lagerorte" @@ -5690,7 +5720,7 @@ msgstr "Entfernen" msgid "Add Stock Items" msgstr "BestandsObjekte hinzufügen" -#: stock/views.py:1001 users/models.py:180 +#: stock/views.py:1001 users/models.py:183 msgid "Add" msgstr "Hinzufügen" @@ -5868,6 +5898,40 @@ msgstr "an Kunde versand" msgid "No stock location set" msgstr "Kein Lagerort gesetzt" +#: templates/InvenTree/settings/appearance.html:10 +msgid "Theme Settings" +msgstr "Anzeige-Einstellungen" + +#: templates/InvenTree/settings/appearance.html:17 +msgid "Color Themes" +msgstr "Farbschemata" + +#: templates/InvenTree/settings/appearance.html:29 +#, fuzzy, python-format +#| msgid "" +#| "\n" +#| "\t\tThe CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" +#| "\t\tPlease select another color theme :)\n" +#| "\t" +msgid "" +"\n" +" The CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" +" Please select another color theme :)\n" +" " +msgstr "" +"\n" +"\t\tDie CSS Datei \"%(invalid_color_theme)s.css\" für das aktuell ausgewählte Farbschema wurde nicht gefunden.
\n" +"\t\tBitte ein anderes Farbschema auswählen:)\n" +"\t" + +#: templates/InvenTree/settings/appearance.html:39 +msgid "Language" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:61 +msgid "Set Language" +msgstr "" + #: templates/InvenTree/settings/build.html:10 msgid "Build Order Settings" msgstr "Bauauftrag-Einstellungen" @@ -5951,7 +6015,7 @@ msgstr "Auftrags-Einstellungen" msgid "Stock Settings" msgstr "Bestands-Einstellungen" -#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:49 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:50 msgid "Stock Options" msgstr "Stock-Optionen" @@ -5965,8 +6029,8 @@ msgid "Account" msgstr "Konto" #: templates/InvenTree/settings/tabs.html:9 -msgid "Theme" -msgstr "Thema" +msgid "Appearance" +msgstr "" #: templates/InvenTree/settings/tabs.html:13 msgid "InvenTree Settings" @@ -5984,25 +6048,6 @@ msgstr "Bericht" msgid "Categories" msgstr "Kategorien" -#: templates/InvenTree/settings/theme.html:10 -msgid "Theme Settings" -msgstr "Anzeige-Einstellungen" - -#: templates/InvenTree/settings/theme.html:17 -msgid "Color Themes" -msgstr "Farbschemata" - -#: templates/InvenTree/settings/theme.html:29 -#, python-format -msgid "\n" -"\t\tThe CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" -"\t\tPlease select another color theme :)\n" -"\t" -msgstr "\n" -"\t\tDie CSS Datei \"%(invalid_color_theme)s.css\" für das aktuell ausgewählte Farbschema wurde nicht gefunden.
\n" -"\t\tBitte ein anderes Farbschema auswählen:)\n" -"\t" - #: templates/InvenTree/settings/user.html:16 msgid "User Information" msgstr "Benutzerinformation" @@ -6065,13 +6110,23 @@ msgid "View Code on GitHub" msgstr "Code auf GitHub ansehen" #: templates/about.html:63 -msgid "Get the App" -msgstr "App herunterladen" +msgid "Credits" +msgstr "" #: templates/about.html:68 +msgid "Mobile App" +msgstr "" + +#: templates/about.html:73 msgid "Submit Bug Report" msgstr "Fehlerbericht senden" +#: templates/about.html:82 templates/js/modals.js:550 +#: templates/js/modals.js:809 templates/modals.html:28 templates/modals.html:52 +#: templates/modals.html:93 +msgid "Close" +msgstr "Schliessen" + #: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "Anhang hinzufügen" @@ -6267,7 +6322,7 @@ msgid "Quantity Per" msgstr "Anzahl pro" #: templates/js/build.js:638 templates/js/build.js:1056 -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order stock" msgstr "Bestand bestellen" @@ -6400,11 +6455,6 @@ msgstr "Lade Daten" msgid "Submit" msgstr "Abschicken" -#: templates/js/modals.js:550 templates/js/modals.js:809 -#: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93 -msgid "Close" -msgstr "Schliessen" - #: templates/js/modals.js:760 msgid "Invalid response from server" msgstr "ungültige Antwort vom Server" @@ -6978,6 +7028,10 @@ msgstr "Alle" msgid "Form errors exist" msgstr "Fehler in Formular" +#: templates/navbar.html:13 +msgid "Toggle navigation" +msgstr "" + #: templates/navbar.html:33 msgid "Buy" msgstr "Kaufen" @@ -6990,7 +7044,7 @@ msgstr "Verkaufen" msgid "Scan Barcode" msgstr "Barcode scannen" -#: templates/navbar.html:77 users/models.py:36 +#: templates/navbar.html:77 users/models.py:38 msgid "Admin" msgstr "Admin" @@ -7122,43 +7176,43 @@ msgstr "Barcode Aktionen" msgid "Print test reports" msgstr "Test-Berichte drucken" -#: templates/stock_table.html:54 +#: templates/stock_table.html:55 msgid "Add to selected stock items" msgstr "Zu ausgewählten BestandsObjekten hinzufügen" -#: templates/stock_table.html:55 +#: templates/stock_table.html:56 msgid "Remove from selected stock items" msgstr "Von ausgewählten BestandsObjekten entfernen" -#: templates/stock_table.html:56 +#: templates/stock_table.html:57 msgid "Stocktake selected stock items" msgstr "Inventur für gewählte BestandsObjekte" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move selected stock items" msgstr "Ausgewählte BestandsObjekte verschieben" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move stock" msgstr "Bestand verschieben" -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order selected items" msgstr "Ausgewählte Positionen bestellen" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change status" msgstr "Status ändern" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change stock status" msgstr "Bestandsstatus ändern" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete selected items" msgstr "Ausgewählte Positionen löschen" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete Stock" msgstr "Bestand löschen" @@ -7194,34 +7248,46 @@ msgstr "Berechtigungen" msgid "Important dates" msgstr "wichtige Daten" -#: users/models.py:167 +#: users/models.py:170 msgid "Permission set" msgstr "Berechtigung geändert" -#: users/models.py:175 +#: users/models.py:178 msgid "Group" msgstr "Gruppe" -#: users/models.py:178 +#: users/models.py:181 msgid "View" msgstr "Ansicht" -#: users/models.py:178 +#: users/models.py:181 msgid "Permission to view items" msgstr "Berechtigung Einträge anzuzeigen" -#: users/models.py:180 +#: users/models.py:183 msgid "Permission to add items" msgstr "Berechtigung Einträge zu erstellen" -#: users/models.py:182 +#: users/models.py:185 msgid "Change" msgstr "Ändern" -#: users/models.py:182 +#: users/models.py:185 msgid "Permissions to edit items" msgstr "Berechtigungen Einträge zu ändern" -#: users/models.py:184 +#: users/models.py:187 msgid "Permission to delete items" msgstr "Berechtigung Einträge zu löschen" + +#~ msgid "Marking this order as complete will remove these line items." +#~ msgstr "Wenn Sie diese Bestellung als abgeschlossen markieren, werden diese Positionen entfernt." + +#~ msgid "Create new purchase order for {{ supplier.name }}" +#~ msgstr "Neue Bestellung für {{ supplier.name }} anlegen" + +#~ msgid "Theme" +#~ msgstr "Thema" + +#~ msgid "Get the App" +#~ msgstr "App herunterladen" diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po index 14192c38d6..097f4c0f8c 100644 --- a/InvenTree/locale/en/LC_MESSAGES/django.po +++ b/InvenTree/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-14 11:13+0000\n" +"POT-Creation-Date: 2021-05-05 17:33+1000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -34,10 +34,10 @@ msgstr "" msgid "Enter date" msgstr "" -#: InvenTree/forms.py:110 build/forms.py:99 build/forms.py:120 -#: build/forms.py:142 build/forms.py:166 build/forms.py:188 build/forms.py:223 +#: InvenTree/forms.py:110 build/forms.py:102 build/forms.py:123 +#: build/forms.py:145 build/forms.py:169 build/forms.py:185 build/forms.py:227 #: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60 -#: order/forms.py:71 part/forms.py:132 +#: order/forms.py:71 part/forms.py:134 msgid "Confirm" msgstr "" @@ -49,7 +49,7 @@ msgstr "" msgid "Confirm item deletion" msgstr "" -#: InvenTree/forms.py:159 templates/registration/login.html:76 +#: InvenTree/forms.py:159 templates/registration/login.html:77 msgid "Enter password" msgstr "" @@ -73,40 +73,41 @@ msgstr "" msgid "Select Category" msgstr "" -#: InvenTree/helpers.py:361 order/models.py:245 order/models.py:344 -#: stock/views.py:1763 -msgid "Invalid quantity provided" -msgstr "" - -#: InvenTree/helpers.py:364 -msgid "Empty serial number string" -msgstr "" - -#: InvenTree/helpers.py:385 +#: InvenTree/helpers.py:377 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:389 InvenTree/helpers.py:392 InvenTree/helpers.py:395 +#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:353 +#: stock/views.py:1763 +msgid "Invalid quantity provided" +msgstr "" + +#: InvenTree/helpers.py:387 +msgid "Empty serial number string" +msgstr "" + +#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 +#: InvenTree/helpers.py:440 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:400 +#: InvenTree/helpers.py:445 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:408 +#: InvenTree/helpers.py:453 msgid "No serial numbers found" msgstr "" -#: InvenTree/helpers.py:412 +#: InvenTree/helpers.py:457 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" -#: InvenTree/models.py:59 stock/models.py:1659 +#: InvenTree/models.py:59 stock/models.py:1662 msgid "Attachment" msgstr "" @@ -122,9 +123,9 @@ msgstr "" msgid "File comment" msgstr "" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1888 +#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1908 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:964 +#: templates/js/stock.js:1041 msgid "User" msgstr "" @@ -133,30 +134,33 @@ msgid "upload date" msgstr "" #: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:101 -#: part/models.py:686 part/models.py:2029 part/templates/part/params.html:27 -#: report/models.py:179 templates/InvenTree/search.html:136 -#: templates/InvenTree/search.html:273 templates/js/part.js:109 +#: part/models.py:686 part/models.py:2049 part/templates/part/params.html:27 +#: report/models.py:179 templates/InvenTree/search.html:137 +#: templates/InvenTree/search.html:289 templates/js/part.js:110 +#: templates/js/part.js:553 templates/js/stock.js:944 msgid "Name" msgstr "" #: InvenTree/models.py:114 build/models.py:134 -#: build/templates/build/detail.html:21 company/models.py:365 -#: company/templates/company/detail.html:26 -#: company/templates/company/supplier_part_base.html:70 +#: build/templates/build/detail.html:21 company/models.py:342 +#: company/models.py:494 company/templates/company/detail.html:27 +#: company/templates/company/manufacturer_part_base.html:72 +#: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:108 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:168 +#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 #: report/templates/report/inventree_build_order_base.html:118 -#: templates/InvenTree/search.html:143 templates/InvenTree/search.html:208 -#: templates/InvenTree/search.html:280 +#: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 +#: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:677 templates/js/build.js:944 +#: templates/js/build.js:736 templates/js/build.js:1004 #: templates/js/company.js:56 templates/js/order.js:183 -#: templates/js/order.js:280 templates/js/part.js:168 templates/js/part.js:251 -#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:554 -#: templates/js/stock.js:938 +#: templates/js/order.js:280 templates/js/part.js:169 templates/js/part.js:252 +#: templates/js/part.js:371 templates/js/part.js:565 templates/js/part.js:643 +#: templates/js/stock.js:554 templates/js/stock.js:956 +#: templates/js/stock.js:1015 msgid "Description" msgstr "" @@ -168,92 +172,92 @@ msgstr "" msgid "parent" msgstr "" -#: InvenTree/settings.py:480 +#: InvenTree/settings.py:491 msgid "English" msgstr "" -#: InvenTree/settings.py:481 +#: InvenTree/settings.py:492 msgid "French" msgstr "" -#: InvenTree/settings.py:482 +#: InvenTree/settings.py:493 msgid "German" msgstr "" -#: InvenTree/settings.py:483 +#: InvenTree/settings.py:494 msgid "Polish" msgstr "" -#: InvenTree/settings.py:484 +#: InvenTree/settings.py:495 msgid "Turkish" msgstr "" -#: InvenTree/status.py:84 +#: InvenTree/status.py:93 msgid "Background worker check failed" msgstr "" -#: InvenTree/status.py:88 +#: InvenTree/status.py:97 msgid "Email backend not configured" msgstr "" -#: InvenTree/status.py:91 +#: InvenTree/status.py:100 msgid "InvenTree system health checks failed" msgstr "" -#: InvenTree/status_codes.py:94 InvenTree/status_codes.py:135 -#: InvenTree/status_codes.py:228 +#: InvenTree/status_codes.py:102 InvenTree/status_codes.py:143 +#: InvenTree/status_codes.py:236 msgid "Pending" msgstr "" -#: InvenTree/status_codes.py:95 +#: InvenTree/status_codes.py:103 msgid "Placed" msgstr "" -#: InvenTree/status_codes.py:96 InvenTree/status_codes.py:231 +#: InvenTree/status_codes.py:104 InvenTree/status_codes.py:239 msgid "Complete" msgstr "" -#: InvenTree/status_codes.py:97 InvenTree/status_codes.py:137 -#: InvenTree/status_codes.py:230 +#: InvenTree/status_codes.py:105 InvenTree/status_codes.py:145 +#: InvenTree/status_codes.py:238 msgid "Cancelled" msgstr "" -#: InvenTree/status_codes.py:98 InvenTree/status_codes.py:138 -#: InvenTree/status_codes.py:180 +#: InvenTree/status_codes.py:106 InvenTree/status_codes.py:146 +#: InvenTree/status_codes.py:188 msgid "Lost" msgstr "" -#: InvenTree/status_codes.py:99 InvenTree/status_codes.py:139 -#: InvenTree/status_codes.py:182 +#: InvenTree/status_codes.py:107 InvenTree/status_codes.py:147 +#: InvenTree/status_codes.py:190 msgid "Returned" msgstr "" -#: InvenTree/status_codes.py:136 +#: InvenTree/status_codes.py:144 #: order/templates/order/sales_order_base.html:124 msgid "Shipped" msgstr "" -#: InvenTree/status_codes.py:176 +#: InvenTree/status_codes.py:184 msgid "OK" msgstr "" -#: InvenTree/status_codes.py:177 +#: InvenTree/status_codes.py:185 msgid "Attention needed" msgstr "" -#: InvenTree/status_codes.py:178 +#: InvenTree/status_codes.py:186 msgid "Damaged" msgstr "" -#: InvenTree/status_codes.py:179 +#: InvenTree/status_codes.py:187 msgid "Destroyed" msgstr "" -#: InvenTree/status_codes.py:181 +#: InvenTree/status_codes.py:189 msgid "Rejected" msgstr "" -#: InvenTree/status_codes.py:229 +#: InvenTree/status_codes.py:237 msgid "Production" msgstr "" @@ -312,7 +316,7 @@ msgstr "" msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:887 templates/navbar.html:85 +#: InvenTree/views.py:887 templates/navbar.html:95 msgid "System Information" msgstr "" @@ -356,138 +360,150 @@ msgstr "" msgid "Barcode associated with StockItem" msgstr "" -#: build/forms.py:34 +#: build/forms.py:37 msgid "Build Order reference" msgstr "" -#: build/forms.py:35 +#: build/forms.py:38 msgid "Order target date" msgstr "" -#: build/forms.py:39 build/templates/build/build_base.html:104 +#: build/forms.py:42 build/templates/build/build_base.html:136 #: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:117 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:723 templates/js/order.js:200 +#: templates/js/build.js:783 templates/js/order.js:200 #: templates/js/order.js:298 msgid "Target Date" msgstr "" -#: build/forms.py:40 build/models.py:224 -msgid "" -"Target date for build completion. Build will be overdue after this date." +#: build/forms.py:43 build/models.py:224 +msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:45 build/forms.py:87 build/forms.py:257 build/models.py:1103 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1241 +#: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 -#: build/templates/build/build_base.html:91 -#: build/templates/build/detail.html:31 common/models.py:696 -#: company/forms.py:131 company/templates/company/supplier_part_pricing.html:77 +#: build/templates/build/build_base.html:123 +#: build/templates/build/detail.html:31 common/models.py:703 +#: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:239 order/forms.py:261 -#: order/forms.py:278 order/models.py:593 order/models.py:784 +#: order/forms.py:278 order/models.py:603 order/models.py:794 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:193 +#: order/templates/order/purchase_order_detail.html:175 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:159 -#: order/templates/order/sales_order_detail.html:224 part/forms.py:340 -#: part/forms.py:369 part/forms.py:385 part/models.py:2158 +#: order/templates/order/sales_order_detail.html:224 part/forms.py:342 +#: part/forms.py:371 part/forms.py:387 part/models.py:2178 #: part/templates/part/allocation.html:19 #: part/templates/part/allocation.html:53 -#: part/templates/part/part_pricing.html:12 -#: part/templates/part/part_pricing.html:19 +#: part/templates/part/part_pricing.html:11 +#: part/templates/part/part_pricing.html:18 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 #: report/templates/report/inventree_so_report.html:91 #: report/templates/report/inventree_test_report_base.html:77 -#: stock/forms.py:175 stock/forms.py:308 stock/models.py:1563 -#: stock/templates/stock/item_base.html:51 -#: stock/templates/stock/item_base.html:57 -#: stock/templates/stock/item_base.html:240 +#: stock/forms.py:175 stock/forms.py:308 stock/models.py:1566 +#: stock/templates/stock/item_base.html:244 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 -#: templates/js/bom.js:205 templates/js/build.js:420 templates/js/build.js:954 -#: templates/js/stock.js:956 templates/js/stock.js:1194 +#: templates/js/bom.js:205 templates/js/build.js:476 templates/js/build.js:1014 +#: templates/js/stock.js:1033 templates/js/stock.js:1271 msgid "Quantity" msgstr "" -#: build/forms.py:46 +#: build/forms.py:49 msgid "Number of items to build" msgstr "" -#: build/forms.py:88 +#: build/forms.py:91 msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:92 order/forms.py:233 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:233 stock/forms.py:118 msgid "Serial Numbers" msgstr "" -#: build/forms.py:94 +#: build/forms.py:97 msgid "Enter serial numbers for build outputs" msgstr "" -#: build/forms.py:100 +#: build/forms.py:103 msgid "Confirm creation of build output" msgstr "" -#: build/forms.py:121 +#: build/forms.py:124 msgid "Confirm deletion of build output" msgstr "" -#: build/forms.py:142 +#: build/forms.py:145 msgid "Confirm unallocation of stock" msgstr "" -#: build/forms.py:166 +#: build/forms.py:169 msgid "Confirm stock allocation" msgstr "" -#: build/forms.py:189 +#: build/forms.py:186 msgid "Mark build as complete" msgstr "" -#: build/forms.py:213 build/templates/build/auto_allocate.html:18 +#: build/forms.py:210 build/templates/build/auto_allocate.html:18 #: order/forms.py:82 stock/forms.py:347 -#: stock/templates/stock/item_base.html:270 +#: stock/templates/stock/item_base.html:274 #: stock/templates/stock/stock_adjust.html:17 -#: templates/InvenTree/search.html:244 templates/js/barcode.js:363 -#: templates/js/barcode.js:531 templates/js/build.js:434 +#: templates/InvenTree/search.html:260 templates/js/barcode.js:363 +#: templates/js/barcode.js:531 templates/js/build.js:490 #: templates/js/stock.js:641 msgid "Location" msgstr "" -#: build/forms.py:214 +#: build/forms.py:211 msgid "Location of completed parts" msgstr "" -#: build/forms.py:219 -msgid "Confirm incomplete" +#: build/forms.py:215 build/templates/build/build_base.html:128 +#: build/templates/build/detail.html:59 order/models.py:455 +#: order/templates/order/receive_parts.html:24 +#: stock/templates/stock/item_base.html:392 templates/InvenTree/search.html:252 +#: templates/js/barcode.js:119 templates/js/build.js:770 +#: templates/js/order.js:187 templates/js/order.js:285 +#: templates/js/stock.js:628 templates/js/stock.js:1279 +msgid "Status" msgstr "" -#: build/forms.py:220 -msgid "Confirm completion with incomplete stock allocation" +#: build/forms.py:216 +msgid "Build output stock status" msgstr "" #: build/forms.py:223 +msgid "Confirm incomplete" +msgstr "" + +#: build/forms.py:224 +msgid "Confirm completion with incomplete stock allocation" +msgstr "" + +#: build/forms.py:227 msgid "Confirm build completion" msgstr "" -#: build/forms.py:243 +#: build/forms.py:252 msgid "Confirm cancel" msgstr "" -#: build/forms.py:243 build/views.py:66 +#: build/forms.py:252 build/views.py:66 msgid "Confirm build cancellation" msgstr "" -#: build/forms.py:257 +#: build/forms.py:266 msgid "Select quantity of stock to allocate" msgstr "" -#: build/models.py:65 build/templates/build/build_base.html:8 -#: build/templates/build/build_base.html:35 +#: build/models.py:65 build/templates/build/build_base.html:9 +#: build/templates/build/build_base.html:63 #: part/templates/part/allocation.html:23 #: report/templates/report/inventree_build_order_base.html:106 msgid "Build Order" @@ -497,9 +513,9 @@ msgstr "" #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 #: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:182 -#: templates/InvenTree/search.html:169 -#: templates/InvenTree/settings/tabs.html:31 users/models.py:41 +#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 +#: templates/InvenTree/search.html:185 +#: templates/InvenTree/settings/tabs.html:31 users/models.py:43 msgid "Build Orders" msgstr "" @@ -507,12 +523,12 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:127 order/models.py:99 order/models.py:595 -#: order/templates/order/purchase_order_detail.html:188 -#: order/templates/order/sales_order_detail.html:219 part/models.py:2167 +#: build/models.py:127 order/models.py:99 order/models.py:605 +#: order/templates/order/purchase_order_detail.html:170 +#: order/templates/order/sales_order_detail.html:219 part/models.py:2187 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:509 templates/js/build.js:948 +#: templates/js/build.js:565 templates/js/build.js:1008 msgid "Reference" msgstr "" @@ -520,7 +536,7 @@ msgstr "" msgid "Brief description of the build" msgstr "" -#: build/models.py:146 build/templates/build/build_base.html:121 +#: build/models.py:146 build/templates/build/build_base.html:153 #: build/templates/build/detail.html:77 msgid "Parent Build" msgstr "" @@ -530,28 +546,27 @@ msgid "BuildOrder to which this build is allocated" msgstr "" #: build/models.py:152 build/templates/build/auto_allocate.html:16 -#: build/templates/build/build_base.html:86 -#: build/templates/build/detail.html:26 company/models.py:539 -#: order/models.py:637 order/models.py:669 +#: build/templates/build/build_base.html:118 +#: build/templates/build/detail.html:26 company/models.py:688 +#: order/models.py:647 order/models.py:679 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:156 +#: order/templates/order/purchase_order_detail.html:131 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:207 part/models.py:321 -#: part/models.py:1856 part/models.py:1868 part/models.py:1886 -#: part/models.py:1961 part/models.py:2057 part/models.py:2142 -#: part/templates/part/part_app_base.html:7 -#: part/templates/part/part_pricing.html:15 part/templates/part/related.html:29 +#: part/models.py:1876 part/models.py:1888 part/models.py:1906 +#: part/models.py:1981 part/models.py:2077 part/models.py:2162 +#: part/templates/part/part_app_base.html:8 +#: part/templates/part/part_pricing.html:14 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 -#: part/templates/part/subcategories.html:17 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 #: report/templates/report/inventree_so_report.html:90 -#: templates/InvenTree/search.html:111 templates/InvenTree/search.html:194 +#: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:681 templates/js/build.js:921 -#: templates/js/company.js:138 templates/js/part.js:232 -#: templates/js/part.js:337 templates/js/stock.js:523 -#: templates/js/stock.js:1266 +#: templates/js/build.js:741 templates/js/build.js:981 +#: templates/js/company.js:140 templates/js/company.js:238 +#: templates/js/part.js:233 templates/js/part.js:338 templates/js/stock.js:523 +#: templates/js/stock.js:1343 msgid "Part" msgstr "" @@ -572,9 +587,7 @@ msgid "Source Location" msgstr "" #: build/models.py:178 -msgid "" -"Select location to take stock from for this build (leave blank to take from " -"any stock location)" +msgid "Select location to take stock from for this build (leave blank to take from any stock location)" msgstr "" #: build/models.py:183 @@ -601,7 +614,7 @@ msgstr "" msgid "Number of stock items which have been completed" msgstr "" -#: build/models.py:204 part/templates/part/part_base.html:159 +#: build/models.py:204 part/templates/part/part_base.html:160 msgid "Build Status" msgstr "" @@ -609,7 +622,7 @@ msgstr "" msgid "Build status code" msgstr "" -#: build/models.py:212 stock/models.py:430 +#: build/models.py:212 stock/models.py:432 msgid "Batch Code" msgstr "" @@ -622,11 +635,11 @@ msgstr "" msgid "Creation Date" msgstr "" -#: build/models.py:223 order/models.py:451 +#: build/models.py:223 order/models.py:461 msgid "Target completion date" msgstr "" -#: build/models.py:227 order/models.py:218 +#: build/models.py:227 order/models.py:218 templates/js/build.js:788 msgid "Completion Date" msgstr "" @@ -642,7 +655,7 @@ msgstr "" msgid "User who issued this build order" msgstr "" -#: build/models.py:250 build/templates/build/build_base.html:142 +#: build/models.py:250 build/templates/build/build_base.html:174 #: build/templates/build/detail.html:105 order/models.py:119 #: order/templates/order/order_base.html:138 #: order/templates/order/sales_order_base.html:138 part/models.py:886 @@ -655,33 +668,35 @@ msgid "User responsible for this build order" msgstr "" #: build/models.py:256 build/templates/build/detail.html:91 -#: company/templates/company/supplier_part_base.html:77 +#: company/templates/company/manufacturer_part_base.html:79 +#: company/templates/company/manufacturer_part_detail.html:28 +#: company/templates/company/supplier_part_base.html:78 #: company/templates/company/supplier_part_detail.html:28 -#: part/templates/part/detail.html:83 part/templates/part/part_base.html:100 -#: stock/models.py:424 stock/templates/stock/item_base.html:330 +#: part/templates/part/detail.html:83 part/templates/part/part_base.html:101 +#: stock/models.py:426 stock/templates/stock/item_base.html:334 msgid "External Link" msgstr "" -#: build/models.py:257 part/models.py:744 stock/models.py:426 +#: build/models.py:257 part/models.py:744 stock/models.py:428 msgid "Link to external URL" msgstr "" -#: build/models.py:261 build/templates/build/navbar.html:59 -#: company/models.py:133 company/models.py:372 -#: company/templates/company/navbar.html:59 -#: company/templates/company/navbar.html:62 order/models.py:123 -#: order/models.py:597 order/templates/order/po_navbar.html:29 +#: build/models.py:261 build/templates/build/navbar.html:53 +#: company/models.py:135 company/models.py:501 +#: company/templates/company/navbar.html:70 +#: company/templates/company/navbar.html:73 order/models.py:123 +#: order/models.py:607 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:227 +#: order/templates/order/purchase_order_detail.html:209 #: order/templates/order/sales_order_detail.html:264 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 -#: part/templates/part/navbar.html:122 +#: part/templates/part/navbar.html:128 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:496 stock/models.py:1555 stock/models.py:1665 +#: stock/models.py:498 stock/models.py:1558 stock/models.py:1668 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:329 templates/js/stock.js:128 templates/js/stock.js:671 +#: templates/js/bom.js:333 templates/js/stock.js:128 templates/js/stock.js:671 msgid "Notes" msgstr "" @@ -689,141 +704,152 @@ msgstr "" msgid "Extra build notes" msgstr "" -#: build/models.py:673 +#: build/models.py:739 msgid "No build output specified" msgstr "" -#: build/models.py:676 +#: build/models.py:742 msgid "Build output is already completed" msgstr "" -#: build/models.py:679 +#: build/models.py:745 msgid "Build output does not match Build Order" msgstr "" -#: build/models.py:754 +#: build/models.py:838 msgid "Completed build output" msgstr "" -#: build/models.py:996 +#: build/models.py:1132 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1018 -msgid "Build item must specify a build output" +#: build/models.py:1157 +msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "" -#: build/models.py:1023 +#: build/models.py:1161 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1027 +#: build/models.py:1165 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1034 order/models.py:758 +#: build/models.py:1172 order/models.py:768 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1038 order/models.py:761 +#: build/models.py:1176 order/models.py:771 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1042 +#: build/models.py:1180 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1082 stock/templates/stock/item_base.html:302 -#: templates/InvenTree/search.html:167 templates/js/build.js:655 +#: build/models.py:1220 stock/templates/stock/item_base.html:306 +#: templates/InvenTree/search.html:183 templates/js/build.js:714 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1083 +#: build/models.py:1221 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1090 part/templates/part/allocation.html:18 +#: build/models.py:1228 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 #: stock/templates/stock/item_base.html:8 -#: stock/templates/stock/item_base.html:89 -#: stock/templates/stock/item_base.html:324 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771 -#: templates/js/stock.js:927 templates/js/stock.js:1185 +#: stock/templates/stock/item_base.html:93 +#: stock/templates/stock/item_base.html:328 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:831 +#: templates/js/stock.js:1004 templates/js/stock.js:1262 msgid "Stock Item" msgstr "" -#: build/models.py:1091 +#: build/models.py:1229 msgid "Source stock item" msgstr "" -#: build/models.py:1104 +#: build/models.py:1242 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1112 +#: build/models.py:1250 msgid "Install into" msgstr "" -#: build/models.py:1113 +#: build/models.py:1251 msgid "Destination stock item" msgstr "" +#: build/templates/build/allocate.html:7 +msgid "Allocate Parts" +msgstr "" + #: build/templates/build/allocate.html:15 -msgid "Incomplete Build Ouputs" +msgid "Allocate Stock to Build" msgstr "" -#: build/templates/build/allocate.html:21 -msgid "Build order has been completed" +#: build/templates/build/allocate.html:22 +msgid "Allocate stock to build" msgstr "" -#: build/templates/build/allocate.html:26 -msgid "Create new build output" +#: build/templates/build/allocate.html:23 +msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:27 -msgid "Create New Output" +#: build/templates/build/allocate.html:25 templates/js/build.js:646 +msgid "Unallocate stock" msgstr "" -#: build/templates/build/allocate.html:30 +#: build/templates/build/allocate.html:26 build/views.py:319 build/views.py:805 +msgid "Unallocate Stock" +msgstr "" + +#: build/templates/build/allocate.html:29 msgid "Order required parts" msgstr "" -#: build/templates/build/allocate.html:31 -#: company/templates/company/detail_part.html:31 order/views.py:794 +#: build/templates/build/allocate.html:30 +#: company/templates/company/detail_manufacturer_part.html:33 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:795 #: part/templates/part/category.html:127 msgid "Order Parts" msgstr "" -#: build/templates/build/allocate.html:34 templates/js/build.js:590 -msgid "Unallocate stock" +#: build/templates/build/allocate.html:36 +msgid "Untracked stock has been fully allocated for this Build Order" msgstr "" -#: build/templates/build/allocate.html:35 build/views.py:338 build/views.py:784 -msgid "Unallocate Stock" +#: build/templates/build/allocate.html:40 +msgid "Untracked stock has not been fully allocated for this Build Order" msgstr "" -#: build/templates/build/allocate.html:49 -msgid "Create a new build output" +#: build/templates/build/allocate.html:47 +msgid "This Build Order does not have any associated untracked BOM items" msgstr "" -#: build/templates/build/allocate.html:50 -msgid "No incomplete build outputs remain." -msgstr "" - -#: build/templates/build/allocate.html:51 -msgid "Create a new build output using the button above" +#: build/templates/build/allocation_card.html:21 +#: build/templates/build/complete_output.html:46 +#: order/templates/order/sales_order_detail.html:75 +#: order/templates/order/sales_order_detail.html:157 +#: report/templates/report/inventree_test_report_base.html:75 +#: stock/models.py:420 stock/templates/stock/item_base.html:238 +#: templates/js/build.js:474 +msgid "Serial Number" msgstr "" #: build/templates/build/attachments.html:12 -#: build/templates/build/navbar.html:49 build/templates/build/navbar.html:52 +#: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 #: order/templates/order/po_navbar.html:26 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:113 -#: part/templates/part/navbar.html:116 stock/templates/stock/navbar.html:47 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:119 +#: part/templates/part/navbar.html:122 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "" @@ -833,8 +859,7 @@ msgid "Automatically Allocate Stock" msgstr "" #: build/templates/build/auto_allocate.html:10 -msgid "" -"The following stock items will be allocated to the specified build output" +msgid "The following stock items will be allocated to the specified build output" msgstr "" #: build/templates/build/auto_allocate.html:37 @@ -845,112 +870,153 @@ msgstr "" msgid "Stock items will have to be manually allocated" msgstr "" -#: build/templates/build/build_base.html:14 -msgid "This Build Order is allocated to Sales Order" +#: build/templates/build/build_base.html:16 +#, python-format +msgid "This Build Order is allocated to Sales Order %(link)s" msgstr "" -#: build/templates/build/build_base.html:19 -msgid "This Build Order is a child of Build Order" +#: build/templates/build/build_base.html:22 +#, python-format +msgid "This Build Order is a child of Build Order %(link)s" msgstr "" -#: build/templates/build/build_base.html:37 +#: build/templates/build/build_base.html:31 +msgid "Build Order is ready to mark as completed" +msgstr "" + +#: build/templates/build/build_base.html:36 +msgid "Build Order cannot be completed as outstanding outputs remain" +msgstr "" + +#: build/templates/build/build_base.html:41 +msgid "Required build quantity has not yet been completed" +msgstr "" + +#: build/templates/build/build_base.html:46 +msgid "Stock has not been fully allocated to this Build Order" +msgstr "" + +#: build/templates/build/build_base.html:65 #: company/templates/company/company_base.html:40 -#: company/templates/company/supplier_part_base.html:25 +#: company/templates/company/manufacturer_part_base.html:25 +#: company/templates/company/supplier_part_base.html:26 #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:35 -#: part/templates/part/category.html:14 part/templates/part/part_base.html:28 -#: stock/templates/stock/item_base.html:114 -#: stock/templates/stock/location.html:24 +#: part/templates/part/category.html:18 part/templates/part/part_base.html:29 +#: stock/templates/stock/item_base.html:118 +#: stock/templates/stock/location.html:31 msgid "Admin view" msgstr "" -#: build/templates/build/build_base.html:43 -#: build/templates/build/build_base.html:108 +#: build/templates/build/build_base.html:71 +#: build/templates/build/build_base.html:140 #: order/templates/order/order_base.html:32 #: order/templates/order/order_base.html:86 #: order/templates/order/sales_order_base.html:41 #: order/templates/order/sales_order_base.html:86 -#: templates/js/table_filters.js:218 templates/js/table_filters.js:237 -#: templates/js/table_filters.js:254 +#: templates/js/table_filters.js:240 templates/js/table_filters.js:259 +#: templates/js/table_filters.js:276 msgid "Overdue" msgstr "" -#: build/templates/build/build_base.html:52 +#: build/templates/build/build_base.html:80 msgid "Print actions" msgstr "" -#: build/templates/build/build_base.html:56 +#: build/templates/build/build_base.html:84 msgid "Print Build Order" msgstr "" -#: build/templates/build/build_base.html:62 -msgid "Build actions" -msgstr "" - -#: build/templates/build/build_base.html:66 -msgid "Edit Build" -msgstr "" - -#: build/templates/build/build_base.html:68 -#: build/templates/build/build_base.html:176 +#: build/templates/build/build_base.html:90 +#: build/templates/build/build_base.html:215 msgid "Complete Build" msgstr "" -#: build/templates/build/build_base.html:69 -#: build/templates/build/build_base.html:167 build/views.py:57 +#: build/templates/build/build_base.html:95 +msgid "Build actions" +msgstr "" + +#: build/templates/build/build_base.html:99 +msgid "Edit Build" +msgstr "" + +#: build/templates/build/build_base.html:101 +#: build/templates/build/build_base.html:199 build/views.py:57 msgid "Cancel Build" msgstr "" -#: build/templates/build/build_base.html:82 +#: build/templates/build/build_base.html:114 #: build/templates/build/detail.html:11 msgid "Build Details" msgstr "" -#: build/templates/build/build_base.html:96 -#: build/templates/build/detail.html:59 order/models.py:445 -#: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:376 templates/InvenTree/search.html:236 -#: templates/js/barcode.js:119 templates/js/build.js:710 -#: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:628 templates/js/stock.js:1202 -msgid "Status" +#: build/templates/build/build_base.html:140 +#, python-format +msgid "This build was due on %(target)s" msgstr "" -#: build/templates/build/build_base.html:108 -msgid "This build was due on" -msgstr "" - -#: build/templates/build/build_base.html:115 +#: build/templates/build/build_base.html:147 #: build/templates/build/detail.html:64 msgid "Progress" msgstr "" -#: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:84 order/models.py:667 +#: build/templates/build/build_base.html:160 +#: build/templates/build/detail.html:84 order/models.py:677 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:33 #: order/templates/order/sales_order_ship.html:25 #: part/templates/part/allocation.html:30 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 -#: stock/templates/stock/item_base.html:264 templates/js/order.js:245 +#: stock/templates/stock/item_base.html:268 templates/js/order.js:245 msgid "Sales Order" msgstr "" -#: build/templates/build/build_base.html:135 +#: build/templates/build/build_base.html:167 #: build/templates/build/detail.html:98 #: report/templates/report/inventree_build_order_base.html:153 msgid "Issued By" msgstr "" +#: build/templates/build/build_base.html:207 +msgid "Incomplete Outputs" +msgstr "" + +#: build/templates/build/build_base.html:208 +msgid "Build Order cannot be completed as incomplete build outputs remain" +msgstr "" + #: build/templates/build/build_children.html:10 -#: build/templates/build/navbar.html:42 +#: build/templates/build/navbar.html:36 msgid "Child Build Orders" msgstr "" -#: build/templates/build/build_output.html:10 -#: build/templates/build/navbar.html:35 build/templates/build/navbar.html:38 -msgid "Build Outputs" +#: build/templates/build/build_output.html:15 +msgid "Incomplete Build Outputs" +msgstr "" + +#: build/templates/build/build_output.html:22 +msgid "Create new build output" +msgstr "" + +#: build/templates/build/build_output.html:23 +msgid "Create New Output" +msgstr "" + +#: build/templates/build/build_output.html:36 +msgid "Create a new build output" +msgstr "" + +#: build/templates/build/build_output.html:37 +msgid "No incomplete build outputs remain." +msgstr "" + +#: build/templates/build/build_output.html:38 +msgid "Create a new build output using the button above" +msgstr "" + +#: build/templates/build/build_output.html:49 +msgid "Completed Build Outputs" msgstr "" #: build/templates/build/build_output_create.html:7 @@ -978,11 +1044,11 @@ msgid "Are you sure you wish to cancel this build?" msgstr "" #: build/templates/build/complete.html:8 -msgid "Build can be completed" +msgid "Build Order is complete" msgstr "" #: build/templates/build/complete.html:12 -msgid "Build cannot be completed" +msgid "Build Order is incomplete" msgstr "" #: build/templates/build/complete.html:15 @@ -993,19 +1059,23 @@ msgstr "" msgid "Required build quantity has not been completed" msgstr "" -#: build/templates/build/complete_output.html:9 -msgid "Stock allocation is complete" +#: build/templates/build/complete.html:21 +msgid "Required stock has not been fully allocated" msgstr "" -#: build/templates/build/complete_output.html:13 +#: build/templates/build/complete_output.html:10 +msgid "Stock allocation is complete for this output" +msgstr "" + +#: build/templates/build/complete_output.html:14 msgid "Stock allocation is incomplete" msgstr "" -#: build/templates/build/complete_output.html:19 -msgid "parts have not been fully allocated" +#: build/templates/build/complete_output.html:20 +msgid "tracked parts have not been fully allocated" msgstr "" -#: build/templates/build/complete_output.html:40 +#: build/templates/build/complete_output.html:41 msgid "The following items will be created" msgstr "" @@ -1014,11 +1084,13 @@ msgid "Select a stock item to allocate to the selected build output" msgstr "" #: build/templates/build/create_build_item.html:11 -msgid "The allocated stock will be installed into the following build output:" +#, python-format +msgid "The allocated stock will be installed into the following build output:
%(output)s" msgstr "" -#: build/templates/build/create_build_item.html:19 -msgid "No stock available for" +#: build/templates/build/create_build_item.html:17 +#, python-format +msgid "No stock available for %(part)s" msgstr "" #: build/templates/build/delete_build_item.html:8 @@ -1046,15 +1118,15 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:288 templates/js/stock.js:636 -#: templates/js/stock.js:1209 templates/js/table_filters.js:85 -#: templates/js/table_filters.js:179 +#: stock/templates/stock/item_base.html:292 templates/js/stock.js:636 +#: templates/js/stock.js:1286 templates/js/table_filters.js:107 +#: templates/js/table_filters.js:201 msgid "Batch" msgstr "" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:111 templates/js/build.js:718 +#: order/templates/order/sales_order_base.html:111 templates/js/build.js:778 msgid "Created" msgstr "" @@ -1062,8 +1134,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:696 -#: templates/js/build.js:728 +#: build/templates/build/detail.html:132 templates/js/build.js:756 msgid "Completed" msgstr "" @@ -1075,7 +1146,7 @@ msgstr "" msgid "Alter the quantity of stock allocated to the build output" msgstr "" -#: build/templates/build/index.html:28 build/views.py:657 +#: build/templates/build/index.html:28 build/views.py:678 msgid "New Build Order" msgstr "" @@ -1106,20 +1177,20 @@ msgstr "" msgid "Details" msgstr "" -#: build/templates/build/navbar.html:20 build/templates/build/navbar.html:23 -#: build/templates/build/parts.html:11 -msgid "Required Parts" +#: build/templates/build/navbar.html:21 build/templates/build/navbar.html:24 +#: build/views.py:91 +msgid "Allocate Stock" msgstr "" -#: build/templates/build/navbar.html:27 build/templates/build/navbar.html:30 -msgid "In Progress" +#: build/templates/build/navbar.html:29 build/templates/build/navbar.html:32 +msgid "Build Outputs" msgstr "" -#: build/templates/build/navbar.html:45 +#: build/templates/build/navbar.html:39 msgid "Child Builds" msgstr "" -#: build/templates/build/navbar.html:56 +#: build/templates/build/navbar.html:50 msgid "Build Order Notes" msgstr "" @@ -1137,7 +1208,7 @@ msgstr "" #: build/templates/build/notes.html:26 company/templates/company/notes.html:24 #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 -#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:454 +#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:470 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "" @@ -1154,149 +1225,153 @@ msgstr "" msgid "Build was cancelled" msgstr "" -#: build/views.py:91 -msgid "Allocate Stock" -msgstr "" - -#: build/views.py:154 build/views.py:314 build/views.py:485 -msgid "Build output must be specified" -msgstr "" - -#: build/views.py:168 +#: build/views.py:138 msgid "Allocated stock to build output" msgstr "" -#: build/views.py:180 +#: build/views.py:150 msgid "Create Build Output" msgstr "" -#: build/views.py:203 stock/models.py:966 stock/views.py:1789 +#: build/views.py:168 +msgid "Maximum output quantity is " +msgstr "" + +#: build/views.py:184 stock/models.py:969 stock/views.py:1789 msgid "Serial numbers already exist" msgstr "" -#: build/views.py:212 +#: build/views.py:193 msgid "Serial numbers required for trackable build output" msgstr "" -#: build/views.py:278 +#: build/views.py:259 msgid "Delete Build Output" msgstr "" -#: build/views.py:299 build/views.py:383 +#: build/views.py:280 build/views.py:370 msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:300 build/views.py:384 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:425 msgid "Check the confirmation box" msgstr "" -#: build/views.py:312 +#: build/views.py:293 msgid "Build output does not match build" msgstr "" -#: build/views.py:326 +#: build/views.py:295 build/views.py:496 +msgid "Build output must be specified" +msgstr "" + +#: build/views.py:307 msgid "Build output deleted" msgstr "" -#: build/views.py:408 +#: build/views.py:405 msgid "Complete Build Order" msgstr "" -#: build/views.py:414 -msgid "Build order cannot be completed" +#: build/views.py:411 +msgid "Build order cannot be completed - incomplete outputs remain" msgstr "" -#: build/views.py:425 +#: build/views.py:422 msgid "Completed build order" msgstr "" -#: build/views.py:441 +#: build/views.py:438 msgid "Complete Build Output" msgstr "" -#: build/views.py:476 +#: build/views.py:480 +msgid "Invalid stock status value selected" +msgstr "" + +#: build/views.py:487 msgid "Quantity to complete cannot exceed build output quantity" msgstr "" -#: build/views.py:482 +#: build/views.py:493 msgid "Confirm completion of incomplete build" msgstr "" -#: build/views.py:573 +#: build/views.py:592 msgid "Build output completed" msgstr "" -#: build/views.py:711 +#: build/views.py:732 msgid "Created new build" msgstr "" -#: build/views.py:732 +#: build/views.py:753 msgid "Edit Build Order Details" msgstr "" -#: build/views.py:765 +#: build/views.py:786 msgid "Edited build" msgstr "" -#: build/views.py:774 +#: build/views.py:795 msgid "Delete Build Order" msgstr "" -#: build/views.py:789 +#: build/views.py:810 msgid "Removed parts from build allocation" msgstr "" -#: build/views.py:801 +#: build/views.py:822 msgid "Allocate stock to build output" msgstr "" -#: build/views.py:844 +#: build/views.py:865 msgid "Item must be currently in stock" msgstr "" -#: build/views.py:850 +#: build/views.py:871 msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:851 templates/js/bom.js:230 templates/js/build.js:519 -#: templates/js/build.js:778 templates/js/build.js:961 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:575 +#: templates/js/build.js:838 templates/js/build.js:1021 msgid "Available" msgstr "" -#: build/views.py:853 +#: build/views.py:874 msgid "Stock item must be selected" msgstr "" -#: build/views.py:1016 +#: build/views.py:1037 msgid "Edit Stock Allocation" msgstr "" -#: build/views.py:1020 +#: build/views.py:1041 msgid "Updated Build Item" msgstr "" -#: build/views.py:1049 +#: build/views.py:1070 msgid "Add Build Order Attachment" msgstr "" -#: build/views.py:1062 order/views.py:110 order/views.py:162 part/views.py:172 +#: build/views.py:1083 order/views.py:110 order/views.py:162 part/views.py:172 #: stock/views.py:277 msgid "Added attachment" msgstr "" -#: build/views.py:1098 order/views.py:189 order/views.py:210 +#: build/views.py:1119 order/views.py:189 order/views.py:210 msgid "Edit Attachment" msgstr "" -#: build/views.py:1108 order/views.py:193 order/views.py:214 +#: build/views.py:1129 order/views.py:193 order/views.py:214 msgid "Attachment updated" msgstr "" -#: build/views.py:1118 order/views.py:229 order/views.py:243 +#: build/views.py:1139 order/views.py:229 order/views.py:243 msgid "Delete Attachment" msgstr "" -#: build/views.py:1123 order/views.py:235 order/views.py:249 stock/views.py:333 +#: build/views.py:1144 order/views.py:235 order/views.py:249 stock/views.py:333 msgid "Deleted attachment" msgstr "" @@ -1308,335 +1383,343 @@ msgstr "" msgid "String descriptor for the server instance" msgstr "" -#: common/models.py:62 company/models.py:95 company/models.py:96 -msgid "Company name" +#: common/models.py:62 +msgid "Use instance name" msgstr "" #: common/models.py:63 +msgid "Use the instance name in the title-bar" +msgstr "" + +#: common/models.py:69 company/models.py:97 company/models.py:98 +msgid "Company name" +msgstr "" + +#: common/models.py:70 msgid "Internal company name" msgstr "" -#: common/models.py:68 +#: common/models.py:75 msgid "Base URL" msgstr "" -#: common/models.py:69 +#: common/models.py:76 msgid "Base URL for server instance" msgstr "" -#: common/models.py:75 +#: common/models.py:82 msgid "Default Currency" msgstr "" -#: common/models.py:76 +#: common/models.py:83 msgid "Default currency" msgstr "" -#: common/models.py:82 +#: common/models.py:89 msgid "Download from URL" msgstr "" -#: common/models.py:83 +#: common/models.py:90 msgid "Allow download of remote images and files from external URL" msgstr "" -#: common/models.py:89 +#: common/models.py:96 msgid "Barcode Support" msgstr "" -#: common/models.py:90 +#: common/models.py:97 msgid "Enable barcode scanner support" msgstr "" -#: common/models.py:96 +#: common/models.py:103 msgid "IPN Regex" msgstr "" -#: common/models.py:97 +#: common/models.py:104 msgid "Regular expression pattern for matching Part IPN" msgstr "" -#: common/models.py:101 +#: common/models.py:108 msgid "Allow Duplicate IPN" msgstr "" -#: common/models.py:102 +#: common/models.py:109 msgid "Allow multiple parts to share the same IPN" msgstr "" -#: common/models.py:108 +#: common/models.py:115 msgid "Allow Editing IPN" msgstr "" -#: common/models.py:109 +#: common/models.py:116 msgid "Allow changing the IPN value while editing a part" msgstr "" -#: common/models.py:115 +#: common/models.py:122 msgid "Copy Part BOM Data" msgstr "" -#: common/models.py:116 +#: common/models.py:123 msgid "Copy BOM data by default when duplicating a part" msgstr "" -#: common/models.py:122 +#: common/models.py:129 msgid "Copy Part Parameter Data" msgstr "" -#: common/models.py:123 +#: common/models.py:130 msgid "Copy parameter data by default when duplicating a part" msgstr "" -#: common/models.py:129 +#: common/models.py:136 msgid "Copy Part Test Data" msgstr "" -#: common/models.py:130 +#: common/models.py:137 msgid "Copy test data by default when duplicating a part" msgstr "" -#: common/models.py:136 +#: common/models.py:143 msgid "Copy Category Parameter Templates" msgstr "" -#: common/models.py:137 +#: common/models.py:144 msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:143 +#: common/models.py:150 msgid "Recent Part Count" msgstr "" -#: common/models.py:144 +#: common/models.py:151 msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:150 part/models.py:2059 part/templates/part/detail.html:160 +#: common/models.py:157 part/models.py:2079 part/templates/part/detail.html:160 #: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:24 -#: templates/js/table_filters.js:288 +#: templates/js/table_filters.js:310 msgid "Template" msgstr "" -#: common/models.py:151 +#: common/models.py:158 msgid "Parts are templates by default" msgstr "" -#: common/models.py:157 part/models.py:834 part/templates/part/detail.html:170 -#: templates/js/table_filters.js:101 templates/js/table_filters.js:300 +#: common/models.py:164 part/models.py:834 part/templates/part/detail.html:170 +#: templates/js/table_filters.js:123 templates/js/table_filters.js:322 msgid "Assembly" msgstr "" -#: common/models.py:158 +#: common/models.py:165 msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:164 part/models.py:840 part/templates/part/detail.html:180 -#: templates/js/table_filters.js:304 +#: common/models.py:171 part/models.py:840 part/templates/part/detail.html:180 +#: templates/js/table_filters.js:326 msgid "Component" msgstr "" -#: common/models.py:165 +#: common/models.py:172 msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:171 part/models.py:851 part/templates/part/detail.html:200 +#: common/models.py:178 part/models.py:851 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" -#: common/models.py:172 +#: common/models.py:179 msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:178 part/models.py:856 part/templates/part/detail.html:210 -#: templates/js/table_filters.js:312 +#: common/models.py:185 part/models.py:856 part/templates/part/detail.html:210 +#: templates/js/table_filters.js:334 msgid "Salable" msgstr "" -#: common/models.py:179 +#: common/models.py:186 msgid "Parts are salable by default" msgstr "" -#: common/models.py:185 part/models.py:846 part/templates/part/detail.html:190 -#: templates/js/table_filters.js:32 templates/js/table_filters.js:316 +#: common/models.py:192 part/models.py:846 part/templates/part/detail.html:190 +#: templates/js/table_filters.js:32 templates/js/table_filters.js:338 msgid "Trackable" msgstr "" -#: common/models.py:186 +#: common/models.py:193 msgid "Parts are trackable by default" msgstr "" -#: common/models.py:192 part/models.py:866 part/templates/part/detail.html:150 +#: common/models.py:199 part/models.py:866 part/templates/part/detail.html:150 #: templates/js/table_filters.js:28 msgid "Virtual" msgstr "" -#: common/models.py:193 +#: common/models.py:200 msgid "Parts are virtual by default" msgstr "" -#: common/models.py:199 +#: common/models.py:206 msgid "Show Quantity in Forms" msgstr "" -#: common/models.py:200 +#: common/models.py:207 msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:206 +#: common/models.py:213 msgid "Debug Mode" msgstr "" -#: common/models.py:207 +#: common/models.py:214 msgid "Generate reports in debug mode (HTML output)" msgstr "" -#: common/models.py:213 +#: common/models.py:220 msgid "Page Size" msgstr "" -#: common/models.py:214 +#: common/models.py:221 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:224 +#: common/models.py:231 msgid "Test Reports" msgstr "" -#: common/models.py:225 +#: common/models.py:232 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:231 +#: common/models.py:238 msgid "Stock Expiry" msgstr "" -#: common/models.py:232 +#: common/models.py:239 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:238 +#: common/models.py:245 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:239 +#: common/models.py:246 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:245 +#: common/models.py:252 msgid "Stock Stale Time" msgstr "" -#: common/models.py:246 +#: common/models.py:253 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:248 part/templates/part/detail.html:121 +#: common/models.py:255 part/templates/part/detail.html:121 msgid "days" msgstr "" -#: common/models.py:253 +#: common/models.py:260 msgid "Build Expired Stock" msgstr "" -#: common/models.py:254 +#: common/models.py:261 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:260 +#: common/models.py:267 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:261 +#: common/models.py:268 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:267 +#: common/models.py:274 msgid "Group by Part" msgstr "" -#: common/models.py:268 +#: common/models.py:275 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:274 +#: common/models.py:281 msgid "Recent Stock Count" msgstr "" -#: common/models.py:275 +#: common/models.py:282 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:281 +#: common/models.py:288 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:282 +#: common/models.py:289 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:287 +#: common/models.py:294 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:288 +#: common/models.py:295 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:292 +#: common/models.py:299 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:293 +#: common/models.py:300 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:298 +#: common/models.py:305 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:299 +#: common/models.py:306 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:522 +#: common/models.py:529 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:524 +#: common/models.py:531 msgid "Settings value" msgstr "" -#: common/models.py:559 +#: common/models.py:566 msgid "Must be an integer value" msgstr "" -#: common/models.py:582 +#: common/models.py:589 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:593 +#: common/models.py:600 msgid "Value must be an integer value" msgstr "" -#: common/models.py:616 +#: common/models.py:623 msgid "Key string must be unique" msgstr "" -#: common/models.py:697 company/forms.py:132 +#: common/models.py:704 company/forms.py:177 msgid "Price break quantity" msgstr "" -#: common/models.py:705 company/templates/company/supplier_part_pricing.html:82 +#: common/models.py:712 company/templates/company/supplier_part_pricing.html:82 #: part/templates/part/sale_prices.html:90 templates/js/bom.js:255 msgid "Price" msgstr "" -#: common/models.py:706 +#: common/models.py:713 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:729 +#: common/models.py:736 msgid "Default" msgstr "" @@ -1656,224 +1739,253 @@ msgstr "" msgid "Supplied value must be a boolean" msgstr "" -#: company/forms.py:37 company/models.py:143 -#: company/templates/company/detail.html:40 +#: company/forms.py:38 company/models.py:145 +#: company/templates/company/detail.html:42 msgid "Currency" msgstr "" -#: company/forms.py:38 company/models.py:145 +#: company/forms.py:39 company/models.py:147 msgid "Default currency used for this company" msgstr "" -#: company/forms.py:76 part/forms.py:46 +#: company/forms.py:77 part/forms.py:46 msgid "URL" msgstr "" -#: company/forms.py:77 part/forms.py:47 +#: company/forms.py:78 part/forms.py:47 msgid "Image URL" msgstr "" -#: company/forms.py:99 +#: company/forms.py:118 msgid "Single Price" msgstr "" -#: company/forms.py:101 +#: company/forms.py:120 msgid "Single quantity price" msgstr "" -#: company/models.py:100 -msgid "Company description" -msgstr "" - -#: company/models.py:101 -msgid "Description of the company" -msgstr "" - -#: company/models.py:105 company/templates/company/company_base.html:70 -#: company/templates/company/detail.html:31 templates/js/company.js:60 -msgid "Website" -msgstr "" - -#: company/models.py:105 -msgid "Company website URL" -msgstr "" - -#: company/models.py:108 company/templates/company/company_base.html:77 -msgid "Address" -msgstr "" - -#: company/models.py:109 -msgid "Company address" -msgstr "" - -#: company/models.py:112 -msgid "Phone number" -msgstr "" - -#: company/models.py:113 -msgid "Contact phone number" -msgstr "" - -#: company/models.py:116 company/templates/company/company_base.html:91 -msgid "Email" -msgstr "" - -#: company/models.py:116 -msgid "Contact email address" -msgstr "" - -#: company/models.py:119 company/templates/company/company_base.html:98 -msgid "Contact" -msgstr "" - -#: company/models.py:120 -msgid "Point of contact" -msgstr "" - -#: company/models.py:122 company/models.py:359 order/models.py:103 -#: part/models.py:743 -#: report/templates/report/inventree_build_order_base.html:165 -#: stock/models.py:1557 templates/js/company.js:208 templates/js/part.js:430 -msgid "Link" -msgstr "" - -#: company/models.py:122 -msgid "Link to external company information" -msgstr "" - -#: company/models.py:130 part/models.py:753 -msgid "Image" -msgstr "" - -#: company/models.py:135 -msgid "is customer" -msgstr "" - -#: company/models.py:135 -msgid "Do you sell items to this company?" -msgstr "" - -#: company/models.py:137 -msgid "is supplier" -msgstr "" - -#: company/models.py:137 -msgid "Do you purchase items from this company?" -msgstr "" - -#: company/models.py:139 -msgid "is manufacturer" -msgstr "" - -#: company/models.py:139 -msgid "Does this company manufacture parts?" -msgstr "" - -#: company/models.py:319 stock/models.py:371 -#: stock/templates/stock/item_base.html:220 -msgid "Base Part" -msgstr "" - -#: company/models.py:323 order/views.py:1372 -msgid "Select part" -msgstr "" - -#: company/models.py:329 company/templates/company/detail.html:60 -#: company/templates/company/supplier_part_base.html:83 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:190 -#: order/templates/order/order_base.html:92 -#: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170 -#: stock/templates/stock/item_base.html:337 templates/js/company.js:48 -#: templates/js/company.js:164 templates/js/order.js:170 -msgid "Supplier" -msgstr "" - -#: company/models.py:330 -msgid "Select supplier" -msgstr "" - -#: company/models.py:335 company/templates/company/supplier_part_base.html:87 -#: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:174 part/bom.py:171 -msgid "SKU" -msgstr "" - -#: company/models.py:336 -msgid "Supplier stock keeping unit" -msgstr "" - -#: company/models.py:346 company/templates/company/detail.html:55 -#: company/templates/company/supplier_part_base.html:93 -#: company/templates/company/supplier_part_detail.html:34 part/bom.py:172 -#: templates/js/company.js:44 templates/js/company.js:188 -msgid "Manufacturer" -msgstr "" - -#: company/models.py:347 +#: company/forms.py:128 company/models.py:324 msgid "Select manufacturer" msgstr "" -#: company/models.py:353 company/templates/company/supplier_part_base.html:99 +#: company/forms.py:134 company/models.py:331 +msgid "Manufacturer Part Number" +msgstr "" + +#: company/forms.py:136 company/models.py:330 +#: company/templates/company/manufacturer_part_base.html:89 +#: company/templates/company/manufacturer_part_detail.html:26 +#: company/templates/company/supplier_part_base.html:101 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:183 part/bom.py:173 -#: templates/js/company.js:204 +#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 +#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" -#: company/models.py:354 -msgid "Manufacturer part number" +#: company/models.py:102 +msgid "Company description" msgstr "" -#: company/models.py:360 +#: company/models.py:103 +msgid "Description of the company" +msgstr "" + +#: company/models.py:107 company/templates/company/company_base.html:70 +#: company/templates/company/detail.html:33 templates/js/company.js:60 +msgid "Website" +msgstr "" + +#: company/models.py:107 +msgid "Company website URL" +msgstr "" + +#: company/models.py:110 company/templates/company/company_base.html:77 +msgid "Address" +msgstr "" + +#: company/models.py:111 +msgid "Company address" +msgstr "" + +#: company/models.py:114 +msgid "Phone number" +msgstr "" + +#: company/models.py:115 +msgid "Contact phone number" +msgstr "" + +#: company/models.py:118 company/templates/company/company_base.html:91 +msgid "Email" +msgstr "" + +#: company/models.py:118 +msgid "Contact email address" +msgstr "" + +#: company/models.py:121 company/templates/company/company_base.html:98 +msgid "Contact" +msgstr "" + +#: company/models.py:122 +msgid "Point of contact" +msgstr "" + +#: company/models.py:124 company/models.py:336 company/models.py:488 +#: order/models.py:103 part/models.py:743 +#: report/templates/report/inventree_build_order_base.html:165 +#: stock/models.py:1560 templates/js/company.js:188 templates/js/company.js:318 +#: templates/js/part.js:431 +msgid "Link" +msgstr "" + +#: company/models.py:124 +msgid "Link to external company information" +msgstr "" + +#: company/models.py:132 part/models.py:753 +msgid "Image" +msgstr "" + +#: company/models.py:137 +msgid "is customer" +msgstr "" + +#: company/models.py:137 +msgid "Do you sell items to this company?" +msgstr "" + +#: company/models.py:139 +msgid "is supplier" +msgstr "" + +#: company/models.py:139 +msgid "Do you purchase items from this company?" +msgstr "" + +#: company/models.py:141 +msgid "is manufacturer" +msgstr "" + +#: company/models.py:141 +msgid "Does this company manufacture parts?" +msgstr "" + +#: company/models.py:308 company/models.py:459 stock/models.py:373 +#: stock/templates/stock/item_base.html:224 +msgid "Base Part" +msgstr "" + +#: company/models.py:312 company/models.py:463 order/views.py:1384 +msgid "Select part" +msgstr "" + +#: company/models.py:323 company/templates/company/detail.html:57 +#: company/templates/company/manufacturer_part_base.html:85 +#: company/templates/company/manufacturer_part_detail.html:25 +#: company/templates/company/supplier_part_base.html:94 +#: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 +#: part/bom.py:241 stock/templates/stock/item_base.html:341 +#: templates/js/company.js:44 templates/js/company.js:165 +#: templates/js/company.js:289 +msgid "Manufacturer" +msgstr "" + +#: company/models.py:337 +msgid "URL for external manufacturer part link" +msgstr "" + +#: company/models.py:343 +msgid "Manufacturer part description" +msgstr "" + +#: company/models.py:469 company/templates/company/detail.html:62 +#: company/templates/company/supplier_part_base.html:84 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:190 +#: order/templates/order/order_base.html:92 +#: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 +#: part/bom.py:286 stock/templates/stock/item_base.html:353 +#: templates/js/company.js:48 templates/js/company.js:263 +#: templates/js/order.js:170 +msgid "Supplier" +msgstr "" + +#: company/models.py:470 +msgid "Select supplier" +msgstr "" + +#: company/models.py:475 company/templates/company/supplier_part_base.html:88 +#: company/templates/company/supplier_part_detail.html:26 +#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 +#: part/bom.py:287 +msgid "SKU" +msgstr "" + +#: company/models.py:476 +msgid "Supplier stock keeping unit" +msgstr "" + +#: company/models.py:482 +#: company/templates/company/manufacturer_part_base.html:6 +#: company/templates/company/manufacturer_part_base.html:19 +#: stock/templates/stock/item_base.html:346 +msgid "Manufacturer Part" +msgstr "" + +#: company/models.py:483 +msgid "Select manufacturer part" +msgstr "" + +#: company/models.py:489 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:366 +#: company/models.py:495 msgid "Supplier part description" msgstr "" -#: company/models.py:371 company/templates/company/supplier_part_base.html:113 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2170 +#: company/models.py:500 company/templates/company/supplier_part_base.html:115 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2190 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:375 +#: company/models.py:504 msgid "base cost" msgstr "" -#: company/models.py:375 +#: company/models.py:504 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:377 company/templates/company/supplier_part_base.html:106 -#: stock/models.py:395 stock/templates/stock/item_base.html:295 +#: company/models.py:506 company/templates/company/supplier_part_base.html:108 +#: stock/models.py:397 stock/templates/stock/item_base.html:299 #: templates/js/stock.js:667 msgid "Packaging" msgstr "" -#: company/models.py:377 +#: company/models.py:506 msgid "Part packaging" msgstr "" -#: company/models.py:379 +#: company/models.py:508 msgid "multiple" msgstr "" -#: company/models.py:379 +#: company/models.py:508 msgid "Order multiple" msgstr "" #: company/templates/company/assigned_stock.html:10 -#: company/templates/company/navbar.html:51 -#: company/templates/company/navbar.html:54 templates/js/build.js:411 +#: company/templates/company/navbar.html:62 +#: company/templates/company/navbar.html:65 templates/js/build.js:467 msgid "Assigned Stock" msgstr "" #: company/templates/company/company_base.html:9 #: company/templates/company/company_base.html:35 -#: templates/InvenTree/search.html:288 templates/js/company.js:33 +#: templates/InvenTree/search.html:304 templates/js/company.js:33 msgid "Company" msgstr "" @@ -1895,7 +2007,7 @@ msgstr "" msgid "Edit company information" msgstr "" -#: company/templates/company/company_base.html:56 company/views.py:324 +#: company/templates/company/company_base.html:56 company/views.py:326 msgid "Delete Company" msgstr "" @@ -1918,91 +2030,87 @@ msgstr "" #, python-format msgid "" "There are %(count)s parts sourced from this company.
\n" -"If this supplier is deleted, these supplier part entries will also be " -"deleted." +"If this supplier is deleted, these supplier part entries will also be deleted." msgstr "" #: company/templates/company/detail.html:21 msgid "Company Name" msgstr "" -#: company/templates/company/detail.html:34 +#: company/templates/company/detail.html:36 msgid "No website specified" msgstr "" -#: company/templates/company/detail.html:43 +#: company/templates/company/detail.html:45 msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:65 order/models.py:440 -#: order/templates/order/sales_order_base.html:92 stock/models.py:413 -#: stock/models.py:414 stock/templates/stock/item_base.html:247 +#: company/templates/company/detail.html:67 order/models.py:450 +#: order/templates/order/sales_order_base.html:92 stock/models.py:415 +#: stock/models.py:416 stock/templates/stock/item_base.html:251 #: templates/js/company.js:40 templates/js/order.js:267 msgid "Customer" msgstr "" -#: company/templates/company/detail_part.html:10 -#: templates/InvenTree/search.html:148 -msgid "Supplier Parts" +#: company/templates/company/detail_manufacturer_part.html:11 +#: templates/InvenTree/search.html:149 +msgid "Manufacturer Parts" msgstr "" -#: company/templates/company/detail_part.html:20 -#: order/templates/order/order_wizard/select_parts.html:42 -#: order/templates/order/purchase_order_detail.html:75 -msgid "Create new supplier part" +#: company/templates/company/detail_manufacturer_part.html:22 +msgid "Create new manufacturer part" msgstr "" -#: company/templates/company/detail_part.html:21 -#: order/templates/order/purchase_order_detail.html:74 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1086 -msgid "New Supplier Part" +#: company/templates/company/detail_manufacturer_part.html:23 +#: part/templates/part/manufacturer.html:19 +msgid "New Manufacturer Part" msgstr "" -#: company/templates/company/detail_part.html:26 -#: part/templates/part/category.html:122 part/templates/part/supplier.html:20 +#: company/templates/company/detail_manufacturer_part.html:28 +#: company/templates/company/detail_supplier_part.html:27 +#: company/templates/company/manufacturer_part_suppliers.html:20 +#: part/templates/part/category.html:122 +#: part/templates/part/manufacturer.html:22 +#: part/templates/part/supplier.html:20 msgid "Options" msgstr "" -#: company/templates/company/detail_part.html:31 +#: company/templates/company/detail_manufacturer_part.html:33 +#: company/templates/company/detail_supplier_part.html:32 #: part/templates/part/category.html:127 msgid "Order parts" msgstr "" -#: company/templates/company/detail_part.html:34 +#: company/templates/company/detail_manufacturer_part.html:36 +#: company/templates/company/detail_supplier_part.html:35 msgid "Delete parts" msgstr "" -#: company/templates/company/detail_part.html:34 +#: company/templates/company/detail_manufacturer_part.html:36 +#: company/templates/company/detail_supplier_part.html:35 msgid "Delete Parts" msgstr "" -#: company/templates/company/detail_part.html:66 +#: company/templates/company/detail_manufacturer_part.html:66 +#: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1080 +#: templates/js/stock.js:1157 msgid "New Part" msgstr "" -#: company/templates/company/detail_part.html:67 +#: company/templates/company/detail_manufacturer_part.html:67 +#: company/templates/company/detail_supplier_part.html:67 msgid "Create new Part" msgstr "" -#: company/templates/company/detail_part.html:72 company/views.py:62 -#: order/templates/order/purchase_orders.html:183 -#: part/templates/part/supplier.html:50 -msgid "New Supplier" -msgstr "" - -#: company/templates/company/detail_part.html:73 company/views.py:279 -#: order/templates/order/purchase_orders.html:184 -msgid "Create new Supplier" -msgstr "" - -#: company/templates/company/detail_part.html:78 company/views.py:69 +#: company/templates/company/detail_manufacturer_part.html:72 +#: company/views.py:71 part/templates/part/manufacturer.html:52 #: part/templates/part/supplier.html:56 msgid "New Manufacturer" msgstr "" -#: company/templates/company/detail_part.html:79 company/views.py:282 +#: company/templates/company/detail_manufacturer_part.html:73 +#: company/views.py:284 msgid "Create new Manufacturer" msgstr "" @@ -2017,68 +2125,172 @@ msgstr "" msgid "Export" msgstr "" -#: company/templates/company/index.html:7 +#: company/templates/company/detail_supplier_part.html:11 +#: company/templates/company/manufacturer_part_navbar.html:11 +#: company/templates/company/manufacturer_part_suppliers.html:10 +#: templates/InvenTree/search.html:164 +msgid "Supplier Parts" +msgstr "" + +#: company/templates/company/detail_supplier_part.html:21 +#: order/templates/order/order_wizard/select_parts.html:42 +#: order/templates/order/purchase_order_detail.html:50 +msgid "Create new supplier part" +msgstr "" + +#: company/templates/company/detail_supplier_part.html:22 +#: company/templates/company/manufacturer_part_suppliers.html:17 +#: order/templates/order/purchase_order_detail.html:49 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1163 +msgid "New Supplier Part" +msgstr "" + +#: company/templates/company/detail_supplier_part.html:72 +#: company/templates/company/manufacturer_part_suppliers.html:47 +#: company/views.py:64 order/templates/order/purchase_orders.html:183 +#: part/templates/part/supplier.html:50 +msgid "New Supplier" +msgstr "" + +#: company/templates/company/detail_supplier_part.html:73 company/views.py:281 +#: order/templates/order/purchase_orders.html:184 +msgid "Create new Supplier" +msgstr "" + +#: company/templates/company/index.html:8 msgid "Supplier List" msgstr "" -#: company/templates/company/navbar.html:20 -msgid "Supplied Parts" +#: company/templates/company/manufacturer_part_base.html:36 +#: company/templates/company/supplier_part_base.html:36 +#: company/templates/company/supplier_part_orders.html:17 +#: part/templates/part/orders.html:17 part/templates/part/part_base.html:65 +msgid "Order part" msgstr "" -#: company/templates/company/navbar.html:23 -#: order/templates/order/receive_parts.html:14 part/models.py:322 -#: part/templates/part/cat_link.html:7 part/templates/part/category.html:95 -#: part/templates/part/category_navbar.html:11 -#: part/templates/part/category_navbar.html:14 -#: part/templates/part/category_partlist.html:10 -#: templates/InvenTree/index.html:96 templates/InvenTree/search.html:113 -#: templates/InvenTree/settings/tabs.html:25 templates/navbar.html:23 -#: templates/stats.html:59 templates/stats.html:68 users/models.py:38 -msgid "Parts" +#: company/templates/company/manufacturer_part_base.html:41 +msgid "Edit manufacturer part" msgstr "" -#: company/templates/company/navbar.html:27 part/templates/part/navbar.html:33 -#: stock/templates/stock/location.html:100 -#: stock/templates/stock/location.html:115 templates/InvenTree/search.html:182 -#: templates/stats.html:72 templates/stats.html:81 users/models.py:40 -msgid "Stock Items" +#: company/templates/company/manufacturer_part_base.html:45 +msgid "Delete manufacturer part" msgstr "" -#: company/templates/company/navbar.html:30 -#: company/templates/company/part_navbar.html:14 -#: part/templates/part/navbar.html:36 stock/templates/stock/loc_link.html:7 -#: stock/templates/stock/location.html:29 -#: stock/templates/stock/stock_app_base.html:9 -#: templates/InvenTree/index.html:127 templates/InvenTree/search.html:180 -#: templates/InvenTree/search.html:216 -#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:172 -#: templates/js/part.js:397 templates/js/stock.js:563 templates/navbar.html:26 +#: company/templates/company/manufacturer_part_base.html:57 +#: company/templates/company/manufacturer_part_detail.html:10 +msgid "Manufacturer Part Details" +msgstr "" + +#: company/templates/company/manufacturer_part_base.html:62 +#: company/templates/company/manufacturer_part_detail.html:18 +#: company/templates/company/supplier_part_base.html:61 +#: company/templates/company/supplier_part_detail.html:18 +msgid "Internal Part" +msgstr "" + +#: company/templates/company/manufacturer_part_delete.html:6 +msgid "Are you sure you want to delete the following Manufacturer Parts?" +msgstr "" + +#: company/templates/company/manufacturer_part_delete.html:36 +#, python-format +msgid "There are %(count)s suppliers defined for this manufacturer part. If you delete it, the following supplier parts will also be deleted:" +msgstr "" + +#: company/templates/company/manufacturer_part_navbar.html:14 +#: company/views.py:63 part/templates/part/navbar.html:78 +#: part/templates/part/navbar.html:81 templates/InvenTree/search.html:316 +#: templates/navbar.html:35 +msgid "Suppliers" +msgstr "" + +#: company/templates/company/manufacturer_part_navbar.html:19 +msgid "Manufacturer Part Stock" +msgstr "" + +#: company/templates/company/manufacturer_part_navbar.html:22 +#: company/templates/company/navbar.html:41 +#: company/templates/company/supplier_part_navbar.html:15 +#: part/templates/part/navbar.html:36 stock/api.py:51 +#: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 +#: stock/templates/stock/stock_app_base.html:10 +#: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 +#: templates/InvenTree/search.html:232 +#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:173 +#: templates/js/part.js:398 templates/js/stock.js:563 templates/navbar.html:26 msgid "Stock" msgstr "" -#: company/templates/company/navbar.html:36 -#: company/templates/company/navbar.html:45 -#: company/templates/company/navbar.html:48 +#: company/templates/company/manufacturer_part_navbar.html:26 +msgid "Manufacturer Part Orders" +msgstr "" + +#: company/templates/company/manufacturer_part_navbar.html:29 +#: company/templates/company/supplier_part_navbar.html:22 +msgid "Orders" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:22 +#: part/templates/part/supplier.html:22 +msgid "Delete supplier parts" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:22 +#: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 +#: part/templates/part/related.html:44 part/templates/part/supplier.html:22 +#: stock/views.py:1002 users/models.py:187 +msgid "Delete" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:48 +#: part/templates/part/supplier.html:51 +msgid "Create new supplier" +msgstr "" + +#: company/templates/company/navbar.html:20 +#: company/templates/company/navbar.html:23 +msgid "Manufactured Parts" +msgstr "" + +#: company/templates/company/navbar.html:29 +#: company/templates/company/navbar.html:32 +msgid "Supplied Parts" +msgstr "" + +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:33 +#: stock/templates/stock/location.html:107 +#: stock/templates/stock/location.html:122 +#: stock/templates/stock/location.html:136 +#: stock/templates/stock/location_navbar.html:22 +#: stock/templates/stock/location_navbar.html:29 +#: templates/InvenTree/search.html:198 templates/js/stock.js:968 +#: templates/stats.html:72 templates/stats.html:81 users/models.py:42 +msgid "Stock Items" +msgstr "" + +#: company/templates/company/navbar.html:47 +#: company/templates/company/navbar.html:56 +#: company/templates/company/navbar.html:59 #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:227 -#: templates/InvenTree/search.html:330 +#: part/templates/part/navbar.html:98 part/templates/part/navbar.html:101 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 +#: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46 -#: users/models.py:43 +#: users/models.py:45 msgid "Sales Orders" msgstr "" -#: company/templates/company/navbar.html:39 +#: company/templates/company/navbar.html:50 #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:78 part/templates/part/navbar.html:81 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:204 -#: templates/InvenTree/search.html:300 +#: part/templates/part/navbar.html:84 part/templates/part/navbar.html:87 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 +#: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37 -#: users/models.py:42 +#: users/models.py:44 msgid "Purchase Orders" msgstr "" @@ -2086,32 +2298,6 @@ msgstr "" msgid "Company Notes" msgstr "" -#: company/templates/company/part_navbar.html:11 -#: company/templates/company/supplier_part_stock.html:10 -msgid "Supplier Part Stock" -msgstr "" - -#: company/templates/company/part_navbar.html:18 -#: company/templates/company/supplier_part_orders.html:10 -msgid "Supplier Part Orders" -msgstr "" - -#: company/templates/company/part_navbar.html:21 -msgid "Orders" -msgstr "" - -#: company/templates/company/part_navbar.html:25 -msgid "Supplier Part Pricing" -msgstr "" - -#: company/templates/company/part_navbar.html:28 -msgid "Pricing" -msgstr "" - -#: company/templates/company/partdelete.html:5 -msgid "Are you sure you want to delete the following Supplier Parts?" -msgstr "" - #: company/templates/company/purchase_orders.html:18 #: order/templates/order/purchase_orders.html:20 msgid "Create new purchase order" @@ -2132,34 +2318,45 @@ msgstr "" msgid "New Sales Order" msgstr "" -#: company/templates/company/supplier_part_base.html:6 -#: company/templates/company/supplier_part_base.html:19 stock/models.py:380 -#: stock/templates/stock/item_base.html:342 templates/js/company.js:180 +#: company/templates/company/supplier_part_base.html:7 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:382 +#: stock/templates/stock/item_base.html:358 templates/js/company.js:279 msgid "Supplier Part" msgstr "" -#: company/templates/company/supplier_part_base.html:35 -#: company/templates/company/supplier_part_orders.html:17 -#: part/templates/part/orders.html:17 part/templates/part/part_base.html:64 -msgid "Order part" -msgstr "" - -#: company/templates/company/supplier_part_base.html:39 +#: company/templates/company/supplier_part_base.html:40 msgid "Edit supplier part" msgstr "" -#: company/templates/company/supplier_part_base.html:43 +#: company/templates/company/supplier_part_base.html:44 msgid "Delete supplier part" msgstr "" -#: company/templates/company/supplier_part_base.html:55 +#: company/templates/company/supplier_part_base.html:56 #: company/templates/company/supplier_part_detail.html:10 msgid "Supplier Part Details" msgstr "" -#: company/templates/company/supplier_part_base.html:60 -#: company/templates/company/supplier_part_detail.html:18 -msgid "Internal Part" +#: company/templates/company/supplier_part_delete.html:5 +msgid "Are you sure you want to delete the following Supplier Parts?" +msgstr "" + +#: company/templates/company/supplier_part_navbar.html:12 +#: company/templates/company/supplier_part_stock.html:10 +msgid "Supplier Part Stock" +msgstr "" + +#: company/templates/company/supplier_part_navbar.html:19 +#: company/templates/company/supplier_part_orders.html:10 +msgid "Supplier Part Orders" +msgstr "" + +#: company/templates/company/supplier_part_navbar.html:26 +msgid "Supplier Part Pricing" +msgstr "" + +#: company/templates/company/supplier_part_navbar.html:29 +msgid "Pricing" msgstr "" #: company/templates/company/supplier_part_orders.html:18 @@ -2171,8 +2368,8 @@ msgstr "" msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:569 -#: part/templates/part/sale_prices.html:17 part/views.py:2618 +#: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 +#: part/templates/part/sale_prices.html:17 part/views.py:2636 msgid "Add Price Break" msgstr "" @@ -2191,99 +2388,106 @@ msgstr "" msgid "Delete price break" msgstr "" -#: company/views.py:61 part/templates/part/navbar.html:72 -#: part/templates/part/navbar.html:75 templates/InvenTree/search.html:291 -#: templates/navbar.html:35 -msgid "Suppliers" -msgstr "" - -#: company/views.py:68 templates/InvenTree/search.html:308 +#: company/views.py:70 part/templates/part/navbar.html:72 +#: part/templates/part/navbar.html:75 templates/InvenTree/search.html:306 #: templates/navbar.html:36 msgid "Manufacturers" msgstr "" -#: company/views.py:75 templates/InvenTree/search.html:321 +#: company/views.py:77 templates/InvenTree/search.html:336 #: templates/navbar.html:45 msgid "Customers" msgstr "" -#: company/views.py:76 order/templates/order/sales_orders.html:185 +#: company/views.py:78 order/templates/order/sales_orders.html:185 msgid "New Customer" msgstr "" -#: company/views.py:84 +#: company/views.py:86 msgid "Companies" msgstr "" -#: company/views.py:85 +#: company/views.py:87 msgid "New Company" msgstr "" -#: company/views.py:167 part/views.py:848 +#: company/views.py:169 part/views.py:848 msgid "Download Image" msgstr "" -#: company/views.py:196 part/views.py:880 +#: company/views.py:198 part/views.py:880 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:212 part/views.py:896 +#: company/views.py:214 part/views.py:896 msgid "Supplied URL is not a valid image file" msgstr "" -#: company/views.py:241 +#: company/views.py:243 msgid "Update Company Image" msgstr "" -#: company/views.py:247 +#: company/views.py:249 msgid "Updated company image" msgstr "" -#: company/views.py:257 +#: company/views.py:259 msgid "Edit Company" msgstr "" -#: company/views.py:262 +#: company/views.py:264 msgid "Edited company information" msgstr "" -#: company/views.py:285 order/templates/order/sales_orders.html:186 +#: company/views.py:287 order/templates/order/sales_orders.html:186 msgid "Create new Customer" msgstr "" -#: company/views.py:287 +#: company/views.py:289 msgid "Create new Company" msgstr "" -#: company/views.py:314 +#: company/views.py:316 msgid "Created new company" msgstr "" -#: company/views.py:330 +#: company/views.py:332 msgid "Company was deleted" msgstr "" -#: company/views.py:355 +#: company/views.py:357 +msgid "Edit Manufacturer Part" +msgstr "" + +#: company/views.py:366 +msgid "Create New Manufacturer Part" +msgstr "" + +#: company/views.py:440 +msgid "Delete Manufacturer Part" +msgstr "" + +#: company/views.py:528 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:378 templates/js/stock.js:1087 +#: company/views.py:578 templates/js/stock.js:1164 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:497 +#: company/views.py:722 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:574 part/views.py:2622 +#: company/views.py:799 part/views.py:2640 msgid "Added new price break" msgstr "" -#: company/views.py:630 part/views.py:2666 +#: company/views.py:855 part/views.py:2684 msgid "Edit Price Break" msgstr "" -#: company/views.py:645 part/views.py:2680 +#: company/views.py:870 part/views.py:2698 msgid "Delete Price Break" msgstr "" @@ -2331,11 +2535,11 @@ msgstr "" msgid "Label height, specified in mm" msgstr "" -#: label/models.py:222 label/models.py:273 +#: label/models.py:222 label/models.py:275 msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:223 label/models.py:274 report/models.py:294 +#: label/models.py:223 label/models.py:276 report/models.py:294 #: report/models.py:415 report/models.py:449 msgid "Filters" msgstr "" @@ -2373,9 +2577,8 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:452 -msgid "" -"Target date for order completion. Order will be overdue after this date." +#: order/forms.py:145 order/models.py:462 +msgid "Target date for order completion. Order will be overdue after this date." msgstr "" #: order/forms.py:235 @@ -2410,7 +2613,7 @@ msgstr "" msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:445 +#: order/models.py:182 order/models.py:455 msgid "Purchase order status" msgstr "" @@ -2444,16 +2647,15 @@ msgid "Target Delivery Date" msgstr "" #: order/models.py:213 -msgid "" -"Expected date for order delivery. Order will be overdue after this date." +msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" #: order/models.py:219 msgid "Date order was completed" msgstr "" -#: order/models.py:243 order/models.py:342 part/views.py:1586 -#: stock/models.py:270 stock/models.py:950 +#: order/models.py:243 part/views.py:1586 stock/models.py:270 +#: stock/models.py:953 msgid "Quantity must be greater than zero" msgstr "" @@ -2461,120 +2663,128 @@ msgstr "" msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:337 +#: order/models.py:344 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:359 +#: order/models.py:348 +msgid "Quantity must be an integer" +msgstr "" + +#: order/models.py:350 +msgid "Quantity must be a positive number" +msgstr "" + +#: order/models.py:369 msgid "Received items" msgstr "" -#: order/models.py:441 +#: order/models.py:451 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer Reference " msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer order reference code" msgstr "" -#: order/models.py:455 templates/js/order.js:303 +#: order/models.py:465 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:462 +#: order/models.py:472 msgid "shipped by" msgstr "" -#: order/models.py:506 +#: order/models.py:516 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:593 +#: order/models.py:603 msgid "Item quantity" msgstr "" -#: order/models.py:595 +#: order/models.py:605 msgid "Line item reference" msgstr "" -#: order/models.py:597 +#: order/models.py:607 msgid "Line item notes" msgstr "" -#: order/models.py:623 order/models.py:667 +#: order/models.py:633 order/models.py:677 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:624 order/templates/order/order_base.html:9 +#: order/models.py:634 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 -#: stock/templates/stock/item_base.html:309 templates/js/order.js:148 +#: stock/templates/stock/item_base.html:313 templates/js/order.js:148 msgid "Purchase Order" msgstr "" -#: order/models.py:638 +#: order/models.py:648 msgid "Supplier part" msgstr "" -#: order/models.py:641 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:207 +#: order/models.py:651 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:189 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:131 msgid "Received" msgstr "" -#: order/models.py:641 +#: order/models.py:651 msgid "Number of items received" msgstr "" -#: order/models.py:648 stock/models.py:506 -#: stock/templates/stock/item_base.html:316 +#: order/models.py:658 stock/models.py:508 +#: stock/templates/stock/item_base.html:320 msgid "Purchase Price" msgstr "" -#: order/models.py:649 +#: order/models.py:659 msgid "Unit purchase price" msgstr "" -#: order/models.py:743 order/models.py:745 +#: order/models.py:753 order/models.py:755 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:749 +#: order/models.py:759 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:751 +#: order/models.py:761 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:754 +#: order/models.py:764 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:764 +#: order/models.py:774 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:769 +#: order/models.py:779 msgid "Line" msgstr "" -#: order/models.py:780 +#: order/models.py:790 msgid "Item" msgstr "" -#: order/models.py:781 +#: order/models.py:791 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:784 +#: order/models.py:794 msgid "Enter stock allocation quantity" msgstr "" @@ -2622,18 +2832,38 @@ msgstr "" msgid "Issued" msgstr "" -#: order/templates/order/order_cancel.html:7 -#: order/templates/order/sales_order_cancel.html:9 -msgid "Cancelling this order means that the order will no longer be editable." +#: order/templates/order/order_base.html:180 +#: order/templates/order/purchase_order_detail.html:100 +#: part/templates/part/category.html:185 part/templates/part/category.html:227 +#: stock/templates/stock/location.html:191 templates/js/stock.js:708 +#: templates/js/stock.js:1169 +msgid "New Location" +msgstr "" + +#: order/templates/order/order_base.html:181 +#: order/templates/order/purchase_order_detail.html:101 +#: stock/templates/stock/location.html:42 +msgid "Create new stock location" +msgstr "" + +#: order/templates/order/order_cancel.html:8 +msgid "Cancelling this order means that the order and line items will no longer be editable." msgstr "" #: order/templates/order/order_complete.html:7 msgid "Mark this order as complete?" msgstr "" -#: order/templates/order/order_issue.html:7 -msgid "" -"After placing this purchase order, line items will no longer be editable." +#: order/templates/order/order_complete.html:10 +msgid "This order has line items which have not been marked as received." +msgstr "" + +#: order/templates/order/order_complete.html:11 +msgid "Completing this order means that the order and line items will no longer be editable." +msgstr "" + +#: order/templates/order/order_issue.html:8 +msgid "After placing this purchase order, line items will no longer be editable." msgstr "" #: order/templates/order/order_notes.html:13 @@ -2657,7 +2887,8 @@ msgid "Select Supplier" msgstr "" #: order/templates/order/order_wizard/select_parts.html:57 -msgid "Select a supplier for" +#, python-format +msgid "Select a supplier for %(name)s" msgstr "" #: order/templates/order/order_wizard/select_parts.html:69 @@ -2683,11 +2914,13 @@ msgid "Select Purchase Order" msgstr "" #: order/templates/order/order_wizard/select_pos.html:45 -msgid "Create new purchase order for {{ supplier.name }}" +#, python-format +msgid "Create new purchase order for %(name)s" msgstr "" #: order/templates/order/order_wizard/select_pos.html:68 -msgid "Select a purchase order for" +#, python-format +msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 @@ -2709,43 +2942,29 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1108 -#: order/views.py:1191 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1120 +#: order/views.py:1203 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:45 -#: order/templates/order/purchase_order_detail.html:125 -#: part/templates/part/category.html:197 part/templates/part/category.html:239 -#: stock/templates/stock/location.html:191 templates/js/stock.js:708 -#: templates/js/stock.js:1092 -msgid "New Location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:46 -#: order/templates/order/purchase_order_detail.html:126 -#: stock/templates/stock/location.html:35 -msgid "Create new stock location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:139 +#: order/templates/order/purchase_order_detail.html:114 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:198 +#: order/templates/order/purchase_order_detail.html:180 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:239 +#: order/templates/order/purchase_order_detail.html:221 #: order/templates/order/sales_order_detail.html:294 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:240 +#: order/templates/order/purchase_order_detail.html:222 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:245 +#: order/templates/order/purchase_order_detail.html:227 msgid "Receive line item" msgstr "" @@ -2755,7 +2974,21 @@ msgid "Print Order Reports" msgstr "" #: order/templates/order/receive_parts.html:8 -msgid "Receive outstanding parts for" +#, python-format +msgid "Receive outstanding parts for %(order)s - %(desc)s" +msgstr "" + +#: order/templates/order/receive_parts.html:14 part/api.py:40 +#: part/models.py:322 part/templates/part/cat_link.html:7 +#: part/templates/part/category.html:99 +#: part/templates/part/category_navbar.html:22 +#: part/templates/part/category_navbar.html:29 +#: part/templates/part/category_partlist.html:10 +#: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 +#: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:577 +#: templates/navbar.html:23 templates/stats.html:59 templates/stats.html:68 +#: users/models.py:40 +msgid "Parts" msgstr "" #: order/templates/order/receive_parts.html:15 @@ -2767,7 +3000,7 @@ msgid "Order Code" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:128 templates/js/part.js:413 +#: part/templates/part/part_base.html:129 templates/js/part.js:414 msgid "On Order" msgstr "" @@ -2807,30 +3040,26 @@ msgstr "" msgid "Warning" msgstr "" +#: order/templates/order/sales_order_cancel.html:9 +msgid "Cancelling this order means that the order will no longer be editable." +msgstr "" + #: order/templates/order/sales_order_detail.html:13 msgid "Sales Order Items" msgstr "" -#: order/templates/order/sales_order_detail.html:75 -#: order/templates/order/sales_order_detail.html:157 -#: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:418 stock/templates/stock/item_base.html:234 -#: templates/js/build.js:418 -msgid "Serial Number" -msgstr "" - -#: order/templates/order/sales_order_detail.html:92 templates/js/bom.js:338 -#: templates/js/build.js:571 templates/js/build.js:984 +#: order/templates/order/sales_order_detail.html:92 templates/js/bom.js:342 +#: templates/js/build.js:627 templates/js/build.js:1044 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:99 templates/js/build.js:459 -#: templates/js/build.js:789 +#: order/templates/order/sales_order_detail.html:99 templates/js/build.js:515 +#: templates/js/build.js:849 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:100 templates/js/build.js:461 -#: templates/js/build.js:790 +#: order/templates/order/sales_order_detail.html:100 templates/js/build.js:517 +#: templates/js/build.js:850 msgid "Delete stock allocation" msgstr "" @@ -2842,8 +3071,8 @@ msgstr "" msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:229 templates/js/build.js:523 -#: templates/js/build.js:785 +#: order/templates/order/sales_order_detail.html:229 templates/js/build.js:579 +#: templates/js/build.js:845 msgid "Allocated" msgstr "" @@ -2855,7 +3084,7 @@ msgstr "" msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:282 templates/js/build.js:585 +#: order/templates/order/sales_order_detail.html:282 templates/js/build.js:641 msgid "Allocate stock" msgstr "" @@ -2863,8 +3092,8 @@ msgstr "" msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:289 templates/js/build.js:578 -#: templates/js/build.js:992 +#: order/templates/order/sales_order_detail.html:289 templates/js/build.js:634 +#: templates/js/build.js:1052 msgid "Build stock" msgstr "" @@ -2877,9 +3106,7 @@ msgid "Sales Order Notes" msgstr "" #: order/templates/order/sales_order_ship.html:10 -msgid "" -"This order has not been fully allocated. If the order is marked as shipped, " -"it can no longer be adjusted." +msgid "This order has not been fully allocated. If the order is marked as shipped, it can no longer be adjusted." msgstr "" #: order/templates/order/sales_order_ship.html:12 @@ -3011,87 +3238,87 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1060 +#: order/views.py:1069 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1117 +#: order/views.py:1129 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1123 +#: order/views.py:1135 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1242 order/views.py:1260 +#: order/views.py:1254 order/views.py:1272 msgid "Edit Line Item" msgstr "" -#: order/views.py:1276 order/views.py:1288 +#: order/views.py:1288 order/views.py:1300 msgid "Delete Line Item" msgstr "" -#: order/views.py:1281 order/views.py:1293 +#: order/views.py:1293 order/views.py:1305 msgid "Deleted line item" msgstr "" -#: order/views.py:1306 +#: order/views.py:1318 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1351 +#: order/views.py:1363 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1367 +#: order/views.py:1379 msgid "Select line item" msgstr "" -#: order/views.py:1398 +#: order/views.py:1410 msgid "No matching item for serial" msgstr "" -#: order/views.py:1408 +#: order/views.py:1420 msgid "is not in stock" msgstr "" -#: order/views.py:1416 +#: order/views.py:1428 msgid "already allocated to an order" msgstr "" -#: order/views.py:1470 +#: order/views.py:1482 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1544 +#: order/views.py:1556 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1559 +#: order/views.py:1571 msgid "Remove allocation" msgstr "" #: part/bom.py:138 part/models.py:72 part/models.py:762 -#: part/templates/part/category.html:62 part/templates/part/detail.html:90 +#: part/templates/part/category.html:66 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" -#: part/bom.py:139 part/templates/part/part_base.html:116 +#: part/bom.py:139 part/templates/part/part_base.html:117 msgid "Available Stock" msgstr "" -#: part/bom.py:278 +#: part/bom.py:379 #, python-brace-format msgid "Unsupported file format: {f}" msgstr "" -#: part/bom.py:283 +#: part/bom.py:384 msgid "Error reading BOM file (invalid data)" msgstr "" -#: part/bom.py:285 +#: part/bom.py:386 msgid "Error reading BOM file (incorrect row size)" msgstr "" @@ -3136,94 +3363,102 @@ msgid "Include part stock data in exported BOM" msgstr "" #: part/forms.py:99 -msgid "Include Supplier Data" +msgid "Include Manufacturer Data" msgstr "" #: part/forms.py:99 +msgid "Include part manufacturer data in exported BOM" +msgstr "" + +#: part/forms.py:101 +msgid "Include Supplier Data" +msgstr "" + +#: part/forms.py:101 msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:120 part/models.py:2057 +#: part/forms.py:122 part/models.py:2077 msgid "Parent Part" msgstr "" -#: part/forms.py:121 part/templates/part/bom_duplicate.html:7 +#: part/forms.py:123 part/templates/part/bom_duplicate.html:7 msgid "Select parent part to copy BOM from" msgstr "" -#: part/forms.py:127 +#: part/forms.py:129 msgid "Clear existing BOM items" msgstr "" -#: part/forms.py:133 +#: part/forms.py:135 msgid "Confirm BOM duplication" msgstr "" -#: part/forms.py:151 +#: part/forms.py:153 msgid "validate" msgstr "" -#: part/forms.py:151 +#: part/forms.py:153 msgid "Confirm that the BOM is correct" msgstr "" -#: part/forms.py:163 +#: part/forms.py:165 msgid "BOM file" msgstr "" -#: part/forms.py:163 +#: part/forms.py:165 msgid "Select BOM file to upload" msgstr "" -#: part/forms.py:182 +#: part/forms.py:184 msgid "Related Part" msgstr "" -#: part/forms.py:201 +#: part/forms.py:203 msgid "Select part category" msgstr "" -#: part/forms.py:218 +#: part/forms.py:220 msgid "Duplicate all BOM data for this part" msgstr "" -#: part/forms.py:219 +#: part/forms.py:221 msgid "Copy BOM" msgstr "" -#: part/forms.py:224 +#: part/forms.py:226 msgid "Duplicate all parameter data for this part" msgstr "" -#: part/forms.py:225 +#: part/forms.py:227 msgid "Copy Parameters" msgstr "" -#: part/forms.py:230 +#: part/forms.py:232 msgid "Confirm part creation" msgstr "" -#: part/forms.py:235 +#: part/forms.py:237 msgid "Include category parameter templates" msgstr "" -#: part/forms.py:240 +#: part/forms.py:242 msgid "Include parent categories parameter templates" msgstr "" -#: part/forms.py:320 +#: part/forms.py:322 msgid "Add parameter template to same level categories" msgstr "" -#: part/forms.py:324 +#: part/forms.py:326 msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:342 part/models.py:2151 +#: part/forms.py:344 part/models.py:2171 msgid "Sub part" msgstr "" -#: part/forms.py:370 +#: part/forms.py:372 msgid "Input quantity for price calculation" msgstr "" @@ -3239,15 +3474,15 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2103 -#: part/templates/part/part_app_base.html:9 +#: part/models.py:82 part/models.py:2123 +#: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" -#: part/models.py:83 part/templates/part/category.html:19 -#: part/templates/part/category.html:90 part/templates/part/category.html:141 -#: templates/InvenTree/search.html:126 templates/stats.html:63 -#: users/models.py:37 +#: part/models.py:83 part/templates/part/category.html:23 +#: part/templates/part/category.html:94 part/templates/part/category.html:141 +#: templates/InvenTree/search.html:127 templates/stats.html:63 +#: users/models.py:39 msgid "Part Categories" msgstr "" @@ -3300,7 +3535,7 @@ msgstr "" msgid "Part description" msgstr "" -#: part/models.py:716 part/templates/part/category.html:69 +#: part/models.py:716 part/templates/part/category.html:73 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" @@ -3309,8 +3544,8 @@ msgstr "" msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:724 part/models.py:2102 part/templates/part/detail.html:73 -#: part/templates/part/set_category.html:15 templates/js/part.js:384 +#: part/models.py:724 part/models.py:2122 part/templates/part/detail.html:73 +#: part/templates/part/set_category.html:15 templates/js/part.js:385 msgid "Category" msgstr "" @@ -3319,7 +3554,7 @@ msgid "Part category" msgstr "" #: part/models.py:730 part/templates/part/detail.html:28 -#: part/templates/part/part_base.html:93 templates/js/part.js:160 +#: part/templates/part/part_base.html:94 templates/js/part.js:161 msgid "IPN" msgstr "" @@ -3332,7 +3567,7 @@ msgid "Part revision or version number" msgstr "" #: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198 -#: templates/js/part.js:164 +#: templates/js/part.js:165 msgid "Revision" msgstr "" @@ -3364,7 +3599,7 @@ msgstr "" msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:828 part/models.py:2031 part/templates/part/detail.html:106 +#: part/models.py:828 part/models.py:2051 part/templates/part/detail.html:106 #: part/templates/part/params.html:29 msgid "Units" msgstr "" @@ -3395,7 +3630,7 @@ msgstr "" #: part/models.py:861 part/templates/part/detail.html:227 #: templates/js/table_filters.js:20 templates/js/table_filters.js:60 -#: templates/js/table_filters.js:214 templates/js/table_filters.js:283 +#: templates/js/table_filters.js:236 templates/js/table_filters.js:305 msgid "Active" msgstr "" @@ -3431,170 +3666,168 @@ msgstr "" msgid "Creation User" msgstr "" -#: part/models.py:1929 +#: part/models.py:1949 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:1946 +#: part/models.py:1966 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:1966 templates/js/part.js:561 templates/js/stock.js:104 +#: part/models.py:1986 templates/js/part.js:638 templates/js/stock.js:104 msgid "Test Name" msgstr "" -#: part/models.py:1967 +#: part/models.py:1987 msgid "Enter a name for the test" msgstr "" -#: part/models.py:1972 +#: part/models.py:1992 msgid "Test Description" msgstr "" -#: part/models.py:1973 +#: part/models.py:1993 msgid "Enter description for this test" msgstr "" -#: part/models.py:1978 templates/js/part.js:570 -#: templates/js/table_filters.js:200 +#: part/models.py:1998 templates/js/part.js:647 +#: templates/js/table_filters.js:222 msgid "Required" msgstr "" -#: part/models.py:1979 +#: part/models.py:1999 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:1984 templates/js/part.js:578 +#: part/models.py:2004 templates/js/part.js:655 msgid "Requires Value" msgstr "" -#: part/models.py:1985 +#: part/models.py:2005 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:1990 templates/js/part.js:585 +#: part/models.py:2010 templates/js/part.js:662 msgid "Requires Attachment" msgstr "" -#: part/models.py:1991 +#: part/models.py:2011 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2024 +#: part/models.py:2044 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2029 +#: part/models.py:2049 msgid "Parameter Name" msgstr "" -#: part/models.py:2031 +#: part/models.py:2051 msgid "Parameter Units" msgstr "" -#: part/models.py:2059 part/models.py:2108 part/models.py:2109 +#: part/models.py:2079 part/models.py:2128 part/models.py:2129 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2061 +#: part/models.py:2081 msgid "Data" msgstr "" -#: part/models.py:2061 +#: part/models.py:2081 msgid "Parameter Value" msgstr "" -#: part/models.py:2113 templates/InvenTree/settings/category.html:67 +#: part/models.py:2133 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2114 +#: part/models.py:2134 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2143 +#: part/models.py:2163 msgid "Select parent part" msgstr "" -#: part/models.py:2152 +#: part/models.py:2172 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2158 +#: part/models.py:2178 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2160 templates/js/bom.js:216 templates/js/bom.js:269 +#: part/models.py:2180 templates/js/bom.js:216 templates/js/bom.js:269 msgid "Optional" msgstr "" -#: part/models.py:2160 +#: part/models.py:2180 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2163 +#: part/models.py:2183 msgid "Overage" msgstr "" -#: part/models.py:2164 +#: part/models.py:2184 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2167 +#: part/models.py:2187 msgid "BOM item reference" msgstr "" -#: part/models.py:2170 +#: part/models.py:2190 msgid "BOM item notes" msgstr "" -#: part/models.py:2172 +#: part/models.py:2192 msgid "Checksum" msgstr "" -#: part/models.py:2172 +#: part/models.py:2192 msgid "BOM line checksum" msgstr "" -#: part/models.py:2176 templates/js/bom.js:275 templates/js/bom.js:282 +#: part/models.py:2196 templates/js/bom.js:279 templates/js/bom.js:286 #: templates/js/table_filters.js:50 msgid "Inherited" msgstr "" -#: part/models.py:2177 +#: part/models.py:2197 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2253 part/views.py:1592 part/views.py:1644 +#: part/models.py:2273 part/views.py:1592 part/views.py:1644 #: stock/models.py:260 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2262 part/models.py:2264 +#: part/models.py:2282 part/models.py:2284 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2267 +#: part/models.py:2287 msgid "BOM Item" msgstr "" -#: part/models.py:2384 +#: part/models.py:2404 msgid "Part 1" msgstr "" -#: part/models.py:2388 +#: part/models.py:2408 msgid "Part 2" msgstr "" -#: part/models.py:2388 +#: part/models.py:2408 msgid "Select Related Part" msgstr "" -#: part/models.py:2420 -msgid "" -"Error creating relationship: check that the part is not related to itself " -"and that the relationship is unique" +#: part/models.py:2440 +msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" #: part/templates/part/allocation.html:11 @@ -3625,8 +3858,7 @@ msgstr "" #: part/templates/part/bom.html:21 #, python-format -msgid "" -"The BOM for %(part)s was last checked by %(checker)s on %(check_date)s" +msgid "The BOM for %(part)s was last checked by %(checker)s on %(check_date)s" msgstr "" #: part/templates/part/bom.html:25 @@ -3662,7 +3894,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1883 +#: part/templates/part/bom.html:61 part/views.py:1887 msgid "Export Bill of Materials" msgstr "" @@ -3679,7 +3911,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:584 -#: templates/js/stock.js:1081 +#: templates/js/stock.js:1158 msgid "Create New Part" msgstr "" @@ -3761,8 +3993,7 @@ msgid "Requirements for BOM upload" msgstr "" #: part/templates/part/bom_upload/upload_file.html:21 -msgid "" -"The BOM file must contain the required named columns as provided in the " +msgid "The BOM file must contain the required named columns as provided in the " msgstr "" #: part/templates/part/bom_upload/upload_file.html:21 @@ -3779,8 +4010,7 @@ msgstr "" #: part/templates/part/bom_validate.html:6 #, python-format -msgid "" -"Confirm that the Bill of Materials (BOM) is valid for:
%(part)s" +msgid "Confirm that the Bill of Materials (BOM) is valid for:
%(part)s" msgstr "" #: part/templates/part/bom_validate.html:9 @@ -3795,39 +4025,42 @@ msgstr "" msgid "Start New Build" msgstr "" -#: part/templates/part/category.html:20 +#: part/templates/part/category.html:24 msgid "All parts" msgstr "" -#: part/templates/part/category.html:25 part/views.py:2264 +#: part/templates/part/category.html:29 part/views.py:2282 msgid "Create new part category" msgstr "" -#: part/templates/part/category.html:31 +#: part/templates/part/category.html:35 msgid "Edit part category" msgstr "" -#: part/templates/part/category.html:36 +#: part/templates/part/category.html:40 msgid "Delete part category" msgstr "" -#: part/templates/part/category.html:46 part/templates/part/category.html:85 +#: part/templates/part/category.html:50 part/templates/part/category.html:89 msgid "Category Details" msgstr "" -#: part/templates/part/category.html:51 +#: part/templates/part/category.html:55 msgid "Category Path" msgstr "" -#: part/templates/part/category.html:56 +#: part/templates/part/category.html:60 msgid "Category Description" msgstr "" -#: part/templates/part/category.html:75 +#: part/templates/part/category.html:79 +#: part/templates/part/category_navbar.html:11 +#: part/templates/part/category_navbar.html:18 +#: part/templates/part/subcategory.html:16 msgid "Subcategories" msgstr "" -#: part/templates/part/category.html:80 +#: part/templates/part/category.html:84 msgid "Parts (Including subcategories)" msgstr "" @@ -3847,24 +4080,24 @@ msgstr "" msgid "Export Data" msgstr "" -#: part/templates/part/category.html:198 +#: part/templates/part/category.html:186 #: stock/templates/stock/location.html:192 templates/js/stock.js:709 msgid "Create new location" msgstr "" -#: part/templates/part/category.html:203 part/templates/part/category.html:233 +#: part/templates/part/category.html:191 part/templates/part/category.html:221 msgid "New Category" msgstr "" -#: part/templates/part/category.html:204 +#: part/templates/part/category.html:192 msgid "Create new category" msgstr "" -#: part/templates/part/category.html:234 +#: part/templates/part/category.html:222 msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:240 stock/views.py:1359 +#: part/templates/part/category.html:228 stock/views.py:1359 msgid "Create new Stock Location" msgstr "" @@ -3873,17 +4106,12 @@ msgid "Are you sure you want to delete category" msgstr "" #: part/templates/part/category_delete.html:8 -#: part/templates/part/category_delete.html:25 -msgid "This category contains" -msgstr "" - -#: part/templates/part/category_delete.html:8 -msgid "child categories" +#, python-format +msgid "This category contains %(count)s child categories" msgstr "" #: part/templates/part/category_delete.html:9 -msgid "" -"If this category is deleted, these child categories will be moved to the" +msgid "If this category is deleted, these child categories will be moved to the" msgstr "" #: part/templates/part/category_delete.html:11 @@ -3895,22 +4123,21 @@ msgid "top level Parts category" msgstr "" #: part/templates/part/category_delete.html:25 -msgid "parts" +#, python-format +msgid "This category contains %(count)s parts" msgstr "" #: part/templates/part/category_delete.html:27 -msgid "" -"If this category is deleted, these parts will be moved to the parent category" +#, python-format +msgid "If this category is deleted, these parts will be moved to the parent category %(path)s" msgstr "" #: part/templates/part/category_delete.html:29 -msgid "" -"If this category is deleted, these parts will be moved to the top-level " -"category Teile" +msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" -#: part/templates/part/category_navbar.html:18 -#: part/templates/part/category_navbar.html:21 +#: part/templates/part/category_navbar.html:34 +#: part/templates/part/category_navbar.html:37 #: part/templates/part/navbar.html:22 msgid "Parameters" msgstr "" @@ -3925,7 +4152,8 @@ msgid "Duplicate Part" msgstr "" #: part/templates/part/copy_part.html:10 -msgid "Make a copy of part" +#, python-format +msgid "Make a copy of part '%(full_name)s'." msgstr "" #: part/templates/part/copy_part.html:14 @@ -3938,8 +4166,9 @@ msgstr "" msgid "The new part may be a duplicate of these existing parts" msgstr "" -#: part/templates/part/create_part.html:16 -msgid "match" +#: part/templates/part/create_part.html:17 +#, python-format +msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" #: part/templates/part/detail.html:11 part/templates/part/navbar.html:11 @@ -4022,6 +4251,19 @@ msgstr "" msgid "Part is not active" msgstr "" +#: part/templates/part/manufacturer.html:11 +msgid "Part Manufacturers" +msgstr "" + +#: part/templates/part/manufacturer.html:24 +msgid "Delete manufacturer parts" +msgstr "" + +#: part/templates/part/manufacturer.html:53 +#: part/templates/part/supplier.html:57 +msgid "Create new manufacturer" +msgstr "" + #: part/templates/part/navbar.html:26 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" @@ -4042,28 +4284,28 @@ msgstr "" msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:86 +#: part/templates/part/navbar.html:92 msgid "Sales Price Information" msgstr "" -#: part/templates/part/navbar.html:89 +#: part/templates/part/navbar.html:95 msgid "Sale Price" msgstr "" -#: part/templates/part/navbar.html:100 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:106 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:103 stock/templates/stock/item_base.html:382 +#: part/templates/part/navbar.html:109 stock/templates/stock/item_base.html:398 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:107 part/templates/part/navbar.html:110 +#: part/templates/part/navbar.html:113 part/templates/part/navbar.html:116 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:119 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:125 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" @@ -4079,7 +4321,7 @@ msgstr "" #: part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1652 templates/InvenTree/settings/header.html:8 +#: stock/models.py:1655 templates/InvenTree/settings/header.html:8 #: templates/js/stock.js:124 msgid "Value" msgstr "" @@ -4088,11 +4330,6 @@ msgstr "" msgid "Edit" msgstr "" -#: part/templates/part/params.html:44 part/templates/part/related.html:44 -#: part/templates/part/supplier.html:22 stock/views.py:1002 users/models.py:182 -msgid "Delete" -msgstr "" - #: part/templates/part/params.html:68 msgid "New Template" msgstr "" @@ -4101,128 +4338,130 @@ msgstr "" msgid "Create New Parameter Template" msgstr "" -#: part/templates/part/part_app_base.html:11 +#: part/templates/part/part_app_base.html:12 msgid "Part List" msgstr "" -#: part/templates/part/part_base.html:17 -msgid "This part is a variant of" +#: part/templates/part/part_base.html:18 +#, python-format +msgid "This part is a variant of %(link)s" msgstr "" -#: part/templates/part/part_base.html:32 templates/js/company.js:155 -#: templates/js/part.js:75 templates/js/part.js:152 +#: part/templates/part/part_base.html:33 templates/js/company.js:156 +#: templates/js/company.js:254 templates/js/part.js:76 templates/js/part.js:153 msgid "Inactive" msgstr "" -#: part/templates/part/part_base.html:39 +#: part/templates/part/part_base.html:40 msgid "Star this part" msgstr "" -#: part/templates/part/part_base.html:46 -#: stock/templates/stock/item_base.html:127 -#: stock/templates/stock/location.html:44 +#: part/templates/part/part_base.html:47 +#: stock/templates/stock/item_base.html:131 +#: stock/templates/stock/location.html:51 msgid "Barcode actions" msgstr "" -#: part/templates/part/part_base.html:48 -#: stock/templates/stock/item_base.html:129 -#: stock/templates/stock/location.html:46 templates/qr_button.html:1 +#: part/templates/part/part_base.html:49 +#: stock/templates/stock/item_base.html:133 +#: stock/templates/stock/location.html:53 templates/qr_button.html:1 msgid "Show QR Code" msgstr "" -#: part/templates/part/part_base.html:49 -#: stock/templates/stock/item_base.html:145 -#: stock/templates/stock/location.html:47 +#: part/templates/part/part_base.html:50 +#: stock/templates/stock/item_base.html:149 +#: stock/templates/stock/location.html:54 msgid "Print Label" msgstr "" -#: part/templates/part/part_base.html:54 +#: part/templates/part/part_base.html:55 msgid "Show pricing information" msgstr "" -#: part/templates/part/part_base.html:58 +#: part/templates/part/part_base.html:59 msgid "Count part stock" msgstr "" -#: part/templates/part/part_base.html:73 +#: part/templates/part/part_base.html:74 msgid "Part actions" msgstr "" -#: part/templates/part/part_base.html:76 +#: part/templates/part/part_base.html:77 msgid "Duplicate part" msgstr "" -#: part/templates/part/part_base.html:79 +#: part/templates/part/part_base.html:80 msgid "Edit part" msgstr "" -#: part/templates/part/part_base.html:82 +#: part/templates/part/part_base.html:83 msgid "Delete part" msgstr "" -#: part/templates/part/part_base.html:122 templates/js/table_filters.js:134 +#: part/templates/part/part_base.html:123 templates/js/table_filters.js:156 msgid "In Stock" msgstr "" -#: part/templates/part/part_base.html:135 templates/InvenTree/index.html:130 +#: part/templates/part/part_base.html:136 templates/InvenTree/index.html:131 msgid "Required for Build Orders" msgstr "" -#: part/templates/part/part_base.html:142 +#: part/templates/part/part_base.html:143 msgid "Required for Sales Orders" msgstr "" -#: part/templates/part/part_base.html:149 +#: part/templates/part/part_base.html:150 msgid "Allocated to Orders" msgstr "" -#: part/templates/part/part_base.html:164 templates/js/bom.js:296 +#: part/templates/part/part_base.html:165 templates/js/bom.js:300 msgid "Can Build" msgstr "" -#: part/templates/part/part_base.html:170 templates/js/part.js:417 +#: part/templates/part/part_base.html:171 templates/js/part.js:418 msgid "Building" msgstr "" -#: part/templates/part/part_base.html:249 +#: part/templates/part/part_base.html:250 msgid "Calculate" msgstr "" #: part/templates/part/part_pricing.html:8 -msgid "Pricing information for:" +#, python-format +msgid "Pricing information for:
%(part)s." msgstr "" -#: part/templates/part/part_pricing.html:24 +#: part/templates/part/part_pricing.html:23 msgid "Supplier Pricing" msgstr "" -#: part/templates/part/part_pricing.html:28 -#: part/templates/part/part_pricing.html:54 +#: part/templates/part/part_pricing.html:27 +#: part/templates/part/part_pricing.html:53 msgid "Unit Cost" msgstr "" -#: part/templates/part/part_pricing.html:34 -#: part/templates/part/part_pricing.html:60 +#: part/templates/part/part_pricing.html:33 +#: part/templates/part/part_pricing.html:59 msgid "Total Cost" msgstr "" -#: part/templates/part/part_pricing.html:42 +#: part/templates/part/part_pricing.html:41 msgid "No supplier pricing available" msgstr "" -#: part/templates/part/part_pricing.html:50 +#: part/templates/part/part_pricing.html:49 msgid "BOM Pricing" msgstr "" -#: part/templates/part/part_pricing.html:68 +#: part/templates/part/part_pricing.html:67 msgid "Note: BOM pricing is incomplete for this part" msgstr "" -#: part/templates/part/part_pricing.html:75 +#: part/templates/part/part_pricing.html:74 msgid "No BOM pricing available" msgstr "" -#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:84 msgid "No pricing information is available for this part." msgstr "" @@ -4234,6 +4473,36 @@ msgstr "" msgid "Select from existing images" msgstr "" +#: part/templates/part/partial_delete.html:7 +#, python-format +msgid "Are you sure you want to delete part '%(full_name)s'?" +msgstr "" + +#: part/templates/part/partial_delete.html:12 +#, python-format +msgid "This part is used in BOMs for %(count)s other parts. If you delete this part, the BOMs for the following parts will be updated" +msgstr "" + +#: part/templates/part/partial_delete.html:22 +#, python-format +msgid "There are %(count)s stock entries defined for this part. If you delete this part, the following stock entries will also be deleted:" +msgstr "" + +#: part/templates/part/partial_delete.html:33 +#, python-format +msgid "There are %(count)s manufacturers defined for this part. If you delete this part, the following manufacturer parts will also be deleted:" +msgstr "" + +#: part/templates/part/partial_delete.html:44 +#, python-format +msgid "There are %(count)s suppliers defined for this part. If you delete this part, the following supplier parts will also be deleted:" +msgstr "" + +#: part/templates/part/partial_delete.html:55 +#, python-format +msgid "There are %(count)s unique parts tracked for '%(full_name)s'. Deleting this part will permanently remove this tracking information." +msgstr "" + #: part/templates/part/related.html:18 msgid "Add Related" msgstr "" @@ -4259,38 +4528,23 @@ msgid "Part Stock" msgstr "" #: part/templates/part/stock.html:16 -msgid "Showing stock for all variants of" +#, python-format +msgid "Showing stock for all variants of %(full_name)s" msgstr "" #: part/templates/part/stock_count.html:7 templates/js/bom.js:239 -#: templates/js/part.js:421 +#: templates/js/part.js:422 msgid "No Stock" msgstr "" -#: part/templates/part/stock_count.html:9 templates/InvenTree/index.html:129 +#: part/templates/part/stock_count.html:9 templates/InvenTree/index.html:130 msgid "Low Stock" msgstr "" -#: part/templates/part/subcategories.html:5 -msgid "Child Categories" -msgstr "" - #: part/templates/part/supplier.html:10 msgid "Part Suppliers" msgstr "" -#: part/templates/part/supplier.html:22 -msgid "Delete supplier parts" -msgstr "" - -#: part/templates/part/supplier.html:51 -msgid "Create new supplier" -msgstr "" - -#: part/templates/part/supplier.html:57 -msgid "Create new manufacturer" -msgstr "" - #: part/templates/part/track.html:10 msgid "Part Tracking" msgstr "" @@ -4304,7 +4558,8 @@ msgid "Create new part variant" msgstr "" #: part/templates/part/variant_part.html:10 -msgid "Create a new variant of template" +#, python-format +msgid "Create a new variant of template '%(full_name)s'." msgstr "" #: part/templates/part/variants.html:19 @@ -4452,75 +4707,75 @@ msgstr "" msgid "Specify quantity" msgstr "" -#: part/views.py:1933 +#: part/views.py:1939 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:1940 +#: part/views.py:1946 msgid "Part was deleted" msgstr "" -#: part/views.py:1949 +#: part/views.py:1955 msgid "Part Pricing" msgstr "" -#: part/views.py:2063 +#: part/views.py:2081 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2073 +#: part/views.py:2091 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2080 +#: part/views.py:2098 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2088 +#: part/views.py:2106 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2138 +#: part/views.py:2156 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2152 +#: part/views.py:2170 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2212 +#: part/views.py:2230 msgid "Edit Part Category" msgstr "" -#: part/views.py:2250 +#: part/views.py:2268 msgid "Delete Part Category" msgstr "" -#: part/views.py:2256 +#: part/views.py:2274 msgid "Part category was deleted" msgstr "" -#: part/views.py:2308 +#: part/views.py:2326 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2409 +#: part/views.py:2427 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2465 +#: part/views.py:2483 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2484 +#: part/views.py:2502 msgid "Create BOM Item" msgstr "" -#: part/views.py:2554 +#: part/views.py:2572 msgid "Edit BOM item" msgstr "" -#: part/views.py:2610 +#: part/views.py:2628 msgid "Confim BOM item deletion" msgstr "" @@ -4622,17 +4877,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1640 +#: stock/models.py:1643 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1646 +#: stock/models.py:1649 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:909 +#: templates/js/order.js:195 templates/js/stock.js:986 msgid "Date" msgstr "" @@ -4654,8 +4909,8 @@ msgstr "" msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:406 stock/models.py:473 -#: stock/templates/stock/item_base.html:349 templates/js/stock.js:656 +#: stock/forms.py:114 stock/forms.py:406 stock/models.py:475 +#: stock/templates/stock/item_base.html:365 templates/js/stock.js:656 msgid "Expiry Date" msgstr "" @@ -4668,9 +4923,7 @@ msgid "Enter unique serial numbers (or leave blank)" msgstr "" #: stock/forms.py:169 -msgid "" -"Destination for serialized stock (by default, will remain in current " -"location)" +msgid "Destination for serialized stock (by default, will remain in current location)" msgstr "" #: stock/forms.py:171 @@ -4689,7 +4942,8 @@ msgstr "" msgid "Select test report template" msgstr "" -#: stock/forms.py:267 templates/js/table_filters.js:111 +#: stock/forms.py:267 templates/js/table_filters.js:70 +#: templates/js/table_filters.js:133 msgid "Include sublocations" msgstr "" @@ -4745,11 +4999,11 @@ msgstr "" msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:54 stock/models.py:511 +#: stock/models.py:54 stock/models.py:513 msgid "Owner" msgstr "" -#: stock/models.py:55 stock/models.py:512 +#: stock/models.py:55 stock/models.py:514 msgid "Select Owner" msgstr "" @@ -4786,203 +5040,202 @@ msgstr "" msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:363 +#: stock/models.py:365 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:372 +#: stock/models.py:374 msgid "Base part" msgstr "" -#: stock/models.py:381 +#: stock/models.py:383 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:386 stock/templates/stock/stock_app_base.html:7 +#: stock/models.py:388 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:389 +#: stock/models.py:391 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:396 +#: stock/models.py:398 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:401 stock/templates/stock/item_base.html:255 +#: stock/models.py:403 stock/templates/stock/item_base.html:259 msgid "Installed In" msgstr "" -#: stock/models.py:404 +#: stock/models.py:406 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:420 +#: stock/models.py:422 msgid "Serial number for this item" msgstr "" -#: stock/models.py:432 +#: stock/models.py:434 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:436 +#: stock/models.py:438 msgid "Stock Quantity" msgstr "" -#: stock/models.py:445 +#: stock/models.py:447 msgid "Source Build" msgstr "" -#: stock/models.py:447 +#: stock/models.py:449 msgid "Build for this stock item" msgstr "" -#: stock/models.py:458 +#: stock/models.py:460 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:461 +#: stock/models.py:463 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:467 +#: stock/models.py:469 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:474 -msgid "" -"Expiry date for stock item. Stock will be considered expired after this date" +#: stock/models.py:476 +msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:487 +#: stock/models.py:489 msgid "Delete on deplete" msgstr "" -#: stock/models.py:487 +#: stock/models.py:489 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:497 stock/templates/stock/item_notes.html:13 +#: stock/models.py:499 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:507 +#: stock/models.py:509 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:612 +#: stock/models.py:614 msgid "Assigned to Customer" msgstr "" -#: stock/models.py:614 +#: stock/models.py:616 msgid "Manually assigned to customer" msgstr "" -#: stock/models.py:627 +#: stock/models.py:629 msgid "Returned from customer" msgstr "" -#: stock/models.py:629 +#: stock/models.py:631 msgid "Returned to location" msgstr "" -#: stock/models.py:789 +#: stock/models.py:792 msgid "Installed into stock item" msgstr "" -#: stock/models.py:797 +#: stock/models.py:800 msgid "Installed stock item" msgstr "" -#: stock/models.py:821 +#: stock/models.py:824 msgid "Uninstalled stock item" msgstr "" -#: stock/models.py:840 +#: stock/models.py:843 msgid "Uninstalled into location" msgstr "" -#: stock/models.py:941 +#: stock/models.py:944 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:947 +#: stock/models.py:950 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:953 +#: stock/models.py:956 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:956 +#: stock/models.py:959 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:959 +#: stock/models.py:962 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:991 +#: stock/models.py:994 msgid "Add serial number" msgstr "" -#: stock/models.py:994 +#: stock/models.py:997 #, python-brace-format msgid "Serialized {n} items" msgstr "" -#: stock/models.py:1072 +#: stock/models.py:1075 msgid "Split from existing stock" msgstr "" -#: stock/models.py:1110 +#: stock/models.py:1113 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1553 +#: stock/models.py:1556 msgid "Title" msgstr "" -#: stock/models.py:1553 +#: stock/models.py:1556 msgid "Tracking entry title" msgstr "" -#: stock/models.py:1555 +#: stock/models.py:1558 msgid "Entry notes" msgstr "" -#: stock/models.py:1557 +#: stock/models.py:1560 msgid "Link to external page for further information" msgstr "" -#: stock/models.py:1617 +#: stock/models.py:1620 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1623 +#: stock/models.py:1626 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1641 +#: stock/models.py:1644 msgid "Test name" msgstr "" -#: stock/models.py:1647 templates/js/table_filters.js:190 +#: stock/models.py:1650 templates/js/table_filters.js:212 msgid "Test result" msgstr "" -#: stock/models.py:1653 +#: stock/models.py:1656 msgid "Test output value" msgstr "" -#: stock/models.py:1660 +#: stock/models.py:1663 msgid "Test result attachment" msgstr "" -#: stock/models.py:1666 +#: stock/models.py:1669 msgid "Test notes" msgstr "" @@ -4999,9 +5252,7 @@ msgid "Stock Item Attachments" msgstr "" #: stock/templates/stock/item_base.html:24 -msgid "" -"You are not in the list of owners of this item. This stock item cannot be " -"edited." +msgid "You are not in the list of owners of this item. This stock item cannot be edited." msgstr "" #: stock/templates/stock/item_base.html:31 @@ -5016,156 +5267,157 @@ msgstr "" msgid "This stock item has not passed all required tests" msgstr "" -#: stock/templates/stock/item_base.html:51 -msgid "This stock item is allocated to Sales Order" +#: stock/templates/stock/item_base.html:53 +#, python-format +msgid "This stock item is allocated to Sales Order %(link)s (Quantity: %(qty)s)" msgstr "" -#: stock/templates/stock/item_base.html:57 -msgid "This stock item is allocated to Build" -msgstr "" - -#: stock/templates/stock/item_base.html:63 -msgid "" -"This stock item is serialized - it has a unique serial number and the " -"quantity cannot be adjusted." +#: stock/templates/stock/item_base.html:61 +#, python-format +msgid "This stock item is allocated to Build %(link)s (Quantity: %(qty)s)" msgstr "" #: stock/templates/stock/item_base.html:67 -msgid "This stock item cannot be deleted as it has child items" +msgid "This stock item is serialized - it has a unique serial number and the quantity cannot be adjusted." msgstr "" #: stock/templates/stock/item_base.html:71 -msgid "" -"This stock item will be automatically deleted when all stock is depleted." +msgid "This stock item cannot be deleted as it has child items" msgstr "" -#: stock/templates/stock/item_base.html:91 -#: stock/templates/stock/item_base.html:353 templates/js/table_filters.js:123 -msgid "Expired" +#: stock/templates/stock/item_base.html:75 +msgid "This stock item will be automatically deleted when all stock is depleted." msgstr "" #: stock/templates/stock/item_base.html:95 -#: stock/templates/stock/item_base.html:355 templates/js/table_filters.js:128 +#: stock/templates/stock/item_base.html:369 templates/js/table_filters.js:145 +msgid "Expired" +msgstr "" + +#: stock/templates/stock/item_base.html:99 +#: stock/templates/stock/item_base.html:371 templates/js/table_filters.js:150 msgid "Stale" msgstr "" -#: stock/templates/stock/item_base.html:132 templates/js/barcode.js:309 +#: stock/templates/stock/item_base.html:136 templates/js/barcode.js:309 #: templates/js/barcode.js:314 msgid "Unlink Barcode" msgstr "" -#: stock/templates/stock/item_base.html:134 +#: stock/templates/stock/item_base.html:138 msgid "Link Barcode" msgstr "" -#: stock/templates/stock/item_base.html:136 templates/stock_table.html:31 +#: stock/templates/stock/item_base.html:140 templates/stock_table.html:31 msgid "Scan to Location" msgstr "" -#: stock/templates/stock/item_base.html:143 +#: stock/templates/stock/item_base.html:147 msgid "Printing actions" msgstr "" -#: stock/templates/stock/item_base.html:147 +#: stock/templates/stock/item_base.html:151 #: stock/templates/stock/item_tests.html:27 msgid "Test Report" msgstr "" -#: stock/templates/stock/item_base.html:156 +#: stock/templates/stock/item_base.html:160 msgid "Stock adjustment actions" msgstr "" -#: stock/templates/stock/item_base.html:160 -#: stock/templates/stock/location.html:58 templates/stock_table.html:55 +#: stock/templates/stock/item_base.html:164 +#: stock/templates/stock/location.html:65 templates/stock_table.html:57 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:163 templates/stock_table.html:53 +#: stock/templates/stock/item_base.html:167 templates/stock_table.html:55 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:166 templates/stock_table.html:54 +#: stock/templates/stock/item_base.html:170 templates/stock_table.html:56 msgid "Remove stock" msgstr "" -#: stock/templates/stock/item_base.html:169 +#: stock/templates/stock/item_base.html:173 msgid "Serialize stock" msgstr "" -#: stock/templates/stock/item_base.html:173 +#: stock/templates/stock/item_base.html:177 msgid "Transfer stock" msgstr "" -#: stock/templates/stock/item_base.html:176 +#: stock/templates/stock/item_base.html:180 msgid "Assign to customer" msgstr "" -#: stock/templates/stock/item_base.html:179 +#: stock/templates/stock/item_base.html:183 msgid "Return to stock" msgstr "" -#: stock/templates/stock/item_base.html:183 templates/js/stock.js:1222 +#: stock/templates/stock/item_base.html:187 templates/js/stock.js:1299 msgid "Uninstall stock item" msgstr "" -#: stock/templates/stock/item_base.html:183 +#: stock/templates/stock/item_base.html:187 msgid "Uninstall" msgstr "" -#: stock/templates/stock/item_base.html:192 -#: stock/templates/stock/location.html:55 +#: stock/templates/stock/item_base.html:196 +#: stock/templates/stock/location.html:62 msgid "Stock actions" msgstr "" -#: stock/templates/stock/item_base.html:195 +#: stock/templates/stock/item_base.html:199 msgid "Convert to variant" msgstr "" -#: stock/templates/stock/item_base.html:198 +#: stock/templates/stock/item_base.html:202 msgid "Duplicate stock item" msgstr "" -#: stock/templates/stock/item_base.html:200 +#: stock/templates/stock/item_base.html:204 msgid "Edit stock item" msgstr "" -#: stock/templates/stock/item_base.html:203 +#: stock/templates/stock/item_base.html:207 msgid "Delete stock item" msgstr "" -#: stock/templates/stock/item_base.html:215 +#: stock/templates/stock/item_base.html:219 msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:274 templates/js/build.js:442 +#: stock/templates/stock/item_base.html:278 templates/js/build.js:498 msgid "No location set" msgstr "" -#: stock/templates/stock/item_base.html:281 +#: stock/templates/stock/item_base.html:285 msgid "Barcode Identifier" msgstr "" -#: stock/templates/stock/item_base.html:323 +#: stock/templates/stock/item_base.html:327 msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:353 -msgid "This StockItem expired on" -msgstr "" - -#: stock/templates/stock/item_base.html:355 -msgid "This StockItem expires on" -msgstr "" - -#: stock/templates/stock/item_base.html:362 templates/js/stock.js:662 -msgid "Last Updated" -msgstr "" - -#: stock/templates/stock/item_base.html:367 -msgid "Last Stocktake" +#: stock/templates/stock/item_base.html:369 +#, python-format +msgid "This StockItem expired on %(item.expiry_date)s" msgstr "" #: stock/templates/stock/item_base.html:371 +#, python-format +msgid "This StockItem expires on %(item.expiry_date)s" +msgstr "" + +#: stock/templates/stock/item_base.html:378 templates/js/stock.js:662 +msgid "Last Updated" +msgstr "" + +#: stock/templates/stock/item_base.html:383 +msgid "Last Stocktake" +msgstr "" + +#: stock/templates/stock/item_base.html:387 msgid "No stocktake performed" msgstr "" @@ -5181,6 +5433,11 @@ msgstr "" msgid "Are you sure you want to delete this stock item?" msgstr "" +#: stock/templates/stock/item_delete.html:12 +#, python-format +msgid "This will remove %(qty)s units of %(full_name)s from stock." +msgstr "" + #: stock/templates/stock/item_install.html:7 msgid "Install another StockItem into this item." msgstr "" @@ -5223,54 +5480,55 @@ msgstr "" msgid "Add Test Data" msgstr "" -#: stock/templates/stock/location.html:13 -msgid "" -"You are not in the list of owners of this location. This stock location " -"cannot be edited." +#: stock/templates/stock/location.html:20 +msgid "You are not in the list of owners of this location. This stock location cannot be edited." msgstr "" -#: stock/templates/stock/location.html:30 +#: stock/templates/stock/location.html:37 msgid "All stock items" msgstr "" -#: stock/templates/stock/location.html:48 +#: stock/templates/stock/location.html:55 msgid "Check-in Items" msgstr "" -#: stock/templates/stock/location.html:64 +#: stock/templates/stock/location.html:71 msgid "Location actions" msgstr "" -#: stock/templates/stock/location.html:66 +#: stock/templates/stock/location.html:73 msgid "Edit location" msgstr "" -#: stock/templates/stock/location.html:68 +#: stock/templates/stock/location.html:75 msgid "Delete location" msgstr "" -#: stock/templates/stock/location.html:80 +#: stock/templates/stock/location.html:87 msgid "Location Details" msgstr "" -#: stock/templates/stock/location.html:85 +#: stock/templates/stock/location.html:92 msgid "Location Path" msgstr "" -#: stock/templates/stock/location.html:90 +#: stock/templates/stock/location.html:97 msgid "Location Description" msgstr "" -#: stock/templates/stock/location.html:95 +#: stock/templates/stock/location.html:102 +#: stock/templates/stock/location_navbar.html:11 +#: stock/templates/stock/location_navbar.html:18 +#: stock/templates/stock/sublocation.html:16 msgid "Sublocations" msgstr "" -#: stock/templates/stock/location.html:105 +#: stock/templates/stock/location.html:112 msgid "Stock Details" msgstr "" -#: stock/templates/stock/location.html:110 templates/InvenTree/search.html:263 -#: templates/stats.html:76 users/models.py:39 +#: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 +#: templates/stats.html:76 users/models.py:41 msgid "Stock Locations" msgstr "" @@ -5278,18 +5536,6 @@ msgstr "" msgid "Are you sure you want to delete this stock location?" msgstr "" -#: stock/templates/stock/location_list.html:6 -msgid "Sub-Locations" -msgstr "" - -#. Translators: pluralize with counter -#: stock/templates/stock/location_list.html:17 -#, python-format -msgid "%(counter)s Item" -msgid_plural "%(counter)s Items" -msgstr[0] "" -msgstr[1] "" - #: stock/templates/stock/navbar.html:11 msgid "Stock Item Tracking" msgstr "" @@ -5314,7 +5560,7 @@ msgstr "" msgid "Remove item" msgstr "" -#: stock/templates/stock/stock_app_base.html:15 +#: stock/templates/stock/stock_app_base.html:16 msgid "Loading..." msgstr "" @@ -5327,7 +5573,8 @@ msgid "Convert Stock Item" msgstr "" #: stock/templates/stock/stockitem_convert.html:8 -msgid "This stock item is current an instance of " +#, python-format +msgid "This stock item is current an instance of %(part)s" msgstr "" #: stock/templates/stock/stockitem_convert.html:9 @@ -5338,6 +5585,18 @@ msgstr "" msgid "This action cannot be easily undone" msgstr "" +#: stock/templates/stock/sublocation.html:23 templates/stock_table.html:37 +msgid "Printing Actions" +msgstr "" + +#: stock/templates/stock/sublocation.html:27 templates/stock_table.html:41 +msgid "Print labels" +msgstr "" + +#: stock/templates/stock/tracking_delete.html:6 +msgid "Are you sure you want to delete this stock tracking entry?" +msgstr "" + #: stock/views.py:123 msgid "Edit Stock Location" msgstr "" @@ -5455,7 +5714,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:178 +#: stock/views.py:1001 users/models.py:183 msgid "Add" msgstr "" @@ -5517,7 +5776,7 @@ msgstr "" msgid "Serialize Stock" msgstr "" -#: stock/views.py:1543 templates/js/build.js:210 +#: stock/views.py:1543 templates/js/build.js:244 msgid "Create new Stock Item" msgstr "" @@ -5565,74 +5824,99 @@ msgstr "" msgid "The requested page does not exist" msgstr "" -#: templates/InvenTree/index.html:6 +#: templates/InvenTree/index.html:7 msgid "Index" msgstr "" -#: templates/InvenTree/index.html:97 +#: templates/InvenTree/index.html:98 msgid "Starred Parts" msgstr "" -#: templates/InvenTree/index.html:98 +#: templates/InvenTree/index.html:99 msgid "Latest Parts" msgstr "" -#: templates/InvenTree/index.html:99 +#: templates/InvenTree/index.html:100 msgid "BOM Waiting Validation" msgstr "" -#: templates/InvenTree/index.html:128 +#: templates/InvenTree/index.html:129 msgid "Recently Updated" msgstr "" -#: templates/InvenTree/index.html:144 +#: templates/InvenTree/index.html:145 msgid "Expired Stock" msgstr "" -#: templates/InvenTree/index.html:145 +#: templates/InvenTree/index.html:146 msgid "Stale Stock" msgstr "" -#: templates/InvenTree/index.html:183 +#: templates/InvenTree/index.html:184 msgid "Build Orders In Progress" msgstr "" -#: templates/InvenTree/index.html:184 +#: templates/InvenTree/index.html:185 msgid "Overdue Build Orders" msgstr "" -#: templates/InvenTree/index.html:205 +#: templates/InvenTree/index.html:206 msgid "Outstanding Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:206 +#: templates/InvenTree/index.html:207 msgid "Overdue Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:228 +#: templates/InvenTree/index.html:229 msgid "Outstanding Sales Orders" msgstr "" -#: templates/InvenTree/index.html:229 +#: templates/InvenTree/index.html:230 msgid "Overdue Sales Orders" msgstr "" -#: templates/InvenTree/search.html:7 templates/InvenTree/search.html:13 +#: templates/InvenTree/search.html:8 templates/InvenTree/search.html:14 msgid "Search Results" msgstr "" -#: templates/InvenTree/search.html:23 +#: templates/InvenTree/search.html:24 msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:252 templates/js/stock.js:300 +#: templates/InvenTree/search.html:268 templates/js/stock.js:300 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:255 templates/js/stock.js:310 +#: templates/InvenTree/search.html:271 templates/js/stock.js:310 msgid "No stock location set" msgstr "" +#: templates/InvenTree/settings/appearance.html:10 +msgid "Theme Settings" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:17 +msgid "Color Themes" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:29 +#, python-format +msgid "" +"\n" +" The CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" +" Please select another color theme :)\n" +" " +msgstr "" + +#: templates/InvenTree/settings/appearance.html:39 +msgid "Language" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:61 +msgid "Set Language" +msgstr "" + #: templates/InvenTree/settings/build.html:10 msgid "Build Order Settings" msgstr "" @@ -5663,7 +5947,7 @@ msgstr "" msgid "Global InvenTree Settings" msgstr "" -#: templates/InvenTree/settings/global.html:26 +#: templates/InvenTree/settings/global.html:27 msgid "Barcode Settings" msgstr "" @@ -5703,8 +5987,8 @@ msgstr "" msgid "Edit setting" msgstr "" -#: templates/InvenTree/settings/settings.html:7 -#: templates/InvenTree/settings/settings.html:13 templates/navbar.html:78 +#: templates/InvenTree/settings/settings.html:8 +#: templates/InvenTree/settings/settings.html:14 templates/navbar.html:84 msgid "Settings" msgstr "" @@ -5716,7 +6000,7 @@ msgstr "" msgid "Stock Settings" msgstr "" -#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:48 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:50 msgid "Stock Options" msgstr "" @@ -5730,7 +6014,7 @@ msgid "Account" msgstr "" #: templates/InvenTree/settings/tabs.html:9 -msgid "Theme" +msgid "Appearance" msgstr "" #: templates/InvenTree/settings/tabs.html:13 @@ -5749,24 +6033,6 @@ msgstr "" msgid "Categories" 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" -"\t\tThe CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected " -"color theme was not found.
\n" -"\t\tPlease select another color theme :)\n" -"\t" -msgstr "" - #: templates/InvenTree/settings/user.html:16 msgid "User Information" msgstr "" @@ -5776,7 +6042,7 @@ msgid "Change Password" msgstr "" #: templates/InvenTree/settings/user.html:28 -#: templates/registration/login.html:58 +#: templates/registration/login.html:59 msgid "Username" msgstr "" @@ -5829,13 +6095,23 @@ msgid "View Code on GitHub" msgstr "" #: templates/about.html:63 -msgid "Get the App" +msgid "Credits" msgstr "" #: templates/about.html:68 +msgid "Mobile App" +msgstr "" + +#: templates/about.html:73 msgid "Submit Bug Report" msgstr "" +#: templates/about.html:82 templates/js/modals.js:550 +#: templates/js/modals.js:809 templates/modals.html:28 templates/modals.html:52 +#: templates/modals.html:93 +msgid "Close" +msgstr "" + #: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "" @@ -5913,8 +6189,7 @@ msgid "Link Barcode to Stock Item" msgstr "" #: templates/js/barcode.js:311 -msgid "" -"This will remove the association between this stock item and the barcode" +msgid "This will remove the association between this stock item and the barcode" msgstr "" #: templates/js/barcode.js:317 @@ -5961,7 +6236,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:934 +#: templates/js/bom.js:175 templates/js/build.js:994 msgid "Open subassembly" msgstr "" @@ -5969,77 +6244,88 @@ msgstr "" msgid "No pricing available" msgstr "" -#: templates/js/bom.js:286 templates/js/bom.js:372 +#: templates/js/bom.js:272 templates/js/filters.js:167 +#: templates/js/filters.js:397 +msgid "true" +msgstr "" + +#: templates/js/bom.js:273 templates/js/filters.js:171 +#: templates/js/filters.js:398 +msgid "false" +msgstr "" + +#: templates/js/bom.js:290 templates/js/bom.js:376 msgid "View BOM" msgstr "" -#: templates/js/bom.js:346 +#: templates/js/bom.js:350 msgid "Validate BOM Item" msgstr "" -#: templates/js/bom.js:348 +#: templates/js/bom.js:352 msgid "This line has been validated" msgstr "" -#: templates/js/bom.js:350 +#: templates/js/bom.js:354 msgid "Edit BOM Item" msgstr "" -#: templates/js/bom.js:352 +#: templates/js/bom.js:356 msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:443 templates/js/build.js:305 templates/js/build.js:1032 +#: templates/js/bom.js:447 templates/js/build.js:340 templates/js/build.js:1092 msgid "No BOM items found" msgstr "" -#: templates/js/build.js:56 +#: templates/js/build.js:62 msgid "Auto-allocate stock items to this output" msgstr "" -#: templates/js/build.js:62 -msgid "Complete build output" -msgstr "" - -#: templates/js/build.js:71 +#: templates/js/build.js:70 msgid "Unallocate stock from build output" msgstr "" -#: templates/js/build.js:77 +#: templates/js/build.js:80 +msgid "Complete build output" +msgstr "" + +#: templates/js/build.js:89 msgid "Delete build output" msgstr "" -#: templates/js/build.js:209 templates/stock_table.html:20 +#: templates/js/build.js:243 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:493 +#: templates/js/build.js:549 msgid "Required Part" msgstr "" -#: templates/js/build.js:514 +#: templates/js/build.js:570 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:582 templates/js/build.js:996 -#: templates/stock_table.html:57 +#: templates/js/build.js:638 templates/js/build.js:1056 +#: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:632 +#: templates/js/build.js:691 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:649 templates/js/part.js:323 templates/js/stock.js:511 -#: templates/js/stock.js:1254 +#: templates/js/build.js:708 templates/js/part.js:324 templates/js/part.js:546 +#: templates/js/stock.js:511 templates/js/stock.js:938 +#: templates/js/stock.js:1331 msgid "Select" msgstr "" -#: templates/js/build.js:669 +#: templates/js/build.js:728 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:767 +#: templates/js/build.js:827 msgid "No parts allocated for" msgstr "" @@ -6056,17 +6342,23 @@ msgid "No company information found" msgstr "" #: templates/js/company.js:129 -msgid "No supplier parts found" +msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:147 templates/js/part.js:59 templates/js/part.js:144 +#: templates/js/company.js:148 templates/js/company.js:246 +#: templates/js/part.js:60 templates/js/part.js:145 msgid "Template part" msgstr "" -#: templates/js/company.js:151 templates/js/part.js:63 templates/js/part.js:148 +#: templates/js/company.js:152 templates/js/company.js:250 +#: templates/js/part.js:64 templates/js/part.js:149 msgid "Assembled part" msgstr "" +#: templates/js/company.js:227 +msgid "No supplier parts found" +msgstr "" + #: templates/js/filters.js:193 msgid "Select filter" msgstr "" @@ -6148,11 +6440,6 @@ msgstr "" msgid "Submit" msgstr "" -#: templates/js/modals.js:550 templates/js/modals.js:809 -#: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93 -msgid "Close" -msgstr "" - #: templates/js/modals.js:760 msgid "Invalid response from server" msgstr "" @@ -6233,59 +6520,63 @@ msgstr "" msgid "No sales orders found" msgstr "" -#: templates/js/part.js:51 templates/js/part.js:136 +#: templates/js/part.js:52 templates/js/part.js:137 msgid "Trackable part" msgstr "" -#: templates/js/part.js:55 templates/js/part.js:140 +#: templates/js/part.js:56 templates/js/part.js:141 msgid "Virtual part" msgstr "" -#: templates/js/part.js:67 +#: templates/js/part.js:68 msgid "Starred part" msgstr "" -#: templates/js/part.js:71 +#: templates/js/part.js:72 msgid "Salable part" msgstr "" -#: templates/js/part.js:185 +#: templates/js/part.js:186 msgid "No variants found" msgstr "" -#: templates/js/part.js:271 templates/js/part.js:451 +#: templates/js/part.js:272 templates/js/part.js:452 msgid "No parts found" msgstr "" -#: templates/js/part.js:390 +#: templates/js/part.js:391 msgid "No category" msgstr "" -#: templates/js/part.js:408 templates/js/table_filters.js:296 +#: templates/js/part.js:409 templates/js/table_filters.js:318 msgid "Low stock" msgstr "" -#: templates/js/part.js:511 +#: templates/js/part.js:571 templates/js/stock.js:962 +msgid "Path" +msgstr "" + +#: templates/js/part.js:588 msgid "YES" msgstr "" -#: templates/js/part.js:513 +#: templates/js/part.js:590 msgid "NO" msgstr "" -#: templates/js/part.js:547 +#: templates/js/part.js:624 msgid "No test templates matching query" msgstr "" -#: templates/js/part.js:598 templates/js/stock.js:75 +#: templates/js/part.js:675 templates/js/stock.js:75 msgid "Edit test result" msgstr "" -#: templates/js/part.js:599 templates/js/stock.js:76 +#: templates/js/part.js:676 templates/js/stock.js:76 msgid "Delete test result" msgstr "" -#: templates/js/part.js:605 +#: templates/js/part.js:682 msgid "This test is defined for a parent part" msgstr "" @@ -6399,6 +6690,18 @@ msgstr "" msgid "No stock items matching query" msgstr "" +#: templates/js/stock.js:357 +msgid "items" +msgstr "" + +#: templates/js/stock.js:449 +msgid "batches" +msgstr "" + +#: templates/js/stock.js:476 +msgid "locations" +msgstr "" + #: templates/js/stock.js:478 msgid "Undefined location" msgstr "" @@ -6443,7 +6746,7 @@ msgstr "" msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:620 templates/js/table_filters.js:116 +#: templates/js/stock.js:620 templates/js/table_filters.js:138 msgid "Depleted" msgstr "" @@ -6467,31 +6770,31 @@ msgstr "" msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:973 +#: templates/js/stock.js:1050 msgid "No user information" msgstr "" -#: templates/js/stock.js:983 +#: templates/js/stock.js:1060 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:984 +#: templates/js/stock.js:1061 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1093 +#: templates/js/stock.js:1170 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1192 +#: templates/js/stock.js:1269 msgid "Serial" msgstr "" -#: templates/js/stock.js:1285 templates/js/table_filters.js:149 +#: templates/js/stock.js:1362 templates/js/table_filters.js:171 msgid "Installed" msgstr "" -#: templates/js/stock.js:1310 +#: templates/js/stock.js:1387 msgid "Install item" msgstr "" @@ -6503,148 +6806,153 @@ msgstr "" msgid "Validated" msgstr "" -#: templates/js/table_filters.js:70 templates/js/table_filters.js:159 -msgid "Is Serialized" -msgstr "" - -#: templates/js/table_filters.js:73 templates/js/table_filters.js:166 -msgid "Serial number GTE" -msgstr "" - -#: templates/js/table_filters.js:74 templates/js/table_filters.js:167 -msgid "Serial number greater than or equal to" -msgstr "" - -#: templates/js/table_filters.js:77 templates/js/table_filters.js:170 -msgid "Serial number LTE" -msgstr "" - -#: templates/js/table_filters.js:78 templates/js/table_filters.js:171 -msgid "Serial number less than or equal to" +#: templates/js/table_filters.js:71 +msgid "Include locations" msgstr "" #: templates/js/table_filters.js:81 templates/js/table_filters.js:82 -#: templates/js/table_filters.js:162 templates/js/table_filters.js:163 -msgid "Serial number" -msgstr "" - -#: templates/js/table_filters.js:86 templates/js/table_filters.js:180 -msgid "Batch code" -msgstr "" - -#: templates/js/table_filters.js:96 templates/js/table_filters.js:263 -msgid "Active parts" -msgstr "" - -#: templates/js/table_filters.js:97 -msgid "Show stock for active parts" -msgstr "" - -#: templates/js/table_filters.js:102 -msgid "Part is an assembly" -msgstr "" - -#: templates/js/table_filters.js:106 -msgid "Is allocated" -msgstr "" - -#: templates/js/table_filters.js:107 -msgid "Item has been allocated" -msgstr "" - -#: templates/js/table_filters.js:112 -msgid "Include stock in sublocations" -msgstr "" - -#: templates/js/table_filters.js:117 -msgid "Show stock items which are depleted" -msgstr "" - -#: templates/js/table_filters.js:124 -msgid "Show stock items which have expired" -msgstr "" - -#: templates/js/table_filters.js:129 -msgid "Show stock which is close to expiring" -msgstr "" - -#: templates/js/table_filters.js:135 -msgid "Show items which are in stock" -msgstr "" - -#: templates/js/table_filters.js:139 -msgid "In Production" -msgstr "" - -#: templates/js/table_filters.js:140 -msgid "Show items which are in production" -msgstr "" - -#: templates/js/table_filters.js:144 -msgid "Include Variants" -msgstr "" - -#: templates/js/table_filters.js:145 -msgid "Include stock items for variant parts" -msgstr "" - -#: templates/js/table_filters.js:150 -msgid "Show stock items which are installed in another item" -msgstr "" - -#: templates/js/table_filters.js:154 -msgid "Sent to customer" -msgstr "" - -#: templates/js/table_filters.js:155 -msgid "Show items which have been assigned to a customer" -msgstr "" - -#: templates/js/table_filters.js:175 templates/js/table_filters.js:176 -msgid "Stock status" -msgstr "" - -#: templates/js/table_filters.js:209 -msgid "Build status" -msgstr "" - -#: templates/js/table_filters.js:228 templates/js/table_filters.js:245 -msgid "Order status" -msgstr "" - -#: templates/js/table_filters.js:233 templates/js/table_filters.js:250 -msgid "Outstanding" -msgstr "" - -#: templates/js/table_filters.js:273 +#: templates/js/table_filters.js:295 msgid "Include subcategories" msgstr "" -#: templates/js/table_filters.js:274 +#: templates/js/table_filters.js:92 templates/js/table_filters.js:181 +msgid "Is Serialized" +msgstr "" + +#: templates/js/table_filters.js:95 templates/js/table_filters.js:188 +msgid "Serial number GTE" +msgstr "" + +#: templates/js/table_filters.js:96 templates/js/table_filters.js:189 +msgid "Serial number greater than or equal to" +msgstr "" + +#: templates/js/table_filters.js:99 templates/js/table_filters.js:192 +msgid "Serial number LTE" +msgstr "" + +#: templates/js/table_filters.js:100 templates/js/table_filters.js:193 +msgid "Serial number less than or equal to" +msgstr "" + +#: templates/js/table_filters.js:103 templates/js/table_filters.js:104 +#: templates/js/table_filters.js:184 templates/js/table_filters.js:185 +msgid "Serial number" +msgstr "" + +#: templates/js/table_filters.js:108 templates/js/table_filters.js:202 +msgid "Batch code" +msgstr "" + +#: templates/js/table_filters.js:118 templates/js/table_filters.js:285 +msgid "Active parts" +msgstr "" + +#: templates/js/table_filters.js:119 +msgid "Show stock for active parts" +msgstr "" + +#: templates/js/table_filters.js:124 +msgid "Part is an assembly" +msgstr "" + +#: templates/js/table_filters.js:128 +msgid "Is allocated" +msgstr "" + +#: templates/js/table_filters.js:129 +msgid "Item has been allocated" +msgstr "" + +#: templates/js/table_filters.js:134 +msgid "Include stock in sublocations" +msgstr "" + +#: templates/js/table_filters.js:139 +msgid "Show stock items which are depleted" +msgstr "" + +#: templates/js/table_filters.js:146 +msgid "Show stock items which have expired" +msgstr "" + +#: templates/js/table_filters.js:151 +msgid "Show stock which is close to expiring" +msgstr "" + +#: templates/js/table_filters.js:157 +msgid "Show items which are in stock" +msgstr "" + +#: templates/js/table_filters.js:161 +msgid "In Production" +msgstr "" + +#: templates/js/table_filters.js:162 +msgid "Show items which are in production" +msgstr "" + +#: templates/js/table_filters.js:166 +msgid "Include Variants" +msgstr "" + +#: templates/js/table_filters.js:167 +msgid "Include stock items for variant parts" +msgstr "" + +#: templates/js/table_filters.js:172 +msgid "Show stock items which are installed in another item" +msgstr "" + +#: templates/js/table_filters.js:176 +msgid "Sent to customer" +msgstr "" + +#: templates/js/table_filters.js:177 +msgid "Show items which have been assigned to a customer" +msgstr "" + +#: templates/js/table_filters.js:197 templates/js/table_filters.js:198 +msgid "Stock status" +msgstr "" + +#: templates/js/table_filters.js:231 +msgid "Build status" +msgstr "" + +#: templates/js/table_filters.js:250 templates/js/table_filters.js:267 +msgid "Order status" +msgstr "" + +#: templates/js/table_filters.js:255 templates/js/table_filters.js:272 +msgid "Outstanding" +msgstr "" + +#: templates/js/table_filters.js:296 msgid "Include parts in subcategories" msgstr "" -#: templates/js/table_filters.js:278 +#: templates/js/table_filters.js:300 msgid "Has IPN" msgstr "" -#: templates/js/table_filters.js:279 +#: templates/js/table_filters.js:301 msgid "Part has internal part number" msgstr "" -#: templates/js/table_filters.js:284 +#: templates/js/table_filters.js:306 msgid "Show active parts" msgstr "" -#: templates/js/table_filters.js:292 +#: templates/js/table_filters.js:314 msgid "Stock available" msgstr "" -#: templates/js/table_filters.js:308 +#: templates/js/table_filters.js:330 msgid "Starred" msgstr "" -#: templates/js/table_filters.js:320 +#: templates/js/table_filters.js:342 msgid "Purchasable" msgstr "" @@ -6705,6 +7013,10 @@ msgstr "" msgid "Form errors exist" msgstr "" +#: templates/navbar.html:13 +msgid "Toggle navigation" +msgstr "" + #: templates/navbar.html:33 msgid "Buy" msgstr "" @@ -6717,19 +7029,19 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:71 users/models.py:36 +#: templates/navbar.html:77 users/models.py:38 msgid "Admin" msgstr "" -#: templates/navbar.html:73 +#: templates/navbar.html:79 msgid "Logout" msgstr "" -#: templates/navbar.html:75 templates/registration/login.html:89 +#: templates/navbar.html:81 templates/registration/login.html:90 msgid "Login" msgstr "" -#: templates/navbar.html:94 +#: templates/navbar.html:104 msgid "About InvenTree" msgstr "" @@ -6737,73 +7049,67 @@ msgstr "" msgid "QR data not provided" msgstr "" -#: templates/registration/logged_out.html:50 +#: templates/registration/logged_out.html:51 msgid "You have been logged out" msgstr "" -#: templates/registration/logged_out.html:51 -#: templates/registration/password_reset_complete.html:51 -#: templates/registration/password_reset_done.html:58 +#: templates/registration/logged_out.html:52 +#: templates/registration/password_reset_complete.html:52 +#: templates/registration/password_reset_done.html:59 msgid "Return to login screen" msgstr "" -#: templates/registration/login.html:64 +#: templates/registration/login.html:65 msgid "Enter username" msgstr "" -#: templates/registration/login.html:70 +#: templates/registration/login.html:71 msgid "Password" msgstr "" -#: templates/registration/login.html:83 +#: templates/registration/login.html:84 msgid "Username / password combination is incorrect" msgstr "" -#: templates/registration/login.html:95 -#: templates/registration/password_reset_form.html:51 +#: templates/registration/login.html:96 +#: templates/registration/password_reset_form.html:52 msgid "Forgotten your password?" msgstr "" -#: templates/registration/login.html:95 +#: templates/registration/login.html:96 msgid "Click here to reset" msgstr "" -#: templates/registration/password_reset_complete.html:50 +#: templates/registration/password_reset_complete.html:51 msgid "Password reset complete" msgstr "" -#: templates/registration/password_reset_confirm.html:52 -#: templates/registration/password_reset_confirm.html:56 +#: templates/registration/password_reset_confirm.html:53 +#: templates/registration/password_reset_confirm.html:57 msgid "Change password" msgstr "" -#: templates/registration/password_reset_confirm.html:60 -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." +#: templates/registration/password_reset_confirm.html:61 +msgid "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." msgstr "" -#: templates/registration/password_reset_done.html:51 -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." +#: templates/registration/password_reset_done.html:52 +msgid "We've emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly." msgstr "" -#: templates/registration/password_reset_done.html:54 -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#: templates/registration/password_reset_form.html:52 -msgid "Enter your email address below." +#: templates/registration/password_reset_done.html:55 +msgid "If you don't receive an email, please make sure you've entered the address you registered with, and check your spam folder." msgstr "" #: templates/registration/password_reset_form.html:53 +msgid "Enter your email address below." +msgstr "" + +#: templates/registration/password_reset_form.html:54 msgid "An email will be sent with password reset instructions." msgstr "" -#: templates/registration/password_reset_form.html:58 +#: templates/registration/password_reset_form.html:59 msgid "Send email" msgstr "" @@ -6851,58 +7157,58 @@ msgstr "" msgid "Barcode Actions" msgstr "" -#: templates/stock_table.html:36 -msgid "Printing Actions" -msgstr "" - -#: templates/stock_table.html:40 -msgid "Print labels" -msgstr "" - -#: templates/stock_table.html:42 +#: templates/stock_table.html:43 msgid "Print test reports" msgstr "" -#: templates/stock_table.html:53 +#: templates/stock_table.html:55 msgid "Add to selected stock items" msgstr "" -#: templates/stock_table.html:54 +#: templates/stock_table.html:56 msgid "Remove from selected stock items" msgstr "" -#: templates/stock_table.html:55 +#: templates/stock_table.html:57 msgid "Stocktake selected stock items" msgstr "" -#: templates/stock_table.html:56 +#: templates/stock_table.html:58 msgid "Move selected stock items" msgstr "" -#: templates/stock_table.html:56 +#: templates/stock_table.html:58 msgid "Move stock" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:59 msgid "Order selected items" msgstr "" -#: templates/stock_table.html:58 +#: templates/stock_table.html:60 msgid "Change status" msgstr "" -#: templates/stock_table.html:58 +#: templates/stock_table.html:60 msgid "Change stock status" msgstr "" -#: templates/stock_table.html:61 +#: templates/stock_table.html:63 msgid "Delete selected items" msgstr "" -#: templates/stock_table.html:61 +#: templates/stock_table.html:63 msgid "Delete Stock" msgstr "" +#: templates/yesnolabel.html:4 +msgid "Yes" +msgstr "" + +#: templates/yesnolabel.html:6 +msgid "No" +msgstr "" + #: users/admin.py:64 msgid "Users" msgstr "" @@ -6927,34 +7233,34 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:165 +#: users/models.py:170 msgid "Permission set" msgstr "" -#: users/models.py:173 +#: users/models.py:178 msgid "Group" msgstr "" -#: users/models.py:176 +#: users/models.py:181 msgid "View" msgstr "" -#: users/models.py:176 +#: users/models.py:181 msgid "Permission to view items" msgstr "" -#: users/models.py:178 +#: users/models.py:183 msgid "Permission to add items" msgstr "" -#: users/models.py:180 +#: users/models.py:185 msgid "Change" msgstr "" -#: users/models.py:180 +#: users/models.py:185 msgid "Permissions to edit items" msgstr "" -#: users/models.py:182 +#: users/models.py:187 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/es/LC_MESSAGES/django.mo b/InvenTree/locale/es/LC_MESSAGES/django.mo index 71cbdf3e9d8d54be31066ec4ad8628bc2c1f2845..2343941a2a4bb6c1a1b8e2cf6c46bc2766f09be7 100644 GIT binary patch delta 91 zcmeyvbew5|3M21CRgH-;TAoG*MuxfuCb~w33I>)|#>QMeiNz(lAw`LK#W{&3`9)R= mK#{!k(!}&s-H_D8Tq}j(g2cSc;taU3l|pK9yle2puk8Tgg&mv# delta 161 zcmX@k^oMDJ3Zv6RRSo_CM`v$GcUOfl*Pvief4_;oTJ@2xjzPM<{<%0zOD*3uD*_*J`Rp9E8ZLQsfoE(3OJ$+qu!%~ZiGxPJT6bvU`C\n" +msgid "" +"There are %(count)s parts sourced from this company.
\n" "If this supplier is deleted, these supplier part entries will also be deleted." msgstr "" @@ -2033,7 +2039,7 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:440 +#: company/templates/company/detail.html:67 order/models.py:450 #: order/templates/order/sales_order_base.html:92 stock/models.py:415 #: stock/models.py:416 stock/templates/stock/item_base.html:251 #: templates/js/company.js:40 templates/js/order.js:267 @@ -2122,13 +2128,13 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:42 -#: order/templates/order/purchase_order_detail.html:75 +#: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 -#: order/templates/order/purchase_order_detail.html:74 +#: order/templates/order/purchase_order_detail.html:49 #: part/templates/part/supplier.html:17 templates/js/stock.js:1163 msgid "New Supplier Part" msgstr "" @@ -2226,7 +2232,7 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:184 +#: stock/views.py:1002 users/models.py:187 msgid "Delete" msgstr "" @@ -2252,7 +2258,7 @@ msgstr "" #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 #: templates/InvenTree/search.html:198 templates/js/stock.js:968 -#: templates/stats.html:72 templates/stats.html:81 users/models.py:40 +#: templates/stats.html:72 templates/stats.html:81 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2266,7 +2272,7 @@ msgstr "" #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46 -#: users/models.py:43 +#: users/models.py:45 msgid "Sales Orders" msgstr "" @@ -2278,7 +2284,7 @@ msgstr "" #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37 -#: users/models.py:42 +#: users/models.py:44 msgid "Purchase Orders" msgstr "" @@ -2357,7 +2363,7 @@ msgid "Pricing Information" msgstr "" #: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2624 +#: part/templates/part/sale_prices.html:17 part/views.py:2636 msgid "Add Price Break" msgstr "" @@ -2467,15 +2473,15 @@ msgstr "" msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2628 +#: company/views.py:799 part/views.py:2640 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2672 +#: company/views.py:855 part/views.py:2684 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2686 +#: company/views.py:870 part/views.py:2698 msgid "Delete Price Break" msgstr "" @@ -2565,7 +2571,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:452 +#: order/forms.py:145 order/models.py:462 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2601,7 +2607,7 @@ msgstr "" msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:445 +#: order/models.py:182 order/models.py:455 msgid "Purchase order status" msgstr "" @@ -2642,8 +2648,8 @@ msgstr "" msgid "Date order was completed" msgstr "" -#: order/models.py:243 order/models.py:342 part/views.py:1586 -#: stock/models.py:270 stock/models.py:953 +#: order/models.py:243 part/views.py:1586 stock/models.py:270 +#: stock/models.py:953 msgid "Quantity must be greater than zero" msgstr "" @@ -2651,120 +2657,128 @@ msgstr "" msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:337 +#: order/models.py:344 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:359 +#: order/models.py:348 +msgid "Quantity must be an integer" +msgstr "" + +#: order/models.py:350 +msgid "Quantity must be a positive number" +msgstr "" + +#: order/models.py:369 msgid "Received items" msgstr "" -#: order/models.py:441 +#: order/models.py:451 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer Reference " msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer order reference code" msgstr "" -#: order/models.py:455 templates/js/order.js:303 +#: order/models.py:465 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:462 +#: order/models.py:472 msgid "shipped by" msgstr "" -#: order/models.py:506 +#: order/models.py:516 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:593 +#: order/models.py:603 msgid "Item quantity" msgstr "" -#: order/models.py:595 +#: order/models.py:605 msgid "Line item reference" msgstr "" -#: order/models.py:597 +#: order/models.py:607 msgid "Line item notes" msgstr "" -#: order/models.py:623 order/models.py:667 +#: order/models.py:633 order/models.py:677 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:624 order/templates/order/order_base.html:9 +#: order/models.py:634 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:313 templates/js/order.js:148 msgid "Purchase Order" msgstr "" -#: order/models.py:638 +#: order/models.py:648 msgid "Supplier part" msgstr "" -#: order/models.py:641 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:214 +#: order/models.py:651 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:189 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:131 msgid "Received" msgstr "" -#: order/models.py:641 +#: order/models.py:651 msgid "Number of items received" msgstr "" -#: order/models.py:648 stock/models.py:508 +#: order/models.py:658 stock/models.py:508 #: stock/templates/stock/item_base.html:320 msgid "Purchase Price" msgstr "" -#: order/models.py:649 +#: order/models.py:659 msgid "Unit purchase price" msgstr "" -#: order/models.py:743 order/models.py:745 +#: order/models.py:753 order/models.py:755 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:749 +#: order/models.py:759 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:751 +#: order/models.py:761 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:754 +#: order/models.py:764 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:764 +#: order/models.py:774 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:769 +#: order/models.py:779 msgid "Line" msgstr "" -#: order/models.py:780 +#: order/models.py:790 msgid "Item" msgstr "" -#: order/models.py:781 +#: order/models.py:791 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:784 +#: order/models.py:794 msgid "Enter stock allocation quantity" msgstr "" @@ -2812,9 +2826,22 @@ msgstr "" msgid "Issued" msgstr "" -#: order/templates/order/order_cancel.html:7 -#: order/templates/order/sales_order_cancel.html:9 -msgid "Cancelling this order means that the order will no longer be editable." +#: order/templates/order/order_base.html:180 +#: order/templates/order/purchase_order_detail.html:100 +#: part/templates/part/category.html:185 part/templates/part/category.html:227 +#: stock/templates/stock/location.html:191 templates/js/stock.js:708 +#: templates/js/stock.js:1169 +msgid "New Location" +msgstr "" + +#: order/templates/order/order_base.html:181 +#: order/templates/order/purchase_order_detail.html:101 +#: stock/templates/stock/location.html:42 +msgid "Create new stock location" +msgstr "" + +#: order/templates/order/order_cancel.html:8 +msgid "Cancelling this order means that the order and line items will no longer be editable." msgstr "" #: order/templates/order/order_complete.html:7 @@ -2826,10 +2853,10 @@ msgid "This order has line items which have not been marked as received." msgstr "" #: order/templates/order/order_complete.html:11 -msgid "Marking this order as complete will remove these line items." +msgid "Completing this order means that the order and line items will no longer be editable." msgstr "" -#: order/templates/order/order_issue.html:7 +#: order/templates/order/order_issue.html:8 msgid "After placing this purchase order, line items will no longer be editable." msgstr "" @@ -2881,11 +2908,13 @@ msgid "Select Purchase Order" msgstr "" #: order/templates/order/order_wizard/select_pos.html:45 -msgid "Create new purchase order for {{ supplier.name }}" +#, python-format +msgid "Create new purchase order for %(name)s" msgstr "" #: order/templates/order/order_wizard/select_pos.html:68 -msgid "Select a purchase order for" +#, python-format +msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 @@ -2907,43 +2936,29 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1108 -#: order/views.py:1191 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1120 +#: order/views.py:1203 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:45 -#: order/templates/order/purchase_order_detail.html:125 -#: part/templates/part/category.html:185 part/templates/part/category.html:227 -#: stock/templates/stock/location.html:191 templates/js/stock.js:708 -#: templates/js/stock.js:1169 -msgid "New Location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:46 -#: order/templates/order/purchase_order_detail.html:126 -#: stock/templates/stock/location.html:42 -msgid "Create new stock location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:139 +#: order/templates/order/purchase_order_detail.html:114 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:205 +#: order/templates/order/purchase_order_detail.html:180 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:221 #: order/templates/order/sales_order_detail.html:294 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:247 +#: order/templates/order/purchase_order_detail.html:222 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:227 msgid "Receive line item" msgstr "" @@ -2966,7 +2981,7 @@ msgstr "" #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:577 #: templates/navbar.html:23 templates/stats.html:59 templates/stats.html:68 -#: users/models.py:38 +#: users/models.py:40 msgid "Parts" msgstr "" @@ -3019,6 +3034,10 @@ msgstr "" msgid "Warning" msgstr "" +#: order/templates/order/sales_order_cancel.html:9 +msgid "Cancelling this order means that the order will no longer be editable." +msgstr "" + #: order/templates/order/sales_order_detail.html:13 msgid "Sales Order Items" msgstr "" @@ -3213,65 +3232,65 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1060 +#: order/views.py:1069 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1117 +#: order/views.py:1129 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1123 +#: order/views.py:1135 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1242 order/views.py:1260 +#: order/views.py:1254 order/views.py:1272 msgid "Edit Line Item" msgstr "" -#: order/views.py:1276 order/views.py:1288 +#: order/views.py:1288 order/views.py:1300 msgid "Delete Line Item" msgstr "" -#: order/views.py:1281 order/views.py:1293 +#: order/views.py:1293 order/views.py:1305 msgid "Deleted line item" msgstr "" -#: order/views.py:1306 +#: order/views.py:1318 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1351 +#: order/views.py:1363 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1367 +#: order/views.py:1379 msgid "Select line item" msgstr "" -#: order/views.py:1398 +#: order/views.py:1410 msgid "No matching item for serial" msgstr "" -#: order/views.py:1408 +#: order/views.py:1420 msgid "is not in stock" msgstr "" -#: order/views.py:1416 +#: order/views.py:1428 msgid "already allocated to an order" msgstr "" -#: order/views.py:1470 +#: order/views.py:1482 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1544 +#: order/views.py:1556 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1559 +#: order/views.py:1571 msgid "Remove allocation" msgstr "" @@ -3457,7 +3476,7 @@ msgstr "" #: part/models.py:83 part/templates/part/category.html:23 #: part/templates/part/category.html:94 part/templates/part/category.html:141 #: templates/InvenTree/search.html:127 templates/stats.html:63 -#: users/models.py:37 +#: users/models.py:39 msgid "Part Categories" msgstr "" @@ -4004,7 +4023,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2270 +#: part/templates/part/category.html:29 part/views.py:2282 msgid "Create new part category" msgstr "" @@ -4694,63 +4713,63 @@ msgstr "" msgid "Part Pricing" msgstr "" -#: part/views.py:2069 +#: part/views.py:2081 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2079 +#: part/views.py:2091 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2086 +#: part/views.py:2098 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2094 +#: part/views.py:2106 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2144 +#: part/views.py:2156 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2158 +#: part/views.py:2170 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2218 +#: part/views.py:2230 msgid "Edit Part Category" msgstr "" -#: part/views.py:2256 +#: part/views.py:2268 msgid "Delete Part Category" msgstr "" -#: part/views.py:2262 +#: part/views.py:2274 msgid "Part category was deleted" msgstr "" -#: part/views.py:2314 +#: part/views.py:2326 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2415 +#: part/views.py:2427 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2471 +#: part/views.py:2483 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2490 +#: part/views.py:2502 msgid "Create BOM Item" msgstr "" -#: part/views.py:2560 +#: part/views.py:2572 msgid "Edit BOM item" msgstr "" -#: part/views.py:2616 +#: part/views.py:2628 msgid "Confim BOM item deletion" msgstr "" @@ -5301,15 +5320,15 @@ msgid "Stock adjustment actions" msgstr "" #: stock/templates/stock/item_base.html:164 -#: stock/templates/stock/location.html:65 templates/stock_table.html:56 +#: stock/templates/stock/location.html:65 templates/stock_table.html:57 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:167 templates/stock_table.html:54 +#: stock/templates/stock/item_base.html:167 templates/stock_table.html:55 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:170 templates/stock_table.html:55 +#: stock/templates/stock/item_base.html:170 templates/stock_table.html:56 msgid "Remove stock" msgstr "" @@ -5503,7 +5522,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:76 users/models.py:39 +#: templates/stats.html:76 users/models.py:41 msgid "Stock Locations" msgstr "" @@ -5689,7 +5708,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:180 +#: stock/views.py:1001 users/models.py:183 msgid "Add" msgstr "" @@ -5867,6 +5886,31 @@ msgstr "" msgid "No stock location set" msgstr "" +#: templates/InvenTree/settings/appearance.html:10 +msgid "Theme Settings" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:17 +msgid "Color Themes" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:29 +#, python-format +msgid "" +"\n" +" The CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" +" Please select another color theme :)\n" +" " +msgstr "" + +#: templates/InvenTree/settings/appearance.html:39 +msgid "Language" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:61 +msgid "Set Language" +msgstr "" + #: templates/InvenTree/settings/build.html:10 msgid "Build Order Settings" msgstr "" @@ -5950,7 +5994,7 @@ msgstr "" msgid "Stock Settings" msgstr "" -#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:49 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:50 msgid "Stock Options" msgstr "" @@ -5964,7 +6008,7 @@ msgid "Account" msgstr "" #: templates/InvenTree/settings/tabs.html:9 -msgid "Theme" +msgid "Appearance" msgstr "" #: templates/InvenTree/settings/tabs.html:13 @@ -5983,22 +6027,6 @@ msgstr "" msgid "Categories" 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" -"\t\tThe CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" -"\t\tPlease select another color theme :)\n" -"\t" -msgstr "" - #: templates/InvenTree/settings/user.html:16 msgid "User Information" msgstr "" @@ -6061,13 +6089,23 @@ msgid "View Code on GitHub" msgstr "" #: templates/about.html:63 -msgid "Get the App" +msgid "Credits" msgstr "" #: templates/about.html:68 +msgid "Mobile App" +msgstr "" + +#: templates/about.html:73 msgid "Submit Bug Report" msgstr "" +#: templates/about.html:82 templates/js/modals.js:550 +#: templates/js/modals.js:809 templates/modals.html:28 templates/modals.html:52 +#: templates/modals.html:93 +msgid "Close" +msgstr "" + #: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "" @@ -6263,7 +6301,7 @@ msgid "Quantity Per" msgstr "" #: templates/js/build.js:638 templates/js/build.js:1056 -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order stock" msgstr "" @@ -6396,11 +6434,6 @@ msgstr "" msgid "Submit" msgstr "" -#: templates/js/modals.js:550 templates/js/modals.js:809 -#: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93 -msgid "Close" -msgstr "" - #: templates/js/modals.js:760 msgid "Invalid response from server" msgstr "" @@ -6974,6 +7007,10 @@ msgstr "" msgid "Form errors exist" msgstr "" +#: templates/navbar.html:13 +msgid "Toggle navigation" +msgstr "" + #: templates/navbar.html:33 msgid "Buy" msgstr "" @@ -6986,7 +7023,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:36 +#: templates/navbar.html:77 users/models.py:38 msgid "Admin" msgstr "" @@ -7118,43 +7155,43 @@ msgstr "" msgid "Print test reports" msgstr "" -#: templates/stock_table.html:54 +#: templates/stock_table.html:55 msgid "Add to selected stock items" msgstr "" -#: templates/stock_table.html:55 +#: templates/stock_table.html:56 msgid "Remove from selected stock items" msgstr "" -#: templates/stock_table.html:56 +#: templates/stock_table.html:57 msgid "Stocktake selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move stock" msgstr "" -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order selected items" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change status" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change stock status" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete selected items" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete Stock" msgstr "" @@ -7190,34 +7227,34 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:167 +#: users/models.py:170 msgid "Permission set" msgstr "" -#: users/models.py:175 +#: users/models.py:178 msgid "Group" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "View" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "Permission to view items" msgstr "" -#: users/models.py:180 +#: users/models.py:183 msgid "Permission to add items" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Change" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Permissions to edit items" msgstr "" -#: users/models.py:184 +#: users/models.py:187 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/fr/LC_MESSAGES/django.mo b/InvenTree/locale/fr/LC_MESSAGES/django.mo index 2c90dd0c81aca562856271a6885816b565885734..71c5e169163d4e95748145ef537da8839930b0c2 100644 GIT binary patch delta 90 zcmey(bd+g=3M2PKRgH-;S{_CQMuxfuCb~w33I>)|#>QMeiNz(lAw`LK#W{&3`9)R= lK#{!k(!}&s-H_D8Tq^~)qSUZ2-TA9Tflo delta 161 zcmX@g^qXmd3ZvshRSo_CM`v$GcUOfl*Pvief4_;oTJ@2xjzPM<{<%0zOD*3uD*_*J`Rp9E8ZLQsfoE(3OJ$+qu!%~ZiGxPJT6bvVxF9QHO CfH83Z diff --git a/InvenTree/locale/fr/LC_MESSAGES/django.po b/InvenTree/locale/fr/LC_MESSAGES/django.po index f344b4140c..ae5d861fa2 100644 --- a/InvenTree/locale/fr/LC_MESSAGES/django.po +++ b/InvenTree/locale/fr/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-21 09:17+0000\n" +"POT-Creation-Date: 2021-05-05 17:33+1000\n" "PO-Revision-Date: 2021-04-21 09:33\n" "Last-Translator: \n" "Language-Team: French\n" @@ -67,35 +67,36 @@ msgstr "" msgid "Select Category" msgstr "" -#: InvenTree/helpers.py:375 order/models.py:245 order/models.py:344 -#: stock/views.py:1763 -msgid "Invalid quantity provided" -msgstr "" - -#: InvenTree/helpers.py:378 -msgid "Empty serial number string" -msgstr "" - -#: InvenTree/helpers.py:399 +#: InvenTree/helpers.py:377 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:403 InvenTree/helpers.py:406 InvenTree/helpers.py:409 +#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:353 +#: stock/views.py:1763 +msgid "Invalid quantity provided" +msgstr "" + +#: InvenTree/helpers.py:387 +msgid "Empty serial number string" +msgstr "" + +#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 +#: InvenTree/helpers.py:440 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:414 +#: InvenTree/helpers.py:445 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:422 +#: InvenTree/helpers.py:453 msgid "No serial numbers found" msgstr "" -#: InvenTree/helpers.py:426 +#: InvenTree/helpers.py:457 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" @@ -140,7 +141,7 @@ msgstr "" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:108 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:168 +#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -165,23 +166,23 @@ msgstr "" msgid "parent" msgstr "" -#: InvenTree/settings.py:493 +#: InvenTree/settings.py:491 msgid "English" msgstr "" -#: InvenTree/settings.py:494 +#: InvenTree/settings.py:492 msgid "French" msgstr "" -#: InvenTree/settings.py:495 +#: InvenTree/settings.py:493 msgid "German" msgstr "" -#: InvenTree/settings.py:496 +#: InvenTree/settings.py:494 msgid "Polish" msgstr "" -#: InvenTree/settings.py:497 +#: InvenTree/settings.py:495 msgid "Turkish" msgstr "" @@ -375,16 +376,16 @@ msgstr "" msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1227 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1241 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:123 #: build/templates/build/detail.html:31 common/models.py:703 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:239 order/forms.py:261 -#: order/forms.py:278 order/models.py:593 order/models.py:784 +#: order/forms.py:278 order/models.py:603 order/models.py:794 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:200 +#: order/templates/order/purchase_order_detail.html:175 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:159 @@ -458,7 +459,7 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:59 order/models.py:445 +#: build/templates/build/detail.html:59 order/models.py:455 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:392 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:770 @@ -508,7 +509,7 @@ msgstr "" #: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 #: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:31 users/models.py:41 +#: templates/InvenTree/settings/tabs.html:31 users/models.py:43 msgid "Build Orders" msgstr "" @@ -516,8 +517,8 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:127 order/models.py:99 order/models.py:595 -#: order/templates/order/purchase_order_detail.html:195 +#: build/models.py:127 order/models.py:99 order/models.py:605 +#: order/templates/order/purchase_order_detail.html:170 #: order/templates/order/sales_order_detail.html:219 part/models.py:2187 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -540,10 +541,10 @@ msgstr "" #: build/models.py:152 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:118 -#: build/templates/build/detail.html:26 company/models.py:669 -#: order/models.py:637 order/models.py:669 +#: build/templates/build/detail.html:26 company/models.py:688 +#: order/models.py:647 order/models.py:679 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:156 +#: order/templates/order/purchase_order_detail.html:131 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:207 part/models.py:321 #: part/models.py:1876 part/models.py:1888 part/models.py:1906 @@ -628,7 +629,7 @@ msgstr "" msgid "Creation Date" msgstr "" -#: build/models.py:223 order/models.py:451 +#: build/models.py:223 order/models.py:461 msgid "Target completion date" msgstr "" @@ -678,9 +679,9 @@ msgstr "" #: company/models.py:135 company/models.py:501 #: company/templates/company/navbar.html:70 #: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:597 order/templates/order/po_navbar.html:29 +#: order/models.py:607 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:234 +#: order/templates/order/purchase_order_detail.html:209 #: order/templates/order/sales_order_detail.html:264 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 @@ -713,47 +714,47 @@ msgstr "" msgid "Completed build output" msgstr "" -#: build/models.py:1118 +#: build/models.py:1132 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1143 +#: build/models.py:1157 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "" -#: build/models.py:1147 +#: build/models.py:1161 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1151 +#: build/models.py:1165 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1158 order/models.py:758 +#: build/models.py:1172 order/models.py:768 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1162 order/models.py:761 +#: build/models.py:1176 order/models.py:771 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1166 +#: build/models.py:1180 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1206 stock/templates/stock/item_base.html:306 +#: build/models.py:1220 stock/templates/stock/item_base.html:306 #: templates/InvenTree/search.html:183 templates/js/build.js:714 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1207 +#: build/models.py:1221 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1214 part/templates/part/allocation.html:18 +#: build/models.py:1228 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -765,19 +766,19 @@ msgstr "" msgid "Stock Item" msgstr "" -#: build/models.py:1215 +#: build/models.py:1229 msgid "Source stock item" msgstr "" -#: build/models.py:1228 +#: build/models.py:1242 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1236 +#: build/models.py:1250 msgid "Install into" msgstr "" -#: build/models.py:1237 +#: build/models.py:1251 msgid "Destination stock item" msgstr "" @@ -801,7 +802,7 @@ msgstr "" msgid "Unallocate stock" msgstr "" -#: build/templates/build/allocate.html:26 build/views.py:308 build/views.py:794 +#: build/templates/build/allocate.html:26 build/views.py:319 build/views.py:805 msgid "Unallocate Stock" msgstr "" @@ -811,7 +812,7 @@ msgstr "" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:794 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:795 #: part/templates/part/category.html:127 msgid "Order Parts" msgstr "" @@ -954,7 +955,7 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:160 -#: build/templates/build/detail.html:84 order/models.py:667 +#: build/templates/build/detail.html:84 order/models.py:677 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:33 #: order/templates/order/sales_order_ship.html:25 @@ -1139,7 +1140,7 @@ msgstr "" msgid "Alter the quantity of stock allocated to the build output" msgstr "" -#: build/templates/build/index.html:28 build/views.py:667 +#: build/templates/build/index.html:28 build/views.py:678 msgid "New Build Order" msgstr "" @@ -1226,141 +1227,145 @@ msgstr "" msgid "Create Build Output" msgstr "" -#: build/views.py:173 stock/models.py:969 stock/views.py:1789 +#: build/views.py:168 +msgid "Maximum output quantity is " +msgstr "" + +#: build/views.py:184 stock/models.py:969 stock/views.py:1789 msgid "Serial numbers already exist" msgstr "" -#: build/views.py:182 +#: build/views.py:193 msgid "Serial numbers required for trackable build output" msgstr "" -#: build/views.py:248 +#: build/views.py:259 msgid "Delete Build Output" msgstr "" -#: build/views.py:269 build/views.py:359 +#: build/views.py:280 build/views.py:370 msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:270 build/views.py:360 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:425 msgid "Check the confirmation box" msgstr "" -#: build/views.py:282 +#: build/views.py:293 msgid "Build output does not match build" msgstr "" -#: build/views.py:284 build/views.py:485 +#: build/views.py:295 build/views.py:496 msgid "Build output must be specified" msgstr "" -#: build/views.py:296 +#: build/views.py:307 msgid "Build output deleted" msgstr "" -#: build/views.py:394 +#: build/views.py:405 msgid "Complete Build Order" msgstr "" -#: build/views.py:400 +#: build/views.py:411 msgid "Build order cannot be completed - incomplete outputs remain" msgstr "" -#: build/views.py:411 +#: build/views.py:422 msgid "Completed build order" msgstr "" -#: build/views.py:427 +#: build/views.py:438 msgid "Complete Build Output" msgstr "" -#: build/views.py:469 +#: build/views.py:480 msgid "Invalid stock status value selected" msgstr "" -#: build/views.py:476 +#: build/views.py:487 msgid "Quantity to complete cannot exceed build output quantity" msgstr "" -#: build/views.py:482 +#: build/views.py:493 msgid "Confirm completion of incomplete build" msgstr "" -#: build/views.py:581 +#: build/views.py:592 msgid "Build output completed" msgstr "" -#: build/views.py:721 +#: build/views.py:732 msgid "Created new build" msgstr "" -#: build/views.py:742 +#: build/views.py:753 msgid "Edit Build Order Details" msgstr "" -#: build/views.py:775 +#: build/views.py:786 msgid "Edited build" msgstr "" -#: build/views.py:784 +#: build/views.py:795 msgid "Delete Build Order" msgstr "" -#: build/views.py:799 +#: build/views.py:810 msgid "Removed parts from build allocation" msgstr "" -#: build/views.py:811 +#: build/views.py:822 msgid "Allocate stock to build output" msgstr "" -#: build/views.py:854 +#: build/views.py:865 msgid "Item must be currently in stock" msgstr "" -#: build/views.py:860 +#: build/views.py:871 msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:861 templates/js/bom.js:230 templates/js/build.js:575 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:575 #: templates/js/build.js:838 templates/js/build.js:1021 msgid "Available" msgstr "" -#: build/views.py:863 +#: build/views.py:874 msgid "Stock item must be selected" msgstr "" -#: build/views.py:1026 +#: build/views.py:1037 msgid "Edit Stock Allocation" msgstr "" -#: build/views.py:1030 +#: build/views.py:1041 msgid "Updated Build Item" msgstr "" -#: build/views.py:1059 +#: build/views.py:1070 msgid "Add Build Order Attachment" msgstr "" -#: build/views.py:1072 order/views.py:110 order/views.py:162 part/views.py:172 +#: build/views.py:1083 order/views.py:110 order/views.py:162 part/views.py:172 #: stock/views.py:277 msgid "Added attachment" msgstr "" -#: build/views.py:1108 order/views.py:189 order/views.py:210 +#: build/views.py:1119 order/views.py:189 order/views.py:210 msgid "Edit Attachment" msgstr "" -#: build/views.py:1118 order/views.py:193 order/views.py:214 +#: build/views.py:1129 order/views.py:193 order/views.py:214 msgid "Attachment updated" msgstr "" -#: build/views.py:1128 order/views.py:229 order/views.py:243 +#: build/views.py:1139 order/views.py:229 order/views.py:243 msgid "Delete Attachment" msgstr "" -#: build/views.py:1133 order/views.py:235 order/views.py:249 stock/views.py:333 +#: build/views.py:1144 order/views.py:235 order/views.py:249 stock/views.py:333 msgid "Deleted attachment" msgstr "" @@ -1766,7 +1771,7 @@ msgstr "" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:101 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:183 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" @@ -1865,7 +1870,7 @@ msgstr "" msgid "Base Part" msgstr "" -#: company/models.py:312 company/models.py:463 order/views.py:1372 +#: company/models.py:312 company/models.py:463 order/views.py:1384 msgid "Select part" msgstr "" @@ -1905,7 +1910,7 @@ msgstr "" #: company/models.py:475 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:174 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" @@ -2017,7 +2022,8 @@ msgstr "" #: company/templates/company/delete.html:12 #, python-format -msgid "There are %(count)s parts sourced from this company.
\n" +msgid "" +"There are %(count)s parts sourced from this company.
\n" "If this supplier is deleted, these supplier part entries will also be deleted." msgstr "" @@ -2033,7 +2039,7 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:440 +#: company/templates/company/detail.html:67 order/models.py:450 #: order/templates/order/sales_order_base.html:92 stock/models.py:415 #: stock/models.py:416 stock/templates/stock/item_base.html:251 #: templates/js/company.js:40 templates/js/order.js:267 @@ -2122,13 +2128,13 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:42 -#: order/templates/order/purchase_order_detail.html:75 +#: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 -#: order/templates/order/purchase_order_detail.html:74 +#: order/templates/order/purchase_order_detail.html:49 #: part/templates/part/supplier.html:17 templates/js/stock.js:1163 msgid "New Supplier Part" msgstr "" @@ -2226,7 +2232,7 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:184 +#: stock/views.py:1002 users/models.py:187 msgid "Delete" msgstr "" @@ -2252,7 +2258,7 @@ msgstr "" #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 #: templates/InvenTree/search.html:198 templates/js/stock.js:968 -#: templates/stats.html:72 templates/stats.html:81 users/models.py:40 +#: templates/stats.html:72 templates/stats.html:81 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2266,7 +2272,7 @@ msgstr "" #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46 -#: users/models.py:43 +#: users/models.py:45 msgid "Sales Orders" msgstr "" @@ -2278,7 +2284,7 @@ msgstr "" #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37 -#: users/models.py:42 +#: users/models.py:44 msgid "Purchase Orders" msgstr "" @@ -2357,7 +2363,7 @@ msgid "Pricing Information" msgstr "" #: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2624 +#: part/templates/part/sale_prices.html:17 part/views.py:2636 msgid "Add Price Break" msgstr "" @@ -2467,15 +2473,15 @@ msgstr "" msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2628 +#: company/views.py:799 part/views.py:2640 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2672 +#: company/views.py:855 part/views.py:2684 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2686 +#: company/views.py:870 part/views.py:2698 msgid "Delete Price Break" msgstr "" @@ -2565,7 +2571,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:452 +#: order/forms.py:145 order/models.py:462 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2601,7 +2607,7 @@ msgstr "" msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:445 +#: order/models.py:182 order/models.py:455 msgid "Purchase order status" msgstr "" @@ -2642,8 +2648,8 @@ msgstr "" msgid "Date order was completed" msgstr "" -#: order/models.py:243 order/models.py:342 part/views.py:1586 -#: stock/models.py:270 stock/models.py:953 +#: order/models.py:243 part/views.py:1586 stock/models.py:270 +#: stock/models.py:953 msgid "Quantity must be greater than zero" msgstr "" @@ -2651,120 +2657,128 @@ msgstr "" msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:337 +#: order/models.py:344 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:359 +#: order/models.py:348 +msgid "Quantity must be an integer" +msgstr "" + +#: order/models.py:350 +msgid "Quantity must be a positive number" +msgstr "" + +#: order/models.py:369 msgid "Received items" msgstr "" -#: order/models.py:441 +#: order/models.py:451 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer Reference " msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer order reference code" msgstr "" -#: order/models.py:455 templates/js/order.js:303 +#: order/models.py:465 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:462 +#: order/models.py:472 msgid "shipped by" msgstr "" -#: order/models.py:506 +#: order/models.py:516 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:593 +#: order/models.py:603 msgid "Item quantity" msgstr "" -#: order/models.py:595 +#: order/models.py:605 msgid "Line item reference" msgstr "" -#: order/models.py:597 +#: order/models.py:607 msgid "Line item notes" msgstr "" -#: order/models.py:623 order/models.py:667 +#: order/models.py:633 order/models.py:677 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:624 order/templates/order/order_base.html:9 +#: order/models.py:634 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:313 templates/js/order.js:148 msgid "Purchase Order" msgstr "" -#: order/models.py:638 +#: order/models.py:648 msgid "Supplier part" msgstr "" -#: order/models.py:641 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:214 +#: order/models.py:651 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:189 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:131 msgid "Received" msgstr "" -#: order/models.py:641 +#: order/models.py:651 msgid "Number of items received" msgstr "" -#: order/models.py:648 stock/models.py:508 +#: order/models.py:658 stock/models.py:508 #: stock/templates/stock/item_base.html:320 msgid "Purchase Price" msgstr "" -#: order/models.py:649 +#: order/models.py:659 msgid "Unit purchase price" msgstr "" -#: order/models.py:743 order/models.py:745 +#: order/models.py:753 order/models.py:755 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:749 +#: order/models.py:759 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:751 +#: order/models.py:761 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:754 +#: order/models.py:764 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:764 +#: order/models.py:774 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:769 +#: order/models.py:779 msgid "Line" msgstr "" -#: order/models.py:780 +#: order/models.py:790 msgid "Item" msgstr "" -#: order/models.py:781 +#: order/models.py:791 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:784 +#: order/models.py:794 msgid "Enter stock allocation quantity" msgstr "" @@ -2812,9 +2826,22 @@ msgstr "" msgid "Issued" msgstr "" -#: order/templates/order/order_cancel.html:7 -#: order/templates/order/sales_order_cancel.html:9 -msgid "Cancelling this order means that the order will no longer be editable." +#: order/templates/order/order_base.html:180 +#: order/templates/order/purchase_order_detail.html:100 +#: part/templates/part/category.html:185 part/templates/part/category.html:227 +#: stock/templates/stock/location.html:191 templates/js/stock.js:708 +#: templates/js/stock.js:1169 +msgid "New Location" +msgstr "" + +#: order/templates/order/order_base.html:181 +#: order/templates/order/purchase_order_detail.html:101 +#: stock/templates/stock/location.html:42 +msgid "Create new stock location" +msgstr "" + +#: order/templates/order/order_cancel.html:8 +msgid "Cancelling this order means that the order and line items will no longer be editable." msgstr "" #: order/templates/order/order_complete.html:7 @@ -2826,10 +2853,10 @@ msgid "This order has line items which have not been marked as received." msgstr "" #: order/templates/order/order_complete.html:11 -msgid "Marking this order as complete will remove these line items." +msgid "Completing this order means that the order and line items will no longer be editable." msgstr "" -#: order/templates/order/order_issue.html:7 +#: order/templates/order/order_issue.html:8 msgid "After placing this purchase order, line items will no longer be editable." msgstr "" @@ -2881,11 +2908,13 @@ msgid "Select Purchase Order" msgstr "" #: order/templates/order/order_wizard/select_pos.html:45 -msgid "Create new purchase order for {{ supplier.name }}" +#, python-format +msgid "Create new purchase order for %(name)s" msgstr "" #: order/templates/order/order_wizard/select_pos.html:68 -msgid "Select a purchase order for" +#, python-format +msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 @@ -2907,43 +2936,29 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1108 -#: order/views.py:1191 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1120 +#: order/views.py:1203 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:45 -#: order/templates/order/purchase_order_detail.html:125 -#: part/templates/part/category.html:185 part/templates/part/category.html:227 -#: stock/templates/stock/location.html:191 templates/js/stock.js:708 -#: templates/js/stock.js:1169 -msgid "New Location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:46 -#: order/templates/order/purchase_order_detail.html:126 -#: stock/templates/stock/location.html:42 -msgid "Create new stock location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:139 +#: order/templates/order/purchase_order_detail.html:114 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:205 +#: order/templates/order/purchase_order_detail.html:180 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:221 #: order/templates/order/sales_order_detail.html:294 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:247 +#: order/templates/order/purchase_order_detail.html:222 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:227 msgid "Receive line item" msgstr "" @@ -2966,7 +2981,7 @@ msgstr "" #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:577 #: templates/navbar.html:23 templates/stats.html:59 templates/stats.html:68 -#: users/models.py:38 +#: users/models.py:40 msgid "Parts" msgstr "" @@ -3019,6 +3034,10 @@ msgstr "" msgid "Warning" msgstr "" +#: order/templates/order/sales_order_cancel.html:9 +msgid "Cancelling this order means that the order will no longer be editable." +msgstr "" + #: order/templates/order/sales_order_detail.html:13 msgid "Sales Order Items" msgstr "" @@ -3213,65 +3232,65 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1060 +#: order/views.py:1069 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1117 +#: order/views.py:1129 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1123 +#: order/views.py:1135 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1242 order/views.py:1260 +#: order/views.py:1254 order/views.py:1272 msgid "Edit Line Item" msgstr "" -#: order/views.py:1276 order/views.py:1288 +#: order/views.py:1288 order/views.py:1300 msgid "Delete Line Item" msgstr "" -#: order/views.py:1281 order/views.py:1293 +#: order/views.py:1293 order/views.py:1305 msgid "Deleted line item" msgstr "" -#: order/views.py:1306 +#: order/views.py:1318 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1351 +#: order/views.py:1363 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1367 +#: order/views.py:1379 msgid "Select line item" msgstr "" -#: order/views.py:1398 +#: order/views.py:1410 msgid "No matching item for serial" msgstr "" -#: order/views.py:1408 +#: order/views.py:1420 msgid "is not in stock" msgstr "" -#: order/views.py:1416 +#: order/views.py:1428 msgid "already allocated to an order" msgstr "" -#: order/views.py:1470 +#: order/views.py:1482 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1544 +#: order/views.py:1556 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1559 +#: order/views.py:1571 msgid "Remove allocation" msgstr "" @@ -3457,7 +3476,7 @@ msgstr "" #: part/models.py:83 part/templates/part/category.html:23 #: part/templates/part/category.html:94 part/templates/part/category.html:141 #: templates/InvenTree/search.html:127 templates/stats.html:63 -#: users/models.py:37 +#: users/models.py:39 msgid "Part Categories" msgstr "" @@ -4004,7 +4023,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2270 +#: part/templates/part/category.html:29 part/views.py:2282 msgid "Create new part category" msgstr "" @@ -4694,63 +4713,63 @@ msgstr "" msgid "Part Pricing" msgstr "" -#: part/views.py:2069 +#: part/views.py:2081 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2079 +#: part/views.py:2091 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2086 +#: part/views.py:2098 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2094 +#: part/views.py:2106 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2144 +#: part/views.py:2156 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2158 +#: part/views.py:2170 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2218 +#: part/views.py:2230 msgid "Edit Part Category" msgstr "" -#: part/views.py:2256 +#: part/views.py:2268 msgid "Delete Part Category" msgstr "" -#: part/views.py:2262 +#: part/views.py:2274 msgid "Part category was deleted" msgstr "" -#: part/views.py:2314 +#: part/views.py:2326 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2415 +#: part/views.py:2427 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2471 +#: part/views.py:2483 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2490 +#: part/views.py:2502 msgid "Create BOM Item" msgstr "" -#: part/views.py:2560 +#: part/views.py:2572 msgid "Edit BOM item" msgstr "" -#: part/views.py:2616 +#: part/views.py:2628 msgid "Confim BOM item deletion" msgstr "" @@ -5301,15 +5320,15 @@ msgid "Stock adjustment actions" msgstr "" #: stock/templates/stock/item_base.html:164 -#: stock/templates/stock/location.html:65 templates/stock_table.html:56 +#: stock/templates/stock/location.html:65 templates/stock_table.html:57 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:167 templates/stock_table.html:54 +#: stock/templates/stock/item_base.html:167 templates/stock_table.html:55 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:170 templates/stock_table.html:55 +#: stock/templates/stock/item_base.html:170 templates/stock_table.html:56 msgid "Remove stock" msgstr "" @@ -5503,7 +5522,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:76 users/models.py:39 +#: templates/stats.html:76 users/models.py:41 msgid "Stock Locations" msgstr "" @@ -5689,7 +5708,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:180 +#: stock/views.py:1001 users/models.py:183 msgid "Add" msgstr "" @@ -5867,6 +5886,31 @@ msgstr "" msgid "No stock location set" msgstr "" +#: templates/InvenTree/settings/appearance.html:10 +msgid "Theme Settings" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:17 +msgid "Color Themes" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:29 +#, python-format +msgid "" +"\n" +" The CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" +" Please select another color theme :)\n" +" " +msgstr "" + +#: templates/InvenTree/settings/appearance.html:39 +msgid "Language" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:61 +msgid "Set Language" +msgstr "" + #: templates/InvenTree/settings/build.html:10 msgid "Build Order Settings" msgstr "" @@ -5950,7 +5994,7 @@ msgstr "" msgid "Stock Settings" msgstr "" -#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:49 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:50 msgid "Stock Options" msgstr "" @@ -5964,7 +6008,7 @@ msgid "Account" msgstr "" #: templates/InvenTree/settings/tabs.html:9 -msgid "Theme" +msgid "Appearance" msgstr "" #: templates/InvenTree/settings/tabs.html:13 @@ -5983,22 +6027,6 @@ msgstr "" msgid "Categories" 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" -"\t\tThe CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" -"\t\tPlease select another color theme :)\n" -"\t" -msgstr "" - #: templates/InvenTree/settings/user.html:16 msgid "User Information" msgstr "" @@ -6061,13 +6089,23 @@ msgid "View Code on GitHub" msgstr "" #: templates/about.html:63 -msgid "Get the App" +msgid "Credits" msgstr "" #: templates/about.html:68 +msgid "Mobile App" +msgstr "" + +#: templates/about.html:73 msgid "Submit Bug Report" msgstr "" +#: templates/about.html:82 templates/js/modals.js:550 +#: templates/js/modals.js:809 templates/modals.html:28 templates/modals.html:52 +#: templates/modals.html:93 +msgid "Close" +msgstr "" + #: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "" @@ -6263,7 +6301,7 @@ msgid "Quantity Per" msgstr "" #: templates/js/build.js:638 templates/js/build.js:1056 -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order stock" msgstr "" @@ -6396,11 +6434,6 @@ msgstr "" msgid "Submit" msgstr "" -#: templates/js/modals.js:550 templates/js/modals.js:809 -#: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93 -msgid "Close" -msgstr "" - #: templates/js/modals.js:760 msgid "Invalid response from server" msgstr "" @@ -6974,6 +7007,10 @@ msgstr "" msgid "Form errors exist" msgstr "" +#: templates/navbar.html:13 +msgid "Toggle navigation" +msgstr "" + #: templates/navbar.html:33 msgid "Buy" msgstr "" @@ -6986,7 +7023,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:36 +#: templates/navbar.html:77 users/models.py:38 msgid "Admin" msgstr "" @@ -7118,43 +7155,43 @@ msgstr "" msgid "Print test reports" msgstr "" -#: templates/stock_table.html:54 +#: templates/stock_table.html:55 msgid "Add to selected stock items" msgstr "" -#: templates/stock_table.html:55 +#: templates/stock_table.html:56 msgid "Remove from selected stock items" msgstr "" -#: templates/stock_table.html:56 +#: templates/stock_table.html:57 msgid "Stocktake selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move stock" msgstr "" -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order selected items" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change status" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change stock status" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete selected items" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete Stock" msgstr "" @@ -7190,35 +7227,34 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:167 +#: users/models.py:170 msgid "Permission set" msgstr "" -#: users/models.py:175 +#: users/models.py:178 msgid "Group" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "View" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "Permission to view items" msgstr "" -#: users/models.py:180 +#: users/models.py:183 msgid "Permission to add items" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Change" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Permissions to edit items" msgstr "" -#: users/models.py:184 +#: users/models.py:187 msgid "Permission to delete items" msgstr "" - diff --git a/InvenTree/locale/it/LC_MESSAGES/django.mo b/InvenTree/locale/it/LC_MESSAGES/django.mo index 71cbdf3e9d8d54be31066ec4ad8628bc2c1f2845..900921d249eb26795e2913500959daa683a1746e 100644 GIT binary patch delta 91 zcmeyvbew5|3M21CRgH-;TAoG*MuxfuCb~w33I>)|#>QMeiNz(lAw`LK#W{&3`9)R= mK#{!k(!}&s-H_D8Tq_07lEj?M#5}mLl|p7oyl2S7uk8Te^c|7_ delta 161 zcmX@k^oMDJ3Zv6RRSo_CM`v$GcUOfl*Pvief4_;oTJ@2xjzPM<{<%0zOD*3uD*_*J`Rp9E8ZLQsfoE(3OJ$+qu!%~ZiGxPJT6bvU`C\n" +msgid "" +"There are %(count)s parts sourced from this company.
\n" "If this supplier is deleted, these supplier part entries will also be deleted." msgstr "" @@ -2033,7 +2039,7 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:440 +#: company/templates/company/detail.html:67 order/models.py:450 #: order/templates/order/sales_order_base.html:92 stock/models.py:415 #: stock/models.py:416 stock/templates/stock/item_base.html:251 #: templates/js/company.js:40 templates/js/order.js:267 @@ -2122,13 +2128,13 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:42 -#: order/templates/order/purchase_order_detail.html:75 +#: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 -#: order/templates/order/purchase_order_detail.html:74 +#: order/templates/order/purchase_order_detail.html:49 #: part/templates/part/supplier.html:17 templates/js/stock.js:1163 msgid "New Supplier Part" msgstr "" @@ -2226,7 +2232,7 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:184 +#: stock/views.py:1002 users/models.py:187 msgid "Delete" msgstr "" @@ -2252,7 +2258,7 @@ msgstr "" #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 #: templates/InvenTree/search.html:198 templates/js/stock.js:968 -#: templates/stats.html:72 templates/stats.html:81 users/models.py:40 +#: templates/stats.html:72 templates/stats.html:81 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2266,7 +2272,7 @@ msgstr "" #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46 -#: users/models.py:43 +#: users/models.py:45 msgid "Sales Orders" msgstr "" @@ -2278,7 +2284,7 @@ msgstr "" #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37 -#: users/models.py:42 +#: users/models.py:44 msgid "Purchase Orders" msgstr "" @@ -2357,7 +2363,7 @@ msgid "Pricing Information" msgstr "" #: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2624 +#: part/templates/part/sale_prices.html:17 part/views.py:2636 msgid "Add Price Break" msgstr "" @@ -2467,15 +2473,15 @@ msgstr "" msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2628 +#: company/views.py:799 part/views.py:2640 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2672 +#: company/views.py:855 part/views.py:2684 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2686 +#: company/views.py:870 part/views.py:2698 msgid "Delete Price Break" msgstr "" @@ -2565,7 +2571,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:452 +#: order/forms.py:145 order/models.py:462 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2601,7 +2607,7 @@ msgstr "" msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:445 +#: order/models.py:182 order/models.py:455 msgid "Purchase order status" msgstr "" @@ -2642,8 +2648,8 @@ msgstr "" msgid "Date order was completed" msgstr "" -#: order/models.py:243 order/models.py:342 part/views.py:1586 -#: stock/models.py:270 stock/models.py:953 +#: order/models.py:243 part/views.py:1586 stock/models.py:270 +#: stock/models.py:953 msgid "Quantity must be greater than zero" msgstr "" @@ -2651,120 +2657,128 @@ msgstr "" msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:337 +#: order/models.py:344 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:359 +#: order/models.py:348 +msgid "Quantity must be an integer" +msgstr "" + +#: order/models.py:350 +msgid "Quantity must be a positive number" +msgstr "" + +#: order/models.py:369 msgid "Received items" msgstr "" -#: order/models.py:441 +#: order/models.py:451 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer Reference " msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer order reference code" msgstr "" -#: order/models.py:455 templates/js/order.js:303 +#: order/models.py:465 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:462 +#: order/models.py:472 msgid "shipped by" msgstr "" -#: order/models.py:506 +#: order/models.py:516 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:593 +#: order/models.py:603 msgid "Item quantity" msgstr "" -#: order/models.py:595 +#: order/models.py:605 msgid "Line item reference" msgstr "" -#: order/models.py:597 +#: order/models.py:607 msgid "Line item notes" msgstr "" -#: order/models.py:623 order/models.py:667 +#: order/models.py:633 order/models.py:677 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:624 order/templates/order/order_base.html:9 +#: order/models.py:634 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:313 templates/js/order.js:148 msgid "Purchase Order" msgstr "" -#: order/models.py:638 +#: order/models.py:648 msgid "Supplier part" msgstr "" -#: order/models.py:641 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:214 +#: order/models.py:651 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:189 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:131 msgid "Received" msgstr "" -#: order/models.py:641 +#: order/models.py:651 msgid "Number of items received" msgstr "" -#: order/models.py:648 stock/models.py:508 +#: order/models.py:658 stock/models.py:508 #: stock/templates/stock/item_base.html:320 msgid "Purchase Price" msgstr "" -#: order/models.py:649 +#: order/models.py:659 msgid "Unit purchase price" msgstr "" -#: order/models.py:743 order/models.py:745 +#: order/models.py:753 order/models.py:755 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:749 +#: order/models.py:759 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:751 +#: order/models.py:761 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:754 +#: order/models.py:764 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:764 +#: order/models.py:774 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:769 +#: order/models.py:779 msgid "Line" msgstr "" -#: order/models.py:780 +#: order/models.py:790 msgid "Item" msgstr "" -#: order/models.py:781 +#: order/models.py:791 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:784 +#: order/models.py:794 msgid "Enter stock allocation quantity" msgstr "" @@ -2812,9 +2826,22 @@ msgstr "" msgid "Issued" msgstr "" -#: order/templates/order/order_cancel.html:7 -#: order/templates/order/sales_order_cancel.html:9 -msgid "Cancelling this order means that the order will no longer be editable." +#: order/templates/order/order_base.html:180 +#: order/templates/order/purchase_order_detail.html:100 +#: part/templates/part/category.html:185 part/templates/part/category.html:227 +#: stock/templates/stock/location.html:191 templates/js/stock.js:708 +#: templates/js/stock.js:1169 +msgid "New Location" +msgstr "" + +#: order/templates/order/order_base.html:181 +#: order/templates/order/purchase_order_detail.html:101 +#: stock/templates/stock/location.html:42 +msgid "Create new stock location" +msgstr "" + +#: order/templates/order/order_cancel.html:8 +msgid "Cancelling this order means that the order and line items will no longer be editable." msgstr "" #: order/templates/order/order_complete.html:7 @@ -2826,10 +2853,10 @@ msgid "This order has line items which have not been marked as received." msgstr "" #: order/templates/order/order_complete.html:11 -msgid "Marking this order as complete will remove these line items." +msgid "Completing this order means that the order and line items will no longer be editable." msgstr "" -#: order/templates/order/order_issue.html:7 +#: order/templates/order/order_issue.html:8 msgid "After placing this purchase order, line items will no longer be editable." msgstr "" @@ -2881,11 +2908,13 @@ msgid "Select Purchase Order" msgstr "" #: order/templates/order/order_wizard/select_pos.html:45 -msgid "Create new purchase order for {{ supplier.name }}" +#, python-format +msgid "Create new purchase order for %(name)s" msgstr "" #: order/templates/order/order_wizard/select_pos.html:68 -msgid "Select a purchase order for" +#, python-format +msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 @@ -2907,43 +2936,29 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1108 -#: order/views.py:1191 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1120 +#: order/views.py:1203 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:45 -#: order/templates/order/purchase_order_detail.html:125 -#: part/templates/part/category.html:185 part/templates/part/category.html:227 -#: stock/templates/stock/location.html:191 templates/js/stock.js:708 -#: templates/js/stock.js:1169 -msgid "New Location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:46 -#: order/templates/order/purchase_order_detail.html:126 -#: stock/templates/stock/location.html:42 -msgid "Create new stock location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:139 +#: order/templates/order/purchase_order_detail.html:114 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:205 +#: order/templates/order/purchase_order_detail.html:180 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:221 #: order/templates/order/sales_order_detail.html:294 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:247 +#: order/templates/order/purchase_order_detail.html:222 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:227 msgid "Receive line item" msgstr "" @@ -2966,7 +2981,7 @@ msgstr "" #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:577 #: templates/navbar.html:23 templates/stats.html:59 templates/stats.html:68 -#: users/models.py:38 +#: users/models.py:40 msgid "Parts" msgstr "" @@ -3019,6 +3034,10 @@ msgstr "" msgid "Warning" msgstr "" +#: order/templates/order/sales_order_cancel.html:9 +msgid "Cancelling this order means that the order will no longer be editable." +msgstr "" + #: order/templates/order/sales_order_detail.html:13 msgid "Sales Order Items" msgstr "" @@ -3213,65 +3232,65 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1060 +#: order/views.py:1069 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1117 +#: order/views.py:1129 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1123 +#: order/views.py:1135 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1242 order/views.py:1260 +#: order/views.py:1254 order/views.py:1272 msgid "Edit Line Item" msgstr "" -#: order/views.py:1276 order/views.py:1288 +#: order/views.py:1288 order/views.py:1300 msgid "Delete Line Item" msgstr "" -#: order/views.py:1281 order/views.py:1293 +#: order/views.py:1293 order/views.py:1305 msgid "Deleted line item" msgstr "" -#: order/views.py:1306 +#: order/views.py:1318 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1351 +#: order/views.py:1363 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1367 +#: order/views.py:1379 msgid "Select line item" msgstr "" -#: order/views.py:1398 +#: order/views.py:1410 msgid "No matching item for serial" msgstr "" -#: order/views.py:1408 +#: order/views.py:1420 msgid "is not in stock" msgstr "" -#: order/views.py:1416 +#: order/views.py:1428 msgid "already allocated to an order" msgstr "" -#: order/views.py:1470 +#: order/views.py:1482 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1544 +#: order/views.py:1556 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1559 +#: order/views.py:1571 msgid "Remove allocation" msgstr "" @@ -3457,7 +3476,7 @@ msgstr "" #: part/models.py:83 part/templates/part/category.html:23 #: part/templates/part/category.html:94 part/templates/part/category.html:141 #: templates/InvenTree/search.html:127 templates/stats.html:63 -#: users/models.py:37 +#: users/models.py:39 msgid "Part Categories" msgstr "" @@ -4004,7 +4023,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2270 +#: part/templates/part/category.html:29 part/views.py:2282 msgid "Create new part category" msgstr "" @@ -4694,63 +4713,63 @@ msgstr "" msgid "Part Pricing" msgstr "" -#: part/views.py:2069 +#: part/views.py:2081 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2079 +#: part/views.py:2091 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2086 +#: part/views.py:2098 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2094 +#: part/views.py:2106 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2144 +#: part/views.py:2156 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2158 +#: part/views.py:2170 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2218 +#: part/views.py:2230 msgid "Edit Part Category" msgstr "" -#: part/views.py:2256 +#: part/views.py:2268 msgid "Delete Part Category" msgstr "" -#: part/views.py:2262 +#: part/views.py:2274 msgid "Part category was deleted" msgstr "" -#: part/views.py:2314 +#: part/views.py:2326 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2415 +#: part/views.py:2427 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2471 +#: part/views.py:2483 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2490 +#: part/views.py:2502 msgid "Create BOM Item" msgstr "" -#: part/views.py:2560 +#: part/views.py:2572 msgid "Edit BOM item" msgstr "" -#: part/views.py:2616 +#: part/views.py:2628 msgid "Confim BOM item deletion" msgstr "" @@ -5301,15 +5320,15 @@ msgid "Stock adjustment actions" msgstr "" #: stock/templates/stock/item_base.html:164 -#: stock/templates/stock/location.html:65 templates/stock_table.html:56 +#: stock/templates/stock/location.html:65 templates/stock_table.html:57 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:167 templates/stock_table.html:54 +#: stock/templates/stock/item_base.html:167 templates/stock_table.html:55 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:170 templates/stock_table.html:55 +#: stock/templates/stock/item_base.html:170 templates/stock_table.html:56 msgid "Remove stock" msgstr "" @@ -5503,7 +5522,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:76 users/models.py:39 +#: templates/stats.html:76 users/models.py:41 msgid "Stock Locations" msgstr "" @@ -5689,7 +5708,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:180 +#: stock/views.py:1001 users/models.py:183 msgid "Add" msgstr "" @@ -5867,6 +5886,31 @@ msgstr "" msgid "No stock location set" msgstr "" +#: templates/InvenTree/settings/appearance.html:10 +msgid "Theme Settings" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:17 +msgid "Color Themes" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:29 +#, python-format +msgid "" +"\n" +" The CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" +" Please select another color theme :)\n" +" " +msgstr "" + +#: templates/InvenTree/settings/appearance.html:39 +msgid "Language" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:61 +msgid "Set Language" +msgstr "" + #: templates/InvenTree/settings/build.html:10 msgid "Build Order Settings" msgstr "" @@ -5950,7 +5994,7 @@ msgstr "" msgid "Stock Settings" msgstr "" -#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:49 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:50 msgid "Stock Options" msgstr "" @@ -5964,7 +6008,7 @@ msgid "Account" msgstr "" #: templates/InvenTree/settings/tabs.html:9 -msgid "Theme" +msgid "Appearance" msgstr "" #: templates/InvenTree/settings/tabs.html:13 @@ -5983,22 +6027,6 @@ msgstr "" msgid "Categories" 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" -"\t\tThe CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" -"\t\tPlease select another color theme :)\n" -"\t" -msgstr "" - #: templates/InvenTree/settings/user.html:16 msgid "User Information" msgstr "" @@ -6061,13 +6089,23 @@ msgid "View Code on GitHub" msgstr "" #: templates/about.html:63 -msgid "Get the App" +msgid "Credits" msgstr "" #: templates/about.html:68 +msgid "Mobile App" +msgstr "" + +#: templates/about.html:73 msgid "Submit Bug Report" msgstr "" +#: templates/about.html:82 templates/js/modals.js:550 +#: templates/js/modals.js:809 templates/modals.html:28 templates/modals.html:52 +#: templates/modals.html:93 +msgid "Close" +msgstr "" + #: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "" @@ -6263,7 +6301,7 @@ msgid "Quantity Per" msgstr "" #: templates/js/build.js:638 templates/js/build.js:1056 -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order stock" msgstr "" @@ -6396,11 +6434,6 @@ msgstr "" msgid "Submit" msgstr "" -#: templates/js/modals.js:550 templates/js/modals.js:809 -#: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93 -msgid "Close" -msgstr "" - #: templates/js/modals.js:760 msgid "Invalid response from server" msgstr "" @@ -6974,6 +7007,10 @@ msgstr "" msgid "Form errors exist" msgstr "" +#: templates/navbar.html:13 +msgid "Toggle navigation" +msgstr "" + #: templates/navbar.html:33 msgid "Buy" msgstr "" @@ -6986,7 +7023,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:36 +#: templates/navbar.html:77 users/models.py:38 msgid "Admin" msgstr "" @@ -7118,43 +7155,43 @@ msgstr "" msgid "Print test reports" msgstr "" -#: templates/stock_table.html:54 +#: templates/stock_table.html:55 msgid "Add to selected stock items" msgstr "" -#: templates/stock_table.html:55 +#: templates/stock_table.html:56 msgid "Remove from selected stock items" msgstr "" -#: templates/stock_table.html:56 +#: templates/stock_table.html:57 msgid "Stocktake selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move stock" msgstr "" -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order selected items" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change status" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change stock status" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete selected items" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete Stock" msgstr "" @@ -7190,35 +7227,34 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:167 +#: users/models.py:170 msgid "Permission set" msgstr "" -#: users/models.py:175 +#: users/models.py:178 msgid "Group" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "View" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "Permission to view items" msgstr "" -#: users/models.py:180 +#: users/models.py:183 msgid "Permission to add items" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Change" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Permissions to edit items" msgstr "" -#: users/models.py:184 +#: users/models.py:187 msgid "Permission to delete items" msgstr "" - diff --git a/InvenTree/locale/ja/LC_MESSAGES/django.mo b/InvenTree/locale/ja/LC_MESSAGES/django.mo index 314bedb17d5caa2d590b5786ba725a4f8d4dab37..c8fe740f6ac643152691b6a731fd9ff34fc513db 100644 GIT binary patch delta 92 zcmey$bdYI+3M2bORgH-;T3$v5MuxfuCb~w33I>)|#>QMeiNz(lAw`LK#W{&3`9)R= nK#{!k(!}&s-H_D8Tq^~y#Dc`U)Z$dQxRpXyV!T(t#IFqi_U#?X delta 145 zcmX@e^p$CX3ZwNzRSo_CM`v$GcUOfl*Pvief4_;oTKSQ#jzPM<{<%0zOD*3uD*_*J`Rp9E8ZLQsfoE(3O\n" +msgid "" +"There are %(count)s parts sourced from this company.
\n" "If this supplier is deleted, these supplier part entries will also be deleted." msgstr "" @@ -2033,7 +2039,7 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:440 +#: company/templates/company/detail.html:67 order/models.py:450 #: order/templates/order/sales_order_base.html:92 stock/models.py:415 #: stock/models.py:416 stock/templates/stock/item_base.html:251 #: templates/js/company.js:40 templates/js/order.js:267 @@ -2122,13 +2128,13 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:42 -#: order/templates/order/purchase_order_detail.html:75 +#: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 -#: order/templates/order/purchase_order_detail.html:74 +#: order/templates/order/purchase_order_detail.html:49 #: part/templates/part/supplier.html:17 templates/js/stock.js:1163 msgid "New Supplier Part" msgstr "" @@ -2226,7 +2232,7 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:184 +#: stock/views.py:1002 users/models.py:187 msgid "Delete" msgstr "" @@ -2252,7 +2258,7 @@ msgstr "" #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 #: templates/InvenTree/search.html:198 templates/js/stock.js:968 -#: templates/stats.html:72 templates/stats.html:81 users/models.py:40 +#: templates/stats.html:72 templates/stats.html:81 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2266,7 +2272,7 @@ msgstr "" #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46 -#: users/models.py:43 +#: users/models.py:45 msgid "Sales Orders" msgstr "" @@ -2278,7 +2284,7 @@ msgstr "" #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37 -#: users/models.py:42 +#: users/models.py:44 msgid "Purchase Orders" msgstr "" @@ -2357,7 +2363,7 @@ msgid "Pricing Information" msgstr "" #: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2624 +#: part/templates/part/sale_prices.html:17 part/views.py:2636 msgid "Add Price Break" msgstr "" @@ -2467,15 +2473,15 @@ msgstr "" msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2628 +#: company/views.py:799 part/views.py:2640 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2672 +#: company/views.py:855 part/views.py:2684 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2686 +#: company/views.py:870 part/views.py:2698 msgid "Delete Price Break" msgstr "" @@ -2565,7 +2571,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:452 +#: order/forms.py:145 order/models.py:462 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2601,7 +2607,7 @@ msgstr "" msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:445 +#: order/models.py:182 order/models.py:455 msgid "Purchase order status" msgstr "" @@ -2642,8 +2648,8 @@ msgstr "" msgid "Date order was completed" msgstr "" -#: order/models.py:243 order/models.py:342 part/views.py:1586 -#: stock/models.py:270 stock/models.py:953 +#: order/models.py:243 part/views.py:1586 stock/models.py:270 +#: stock/models.py:953 msgid "Quantity must be greater than zero" msgstr "" @@ -2651,120 +2657,128 @@ msgstr "" msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:337 +#: order/models.py:344 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:359 +#: order/models.py:348 +msgid "Quantity must be an integer" +msgstr "" + +#: order/models.py:350 +msgid "Quantity must be a positive number" +msgstr "" + +#: order/models.py:369 msgid "Received items" msgstr "" -#: order/models.py:441 +#: order/models.py:451 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer Reference " msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer order reference code" msgstr "" -#: order/models.py:455 templates/js/order.js:303 +#: order/models.py:465 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:462 +#: order/models.py:472 msgid "shipped by" msgstr "" -#: order/models.py:506 +#: order/models.py:516 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:593 +#: order/models.py:603 msgid "Item quantity" msgstr "" -#: order/models.py:595 +#: order/models.py:605 msgid "Line item reference" msgstr "" -#: order/models.py:597 +#: order/models.py:607 msgid "Line item notes" msgstr "" -#: order/models.py:623 order/models.py:667 +#: order/models.py:633 order/models.py:677 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:624 order/templates/order/order_base.html:9 +#: order/models.py:634 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:313 templates/js/order.js:148 msgid "Purchase Order" msgstr "" -#: order/models.py:638 +#: order/models.py:648 msgid "Supplier part" msgstr "" -#: order/models.py:641 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:214 +#: order/models.py:651 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:189 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:131 msgid "Received" msgstr "" -#: order/models.py:641 +#: order/models.py:651 msgid "Number of items received" msgstr "" -#: order/models.py:648 stock/models.py:508 +#: order/models.py:658 stock/models.py:508 #: stock/templates/stock/item_base.html:320 msgid "Purchase Price" msgstr "" -#: order/models.py:649 +#: order/models.py:659 msgid "Unit purchase price" msgstr "" -#: order/models.py:743 order/models.py:745 +#: order/models.py:753 order/models.py:755 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:749 +#: order/models.py:759 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:751 +#: order/models.py:761 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:754 +#: order/models.py:764 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:764 +#: order/models.py:774 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:769 +#: order/models.py:779 msgid "Line" msgstr "" -#: order/models.py:780 +#: order/models.py:790 msgid "Item" msgstr "" -#: order/models.py:781 +#: order/models.py:791 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:784 +#: order/models.py:794 msgid "Enter stock allocation quantity" msgstr "" @@ -2812,9 +2826,22 @@ msgstr "" msgid "Issued" msgstr "" -#: order/templates/order/order_cancel.html:7 -#: order/templates/order/sales_order_cancel.html:9 -msgid "Cancelling this order means that the order will no longer be editable." +#: order/templates/order/order_base.html:180 +#: order/templates/order/purchase_order_detail.html:100 +#: part/templates/part/category.html:185 part/templates/part/category.html:227 +#: stock/templates/stock/location.html:191 templates/js/stock.js:708 +#: templates/js/stock.js:1169 +msgid "New Location" +msgstr "" + +#: order/templates/order/order_base.html:181 +#: order/templates/order/purchase_order_detail.html:101 +#: stock/templates/stock/location.html:42 +msgid "Create new stock location" +msgstr "" + +#: order/templates/order/order_cancel.html:8 +msgid "Cancelling this order means that the order and line items will no longer be editable." msgstr "" #: order/templates/order/order_complete.html:7 @@ -2826,10 +2853,10 @@ msgid "This order has line items which have not been marked as received." msgstr "" #: order/templates/order/order_complete.html:11 -msgid "Marking this order as complete will remove these line items." +msgid "Completing this order means that the order and line items will no longer be editable." msgstr "" -#: order/templates/order/order_issue.html:7 +#: order/templates/order/order_issue.html:8 msgid "After placing this purchase order, line items will no longer be editable." msgstr "" @@ -2881,11 +2908,13 @@ msgid "Select Purchase Order" msgstr "" #: order/templates/order/order_wizard/select_pos.html:45 -msgid "Create new purchase order for {{ supplier.name }}" +#, python-format +msgid "Create new purchase order for %(name)s" msgstr "" #: order/templates/order/order_wizard/select_pos.html:68 -msgid "Select a purchase order for" +#, python-format +msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 @@ -2907,43 +2936,29 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1108 -#: order/views.py:1191 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1120 +#: order/views.py:1203 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:45 -#: order/templates/order/purchase_order_detail.html:125 -#: part/templates/part/category.html:185 part/templates/part/category.html:227 -#: stock/templates/stock/location.html:191 templates/js/stock.js:708 -#: templates/js/stock.js:1169 -msgid "New Location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:46 -#: order/templates/order/purchase_order_detail.html:126 -#: stock/templates/stock/location.html:42 -msgid "Create new stock location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:139 +#: order/templates/order/purchase_order_detail.html:114 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:205 +#: order/templates/order/purchase_order_detail.html:180 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:221 #: order/templates/order/sales_order_detail.html:294 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:247 +#: order/templates/order/purchase_order_detail.html:222 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:227 msgid "Receive line item" msgstr "" @@ -2966,7 +2981,7 @@ msgstr "" #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:577 #: templates/navbar.html:23 templates/stats.html:59 templates/stats.html:68 -#: users/models.py:38 +#: users/models.py:40 msgid "Parts" msgstr "" @@ -3019,6 +3034,10 @@ msgstr "" msgid "Warning" msgstr "" +#: order/templates/order/sales_order_cancel.html:9 +msgid "Cancelling this order means that the order will no longer be editable." +msgstr "" + #: order/templates/order/sales_order_detail.html:13 msgid "Sales Order Items" msgstr "" @@ -3213,65 +3232,65 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1060 +#: order/views.py:1069 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1117 +#: order/views.py:1129 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1123 +#: order/views.py:1135 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1242 order/views.py:1260 +#: order/views.py:1254 order/views.py:1272 msgid "Edit Line Item" msgstr "" -#: order/views.py:1276 order/views.py:1288 +#: order/views.py:1288 order/views.py:1300 msgid "Delete Line Item" msgstr "" -#: order/views.py:1281 order/views.py:1293 +#: order/views.py:1293 order/views.py:1305 msgid "Deleted line item" msgstr "" -#: order/views.py:1306 +#: order/views.py:1318 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1351 +#: order/views.py:1363 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1367 +#: order/views.py:1379 msgid "Select line item" msgstr "" -#: order/views.py:1398 +#: order/views.py:1410 msgid "No matching item for serial" msgstr "" -#: order/views.py:1408 +#: order/views.py:1420 msgid "is not in stock" msgstr "" -#: order/views.py:1416 +#: order/views.py:1428 msgid "already allocated to an order" msgstr "" -#: order/views.py:1470 +#: order/views.py:1482 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1544 +#: order/views.py:1556 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1559 +#: order/views.py:1571 msgid "Remove allocation" msgstr "" @@ -3457,7 +3476,7 @@ msgstr "" #: part/models.py:83 part/templates/part/category.html:23 #: part/templates/part/category.html:94 part/templates/part/category.html:141 #: templates/InvenTree/search.html:127 templates/stats.html:63 -#: users/models.py:37 +#: users/models.py:39 msgid "Part Categories" msgstr "" @@ -4004,7 +4023,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2270 +#: part/templates/part/category.html:29 part/views.py:2282 msgid "Create new part category" msgstr "" @@ -4694,63 +4713,63 @@ msgstr "" msgid "Part Pricing" msgstr "" -#: part/views.py:2069 +#: part/views.py:2081 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2079 +#: part/views.py:2091 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2086 +#: part/views.py:2098 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2094 +#: part/views.py:2106 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2144 +#: part/views.py:2156 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2158 +#: part/views.py:2170 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2218 +#: part/views.py:2230 msgid "Edit Part Category" msgstr "" -#: part/views.py:2256 +#: part/views.py:2268 msgid "Delete Part Category" msgstr "" -#: part/views.py:2262 +#: part/views.py:2274 msgid "Part category was deleted" msgstr "" -#: part/views.py:2314 +#: part/views.py:2326 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2415 +#: part/views.py:2427 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2471 +#: part/views.py:2483 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2490 +#: part/views.py:2502 msgid "Create BOM Item" msgstr "" -#: part/views.py:2560 +#: part/views.py:2572 msgid "Edit BOM item" msgstr "" -#: part/views.py:2616 +#: part/views.py:2628 msgid "Confim BOM item deletion" msgstr "" @@ -5301,15 +5320,15 @@ msgid "Stock adjustment actions" msgstr "" #: stock/templates/stock/item_base.html:164 -#: stock/templates/stock/location.html:65 templates/stock_table.html:56 +#: stock/templates/stock/location.html:65 templates/stock_table.html:57 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:167 templates/stock_table.html:54 +#: stock/templates/stock/item_base.html:167 templates/stock_table.html:55 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:170 templates/stock_table.html:55 +#: stock/templates/stock/item_base.html:170 templates/stock_table.html:56 msgid "Remove stock" msgstr "" @@ -5503,7 +5522,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:76 users/models.py:39 +#: templates/stats.html:76 users/models.py:41 msgid "Stock Locations" msgstr "" @@ -5689,7 +5708,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:180 +#: stock/views.py:1001 users/models.py:183 msgid "Add" msgstr "" @@ -5867,6 +5886,31 @@ msgstr "" msgid "No stock location set" msgstr "" +#: templates/InvenTree/settings/appearance.html:10 +msgid "Theme Settings" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:17 +msgid "Color Themes" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:29 +#, python-format +msgid "" +"\n" +" The CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" +" Please select another color theme :)\n" +" " +msgstr "" + +#: templates/InvenTree/settings/appearance.html:39 +msgid "Language" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:61 +msgid "Set Language" +msgstr "" + #: templates/InvenTree/settings/build.html:10 msgid "Build Order Settings" msgstr "" @@ -5950,7 +5994,7 @@ msgstr "" msgid "Stock Settings" msgstr "" -#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:49 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:50 msgid "Stock Options" msgstr "" @@ -5964,7 +6008,7 @@ msgid "Account" msgstr "" #: templates/InvenTree/settings/tabs.html:9 -msgid "Theme" +msgid "Appearance" msgstr "" #: templates/InvenTree/settings/tabs.html:13 @@ -5983,22 +6027,6 @@ msgstr "" msgid "Categories" 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" -"\t\tThe CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" -"\t\tPlease select another color theme :)\n" -"\t" -msgstr "" - #: templates/InvenTree/settings/user.html:16 msgid "User Information" msgstr "" @@ -6061,13 +6089,23 @@ msgid "View Code on GitHub" msgstr "" #: templates/about.html:63 -msgid "Get the App" +msgid "Credits" msgstr "" #: templates/about.html:68 +msgid "Mobile App" +msgstr "" + +#: templates/about.html:73 msgid "Submit Bug Report" msgstr "" +#: templates/about.html:82 templates/js/modals.js:550 +#: templates/js/modals.js:809 templates/modals.html:28 templates/modals.html:52 +#: templates/modals.html:93 +msgid "Close" +msgstr "" + #: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "" @@ -6263,7 +6301,7 @@ msgid "Quantity Per" msgstr "" #: templates/js/build.js:638 templates/js/build.js:1056 -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order stock" msgstr "" @@ -6396,11 +6434,6 @@ msgstr "" msgid "Submit" msgstr "" -#: templates/js/modals.js:550 templates/js/modals.js:809 -#: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93 -msgid "Close" -msgstr "" - #: templates/js/modals.js:760 msgid "Invalid response from server" msgstr "" @@ -6974,6 +7007,10 @@ msgstr "" msgid "Form errors exist" msgstr "" +#: templates/navbar.html:13 +msgid "Toggle navigation" +msgstr "" + #: templates/navbar.html:33 msgid "Buy" msgstr "" @@ -6986,7 +7023,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:36 +#: templates/navbar.html:77 users/models.py:38 msgid "Admin" msgstr "" @@ -7118,43 +7155,43 @@ msgstr "" msgid "Print test reports" msgstr "" -#: templates/stock_table.html:54 +#: templates/stock_table.html:55 msgid "Add to selected stock items" msgstr "" -#: templates/stock_table.html:55 +#: templates/stock_table.html:56 msgid "Remove from selected stock items" msgstr "" -#: templates/stock_table.html:56 +#: templates/stock_table.html:57 msgid "Stocktake selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move stock" msgstr "" -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order selected items" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change status" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change stock status" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete selected items" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete Stock" msgstr "" @@ -7190,34 +7227,34 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:167 +#: users/models.py:170 msgid "Permission set" msgstr "" -#: users/models.py:175 +#: users/models.py:178 msgid "Group" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "View" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "Permission to view items" msgstr "" -#: users/models.py:180 +#: users/models.py:183 msgid "Permission to add items" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Change" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Permissions to edit items" msgstr "" -#: users/models.py:184 +#: users/models.py:187 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/pl/LC_MESSAGES/django.mo b/InvenTree/locale/pl/LC_MESSAGES/django.mo index 16fcd00009b4b2229c050ee6bcb41074b1b3e6a5..89d5c273e3d431e7842a317bfebddcdbe6cfb0ff 100644 GIT binary patch delta 91 zcmeBUxxqX^g>l|QRgH-;S{_CQMuxfuCb~w33I>)|#>QMeiNz(lAw`LK#W{&3`9)R= mK#{!k(!}&s-H_D8Tq}iu{G80<47jM3LP1V^fX~LSl8gZF{T(I% delta 162 zcmcb?+{ZFOh4IQnRSo_CM`v$GcUOfl*Pvief4_;oTJ@2xjzPM<{<%0zOD*3uD*_*J`Rp9E8ZLQsfoE(3OJ$+qu!%~ZiGxPJT6bv_>=VSx` Dk6tlh diff --git a/InvenTree/locale/pl/LC_MESSAGES/django.po b/InvenTree/locale/pl/LC_MESSAGES/django.po index 8f82a13ba3..edc3b32d2b 100644 --- a/InvenTree/locale/pl/LC_MESSAGES/django.po +++ b/InvenTree/locale/pl/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-21 09:17+0000\n" +"POT-Creation-Date: 2021-05-05 17:33+1000\n" "PO-Revision-Date: 2021-04-21 09:33\n" "Last-Translator: \n" "Language-Team: Polish\n" @@ -67,35 +67,36 @@ msgstr "" msgid "Select Category" msgstr "" -#: InvenTree/helpers.py:375 order/models.py:245 order/models.py:344 -#: stock/views.py:1763 -msgid "Invalid quantity provided" -msgstr "" - -#: InvenTree/helpers.py:378 -msgid "Empty serial number string" -msgstr "" - -#: InvenTree/helpers.py:399 +#: InvenTree/helpers.py:377 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:403 InvenTree/helpers.py:406 InvenTree/helpers.py:409 +#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:353 +#: stock/views.py:1763 +msgid "Invalid quantity provided" +msgstr "" + +#: InvenTree/helpers.py:387 +msgid "Empty serial number string" +msgstr "" + +#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 +#: InvenTree/helpers.py:440 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:414 +#: InvenTree/helpers.py:445 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:422 +#: InvenTree/helpers.py:453 msgid "No serial numbers found" msgstr "" -#: InvenTree/helpers.py:426 +#: InvenTree/helpers.py:457 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" @@ -140,7 +141,7 @@ msgstr "" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:108 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:168 +#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -165,23 +166,23 @@ msgstr "" msgid "parent" msgstr "" -#: InvenTree/settings.py:493 +#: InvenTree/settings.py:491 msgid "English" msgstr "" -#: InvenTree/settings.py:494 +#: InvenTree/settings.py:492 msgid "French" msgstr "" -#: InvenTree/settings.py:495 +#: InvenTree/settings.py:493 msgid "German" msgstr "" -#: InvenTree/settings.py:496 +#: InvenTree/settings.py:494 msgid "Polish" msgstr "" -#: InvenTree/settings.py:497 +#: InvenTree/settings.py:495 msgid "Turkish" msgstr "" @@ -375,16 +376,16 @@ msgstr "" msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1227 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1241 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:123 #: build/templates/build/detail.html:31 common/models.py:703 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:239 order/forms.py:261 -#: order/forms.py:278 order/models.py:593 order/models.py:784 +#: order/forms.py:278 order/models.py:603 order/models.py:794 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:200 +#: order/templates/order/purchase_order_detail.html:175 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:159 @@ -458,7 +459,7 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:59 order/models.py:445 +#: build/templates/build/detail.html:59 order/models.py:455 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:392 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:770 @@ -508,7 +509,7 @@ msgstr "" #: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 #: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:31 users/models.py:41 +#: templates/InvenTree/settings/tabs.html:31 users/models.py:43 msgid "Build Orders" msgstr "" @@ -516,8 +517,8 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:127 order/models.py:99 order/models.py:595 -#: order/templates/order/purchase_order_detail.html:195 +#: build/models.py:127 order/models.py:99 order/models.py:605 +#: order/templates/order/purchase_order_detail.html:170 #: order/templates/order/sales_order_detail.html:219 part/models.py:2187 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -540,10 +541,10 @@ msgstr "" #: build/models.py:152 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:118 -#: build/templates/build/detail.html:26 company/models.py:669 -#: order/models.py:637 order/models.py:669 +#: build/templates/build/detail.html:26 company/models.py:688 +#: order/models.py:647 order/models.py:679 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:156 +#: order/templates/order/purchase_order_detail.html:131 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:207 part/models.py:321 #: part/models.py:1876 part/models.py:1888 part/models.py:1906 @@ -628,7 +629,7 @@ msgstr "" msgid "Creation Date" msgstr "" -#: build/models.py:223 order/models.py:451 +#: build/models.py:223 order/models.py:461 msgid "Target completion date" msgstr "" @@ -678,9 +679,9 @@ msgstr "" #: company/models.py:135 company/models.py:501 #: company/templates/company/navbar.html:70 #: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:597 order/templates/order/po_navbar.html:29 +#: order/models.py:607 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:234 +#: order/templates/order/purchase_order_detail.html:209 #: order/templates/order/sales_order_detail.html:264 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 @@ -713,47 +714,47 @@ msgstr "" msgid "Completed build output" msgstr "" -#: build/models.py:1118 +#: build/models.py:1132 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1143 +#: build/models.py:1157 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "" -#: build/models.py:1147 +#: build/models.py:1161 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1151 +#: build/models.py:1165 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1158 order/models.py:758 +#: build/models.py:1172 order/models.py:768 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1162 order/models.py:761 +#: build/models.py:1176 order/models.py:771 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1166 +#: build/models.py:1180 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1206 stock/templates/stock/item_base.html:306 +#: build/models.py:1220 stock/templates/stock/item_base.html:306 #: templates/InvenTree/search.html:183 templates/js/build.js:714 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1207 +#: build/models.py:1221 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1214 part/templates/part/allocation.html:18 +#: build/models.py:1228 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -765,19 +766,19 @@ msgstr "" msgid "Stock Item" msgstr "" -#: build/models.py:1215 +#: build/models.py:1229 msgid "Source stock item" msgstr "" -#: build/models.py:1228 +#: build/models.py:1242 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1236 +#: build/models.py:1250 msgid "Install into" msgstr "" -#: build/models.py:1237 +#: build/models.py:1251 msgid "Destination stock item" msgstr "" @@ -801,7 +802,7 @@ msgstr "" msgid "Unallocate stock" msgstr "" -#: build/templates/build/allocate.html:26 build/views.py:308 build/views.py:794 +#: build/templates/build/allocate.html:26 build/views.py:319 build/views.py:805 msgid "Unallocate Stock" msgstr "" @@ -811,7 +812,7 @@ msgstr "" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:794 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:795 #: part/templates/part/category.html:127 msgid "Order Parts" msgstr "" @@ -954,7 +955,7 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:160 -#: build/templates/build/detail.html:84 order/models.py:667 +#: build/templates/build/detail.html:84 order/models.py:677 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:33 #: order/templates/order/sales_order_ship.html:25 @@ -1139,7 +1140,7 @@ msgstr "" msgid "Alter the quantity of stock allocated to the build output" msgstr "" -#: build/templates/build/index.html:28 build/views.py:667 +#: build/templates/build/index.html:28 build/views.py:678 msgid "New Build Order" msgstr "" @@ -1226,141 +1227,145 @@ msgstr "" msgid "Create Build Output" msgstr "" -#: build/views.py:173 stock/models.py:969 stock/views.py:1789 +#: build/views.py:168 +msgid "Maximum output quantity is " +msgstr "" + +#: build/views.py:184 stock/models.py:969 stock/views.py:1789 msgid "Serial numbers already exist" msgstr "" -#: build/views.py:182 +#: build/views.py:193 msgid "Serial numbers required for trackable build output" msgstr "" -#: build/views.py:248 +#: build/views.py:259 msgid "Delete Build Output" msgstr "" -#: build/views.py:269 build/views.py:359 +#: build/views.py:280 build/views.py:370 msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:270 build/views.py:360 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:425 msgid "Check the confirmation box" msgstr "" -#: build/views.py:282 +#: build/views.py:293 msgid "Build output does not match build" msgstr "" -#: build/views.py:284 build/views.py:485 +#: build/views.py:295 build/views.py:496 msgid "Build output must be specified" msgstr "" -#: build/views.py:296 +#: build/views.py:307 msgid "Build output deleted" msgstr "" -#: build/views.py:394 +#: build/views.py:405 msgid "Complete Build Order" msgstr "" -#: build/views.py:400 +#: build/views.py:411 msgid "Build order cannot be completed - incomplete outputs remain" msgstr "" -#: build/views.py:411 +#: build/views.py:422 msgid "Completed build order" msgstr "" -#: build/views.py:427 +#: build/views.py:438 msgid "Complete Build Output" msgstr "" -#: build/views.py:469 +#: build/views.py:480 msgid "Invalid stock status value selected" msgstr "" -#: build/views.py:476 +#: build/views.py:487 msgid "Quantity to complete cannot exceed build output quantity" msgstr "" -#: build/views.py:482 +#: build/views.py:493 msgid "Confirm completion of incomplete build" msgstr "" -#: build/views.py:581 +#: build/views.py:592 msgid "Build output completed" msgstr "" -#: build/views.py:721 +#: build/views.py:732 msgid "Created new build" msgstr "" -#: build/views.py:742 +#: build/views.py:753 msgid "Edit Build Order Details" msgstr "" -#: build/views.py:775 +#: build/views.py:786 msgid "Edited build" msgstr "" -#: build/views.py:784 +#: build/views.py:795 msgid "Delete Build Order" msgstr "" -#: build/views.py:799 +#: build/views.py:810 msgid "Removed parts from build allocation" msgstr "" -#: build/views.py:811 +#: build/views.py:822 msgid "Allocate stock to build output" msgstr "" -#: build/views.py:854 +#: build/views.py:865 msgid "Item must be currently in stock" msgstr "" -#: build/views.py:860 +#: build/views.py:871 msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:861 templates/js/bom.js:230 templates/js/build.js:575 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:575 #: templates/js/build.js:838 templates/js/build.js:1021 msgid "Available" msgstr "" -#: build/views.py:863 +#: build/views.py:874 msgid "Stock item must be selected" msgstr "" -#: build/views.py:1026 +#: build/views.py:1037 msgid "Edit Stock Allocation" msgstr "" -#: build/views.py:1030 +#: build/views.py:1041 msgid "Updated Build Item" msgstr "" -#: build/views.py:1059 +#: build/views.py:1070 msgid "Add Build Order Attachment" msgstr "" -#: build/views.py:1072 order/views.py:110 order/views.py:162 part/views.py:172 +#: build/views.py:1083 order/views.py:110 order/views.py:162 part/views.py:172 #: stock/views.py:277 msgid "Added attachment" msgstr "" -#: build/views.py:1108 order/views.py:189 order/views.py:210 +#: build/views.py:1119 order/views.py:189 order/views.py:210 msgid "Edit Attachment" msgstr "" -#: build/views.py:1118 order/views.py:193 order/views.py:214 +#: build/views.py:1129 order/views.py:193 order/views.py:214 msgid "Attachment updated" msgstr "" -#: build/views.py:1128 order/views.py:229 order/views.py:243 +#: build/views.py:1139 order/views.py:229 order/views.py:243 msgid "Delete Attachment" msgstr "" -#: build/views.py:1133 order/views.py:235 order/views.py:249 stock/views.py:333 +#: build/views.py:1144 order/views.py:235 order/views.py:249 stock/views.py:333 msgid "Deleted attachment" msgstr "" @@ -1766,7 +1771,7 @@ msgstr "" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:101 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:183 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" @@ -1865,7 +1870,7 @@ msgstr "" msgid "Base Part" msgstr "" -#: company/models.py:312 company/models.py:463 order/views.py:1372 +#: company/models.py:312 company/models.py:463 order/views.py:1384 msgid "Select part" msgstr "" @@ -1905,7 +1910,7 @@ msgstr "" #: company/models.py:475 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:174 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" @@ -2017,7 +2022,8 @@ msgstr "" #: company/templates/company/delete.html:12 #, python-format -msgid "There are %(count)s parts sourced from this company.
\n" +msgid "" +"There are %(count)s parts sourced from this company.
\n" "If this supplier is deleted, these supplier part entries will also be deleted." msgstr "" @@ -2033,7 +2039,7 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:440 +#: company/templates/company/detail.html:67 order/models.py:450 #: order/templates/order/sales_order_base.html:92 stock/models.py:415 #: stock/models.py:416 stock/templates/stock/item_base.html:251 #: templates/js/company.js:40 templates/js/order.js:267 @@ -2122,13 +2128,13 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:42 -#: order/templates/order/purchase_order_detail.html:75 +#: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 -#: order/templates/order/purchase_order_detail.html:74 +#: order/templates/order/purchase_order_detail.html:49 #: part/templates/part/supplier.html:17 templates/js/stock.js:1163 msgid "New Supplier Part" msgstr "" @@ -2226,7 +2232,7 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:184 +#: stock/views.py:1002 users/models.py:187 msgid "Delete" msgstr "" @@ -2252,7 +2258,7 @@ msgstr "" #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 #: templates/InvenTree/search.html:198 templates/js/stock.js:968 -#: templates/stats.html:72 templates/stats.html:81 users/models.py:40 +#: templates/stats.html:72 templates/stats.html:81 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2266,7 +2272,7 @@ msgstr "" #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46 -#: users/models.py:43 +#: users/models.py:45 msgid "Sales Orders" msgstr "" @@ -2278,7 +2284,7 @@ msgstr "" #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37 -#: users/models.py:42 +#: users/models.py:44 msgid "Purchase Orders" msgstr "" @@ -2357,7 +2363,7 @@ msgid "Pricing Information" msgstr "" #: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2624 +#: part/templates/part/sale_prices.html:17 part/views.py:2636 msgid "Add Price Break" msgstr "" @@ -2467,15 +2473,15 @@ msgstr "" msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2628 +#: company/views.py:799 part/views.py:2640 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2672 +#: company/views.py:855 part/views.py:2684 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2686 +#: company/views.py:870 part/views.py:2698 msgid "Delete Price Break" msgstr "" @@ -2565,7 +2571,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:452 +#: order/forms.py:145 order/models.py:462 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2601,7 +2607,7 @@ msgstr "" msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:445 +#: order/models.py:182 order/models.py:455 msgid "Purchase order status" msgstr "" @@ -2642,8 +2648,8 @@ msgstr "" msgid "Date order was completed" msgstr "" -#: order/models.py:243 order/models.py:342 part/views.py:1586 -#: stock/models.py:270 stock/models.py:953 +#: order/models.py:243 part/views.py:1586 stock/models.py:270 +#: stock/models.py:953 msgid "Quantity must be greater than zero" msgstr "" @@ -2651,120 +2657,128 @@ msgstr "" msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:337 +#: order/models.py:344 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:359 +#: order/models.py:348 +msgid "Quantity must be an integer" +msgstr "" + +#: order/models.py:350 +msgid "Quantity must be a positive number" +msgstr "" + +#: order/models.py:369 msgid "Received items" msgstr "" -#: order/models.py:441 +#: order/models.py:451 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer Reference " msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer order reference code" msgstr "" -#: order/models.py:455 templates/js/order.js:303 +#: order/models.py:465 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:462 +#: order/models.py:472 msgid "shipped by" msgstr "" -#: order/models.py:506 +#: order/models.py:516 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:593 +#: order/models.py:603 msgid "Item quantity" msgstr "" -#: order/models.py:595 +#: order/models.py:605 msgid "Line item reference" msgstr "" -#: order/models.py:597 +#: order/models.py:607 msgid "Line item notes" msgstr "" -#: order/models.py:623 order/models.py:667 +#: order/models.py:633 order/models.py:677 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:624 order/templates/order/order_base.html:9 +#: order/models.py:634 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:313 templates/js/order.js:148 msgid "Purchase Order" msgstr "" -#: order/models.py:638 +#: order/models.py:648 msgid "Supplier part" msgstr "" -#: order/models.py:641 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:214 +#: order/models.py:651 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:189 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:131 msgid "Received" msgstr "" -#: order/models.py:641 +#: order/models.py:651 msgid "Number of items received" msgstr "" -#: order/models.py:648 stock/models.py:508 +#: order/models.py:658 stock/models.py:508 #: stock/templates/stock/item_base.html:320 msgid "Purchase Price" msgstr "" -#: order/models.py:649 +#: order/models.py:659 msgid "Unit purchase price" msgstr "" -#: order/models.py:743 order/models.py:745 +#: order/models.py:753 order/models.py:755 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:749 +#: order/models.py:759 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:751 +#: order/models.py:761 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:754 +#: order/models.py:764 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:764 +#: order/models.py:774 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:769 +#: order/models.py:779 msgid "Line" msgstr "" -#: order/models.py:780 +#: order/models.py:790 msgid "Item" msgstr "" -#: order/models.py:781 +#: order/models.py:791 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:784 +#: order/models.py:794 msgid "Enter stock allocation quantity" msgstr "" @@ -2812,9 +2826,22 @@ msgstr "" msgid "Issued" msgstr "" -#: order/templates/order/order_cancel.html:7 -#: order/templates/order/sales_order_cancel.html:9 -msgid "Cancelling this order means that the order will no longer be editable." +#: order/templates/order/order_base.html:180 +#: order/templates/order/purchase_order_detail.html:100 +#: part/templates/part/category.html:185 part/templates/part/category.html:227 +#: stock/templates/stock/location.html:191 templates/js/stock.js:708 +#: templates/js/stock.js:1169 +msgid "New Location" +msgstr "" + +#: order/templates/order/order_base.html:181 +#: order/templates/order/purchase_order_detail.html:101 +#: stock/templates/stock/location.html:42 +msgid "Create new stock location" +msgstr "" + +#: order/templates/order/order_cancel.html:8 +msgid "Cancelling this order means that the order and line items will no longer be editable." msgstr "" #: order/templates/order/order_complete.html:7 @@ -2826,10 +2853,10 @@ msgid "This order has line items which have not been marked as received." msgstr "" #: order/templates/order/order_complete.html:11 -msgid "Marking this order as complete will remove these line items." +msgid "Completing this order means that the order and line items will no longer be editable." msgstr "" -#: order/templates/order/order_issue.html:7 +#: order/templates/order/order_issue.html:8 msgid "After placing this purchase order, line items will no longer be editable." msgstr "" @@ -2881,11 +2908,13 @@ msgid "Select Purchase Order" msgstr "" #: order/templates/order/order_wizard/select_pos.html:45 -msgid "Create new purchase order for {{ supplier.name }}" +#, python-format +msgid "Create new purchase order for %(name)s" msgstr "" #: order/templates/order/order_wizard/select_pos.html:68 -msgid "Select a purchase order for" +#, python-format +msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 @@ -2907,43 +2936,29 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1108 -#: order/views.py:1191 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1120 +#: order/views.py:1203 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:45 -#: order/templates/order/purchase_order_detail.html:125 -#: part/templates/part/category.html:185 part/templates/part/category.html:227 -#: stock/templates/stock/location.html:191 templates/js/stock.js:708 -#: templates/js/stock.js:1169 -msgid "New Location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:46 -#: order/templates/order/purchase_order_detail.html:126 -#: stock/templates/stock/location.html:42 -msgid "Create new stock location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:139 +#: order/templates/order/purchase_order_detail.html:114 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:205 +#: order/templates/order/purchase_order_detail.html:180 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:221 #: order/templates/order/sales_order_detail.html:294 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:247 +#: order/templates/order/purchase_order_detail.html:222 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:227 msgid "Receive line item" msgstr "" @@ -2966,7 +2981,7 @@ msgstr "" #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:577 #: templates/navbar.html:23 templates/stats.html:59 templates/stats.html:68 -#: users/models.py:38 +#: users/models.py:40 msgid "Parts" msgstr "" @@ -3019,6 +3034,10 @@ msgstr "" msgid "Warning" msgstr "" +#: order/templates/order/sales_order_cancel.html:9 +msgid "Cancelling this order means that the order will no longer be editable." +msgstr "" + #: order/templates/order/sales_order_detail.html:13 msgid "Sales Order Items" msgstr "" @@ -3213,65 +3232,65 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1060 +#: order/views.py:1069 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1117 +#: order/views.py:1129 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1123 +#: order/views.py:1135 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1242 order/views.py:1260 +#: order/views.py:1254 order/views.py:1272 msgid "Edit Line Item" msgstr "" -#: order/views.py:1276 order/views.py:1288 +#: order/views.py:1288 order/views.py:1300 msgid "Delete Line Item" msgstr "" -#: order/views.py:1281 order/views.py:1293 +#: order/views.py:1293 order/views.py:1305 msgid "Deleted line item" msgstr "" -#: order/views.py:1306 +#: order/views.py:1318 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1351 +#: order/views.py:1363 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1367 +#: order/views.py:1379 msgid "Select line item" msgstr "" -#: order/views.py:1398 +#: order/views.py:1410 msgid "No matching item for serial" msgstr "" -#: order/views.py:1408 +#: order/views.py:1420 msgid "is not in stock" msgstr "" -#: order/views.py:1416 +#: order/views.py:1428 msgid "already allocated to an order" msgstr "" -#: order/views.py:1470 +#: order/views.py:1482 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1544 +#: order/views.py:1556 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1559 +#: order/views.py:1571 msgid "Remove allocation" msgstr "" @@ -3457,7 +3476,7 @@ msgstr "" #: part/models.py:83 part/templates/part/category.html:23 #: part/templates/part/category.html:94 part/templates/part/category.html:141 #: templates/InvenTree/search.html:127 templates/stats.html:63 -#: users/models.py:37 +#: users/models.py:39 msgid "Part Categories" msgstr "" @@ -4004,7 +4023,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2270 +#: part/templates/part/category.html:29 part/views.py:2282 msgid "Create new part category" msgstr "" @@ -4694,63 +4713,63 @@ msgstr "" msgid "Part Pricing" msgstr "" -#: part/views.py:2069 +#: part/views.py:2081 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2079 +#: part/views.py:2091 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2086 +#: part/views.py:2098 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2094 +#: part/views.py:2106 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2144 +#: part/views.py:2156 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2158 +#: part/views.py:2170 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2218 +#: part/views.py:2230 msgid "Edit Part Category" msgstr "" -#: part/views.py:2256 +#: part/views.py:2268 msgid "Delete Part Category" msgstr "" -#: part/views.py:2262 +#: part/views.py:2274 msgid "Part category was deleted" msgstr "" -#: part/views.py:2314 +#: part/views.py:2326 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2415 +#: part/views.py:2427 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2471 +#: part/views.py:2483 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2490 +#: part/views.py:2502 msgid "Create BOM Item" msgstr "" -#: part/views.py:2560 +#: part/views.py:2572 msgid "Edit BOM item" msgstr "" -#: part/views.py:2616 +#: part/views.py:2628 msgid "Confim BOM item deletion" msgstr "" @@ -5301,15 +5320,15 @@ msgid "Stock adjustment actions" msgstr "" #: stock/templates/stock/item_base.html:164 -#: stock/templates/stock/location.html:65 templates/stock_table.html:56 +#: stock/templates/stock/location.html:65 templates/stock_table.html:57 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:167 templates/stock_table.html:54 +#: stock/templates/stock/item_base.html:167 templates/stock_table.html:55 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:170 templates/stock_table.html:55 +#: stock/templates/stock/item_base.html:170 templates/stock_table.html:56 msgid "Remove stock" msgstr "" @@ -5503,7 +5522,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:76 users/models.py:39 +#: templates/stats.html:76 users/models.py:41 msgid "Stock Locations" msgstr "" @@ -5689,7 +5708,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:180 +#: stock/views.py:1001 users/models.py:183 msgid "Add" msgstr "" @@ -5867,6 +5886,31 @@ msgstr "" msgid "No stock location set" msgstr "" +#: templates/InvenTree/settings/appearance.html:10 +msgid "Theme Settings" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:17 +msgid "Color Themes" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:29 +#, python-format +msgid "" +"\n" +" The CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" +" Please select another color theme :)\n" +" " +msgstr "" + +#: templates/InvenTree/settings/appearance.html:39 +msgid "Language" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:61 +msgid "Set Language" +msgstr "" + #: templates/InvenTree/settings/build.html:10 msgid "Build Order Settings" msgstr "" @@ -5950,7 +5994,7 @@ msgstr "" msgid "Stock Settings" msgstr "" -#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:49 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:50 msgid "Stock Options" msgstr "" @@ -5964,7 +6008,7 @@ msgid "Account" msgstr "" #: templates/InvenTree/settings/tabs.html:9 -msgid "Theme" +msgid "Appearance" msgstr "" #: templates/InvenTree/settings/tabs.html:13 @@ -5983,22 +6027,6 @@ msgstr "" msgid "Categories" 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" -"\t\tThe CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" -"\t\tPlease select another color theme :)\n" -"\t" -msgstr "" - #: templates/InvenTree/settings/user.html:16 msgid "User Information" msgstr "" @@ -6061,13 +6089,23 @@ msgid "View Code on GitHub" msgstr "" #: templates/about.html:63 -msgid "Get the App" +msgid "Credits" msgstr "" #: templates/about.html:68 +msgid "Mobile App" +msgstr "" + +#: templates/about.html:73 msgid "Submit Bug Report" msgstr "" +#: templates/about.html:82 templates/js/modals.js:550 +#: templates/js/modals.js:809 templates/modals.html:28 templates/modals.html:52 +#: templates/modals.html:93 +msgid "Close" +msgstr "" + #: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "" @@ -6263,7 +6301,7 @@ msgid "Quantity Per" msgstr "" #: templates/js/build.js:638 templates/js/build.js:1056 -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order stock" msgstr "" @@ -6396,11 +6434,6 @@ msgstr "" msgid "Submit" msgstr "" -#: templates/js/modals.js:550 templates/js/modals.js:809 -#: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93 -msgid "Close" -msgstr "" - #: templates/js/modals.js:760 msgid "Invalid response from server" msgstr "" @@ -6974,6 +7007,10 @@ msgstr "" msgid "Form errors exist" msgstr "" +#: templates/navbar.html:13 +msgid "Toggle navigation" +msgstr "" + #: templates/navbar.html:33 msgid "Buy" msgstr "" @@ -6986,7 +7023,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:36 +#: templates/navbar.html:77 users/models.py:38 msgid "Admin" msgstr "" @@ -7118,43 +7155,43 @@ msgstr "" msgid "Print test reports" msgstr "" -#: templates/stock_table.html:54 +#: templates/stock_table.html:55 msgid "Add to selected stock items" msgstr "" -#: templates/stock_table.html:55 +#: templates/stock_table.html:56 msgid "Remove from selected stock items" msgstr "" -#: templates/stock_table.html:56 +#: templates/stock_table.html:57 msgid "Stocktake selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move stock" msgstr "" -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order selected items" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change status" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change stock status" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete selected items" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete Stock" msgstr "" @@ -7190,34 +7227,34 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:167 +#: users/models.py:170 msgid "Permission set" msgstr "" -#: users/models.py:175 +#: users/models.py:178 msgid "Group" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "View" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "Permission to view items" msgstr "" -#: users/models.py:180 +#: users/models.py:183 msgid "Permission to add items" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Change" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Permissions to edit items" msgstr "" -#: users/models.py:184 +#: users/models.py:187 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/ru/LC_MESSAGES/django.mo b/InvenTree/locale/ru/LC_MESSAGES/django.mo index 7007a3d4e50ddf1c5e7d2870e6247ecea1df5a7b..45a221f8727b8cb60022d5cd21b59c05fc4a8351 100644 GIT binary patch delta 251 zcmZo;dBZ$Gg>lnFRgH-;TAoG*MuxfuCb~w33I>)|#>QMeiNz(lAw`LK#W{&3`9)R= zK#{!k(!}&s-H_D8Tq}j3(&FOG#5}mLl|oTzd{F4bueFm48AauZ6s#09H1bpp z4HWEb6^sV54AYq)<}>mI5kNFf`EwX*NV?wzUNs1ylhy$`r{c fOQ33)9M~R1L!hiQ)HoYkn0ZD(^Nck$t+^Ng6{7QP{P45s4NjiL{gaqTn9C#$~ zs;u&ThJvF*Ezvxy>P1;lAkEimTl5HKj6lB+R^l^82#f#&?QYJzKg(xBD+gW7Cmw7z ry9y^mx2=%h3S-z>U5>Mxef`$`|6^`vTH5K3##+P(yq0k7-Z=+9*YHry diff --git a/InvenTree/locale/ru/LC_MESSAGES/django.po b/InvenTree/locale/ru/LC_MESSAGES/django.po index e77638edc6..d14c214d50 100644 --- a/InvenTree/locale/ru/LC_MESSAGES/django.po +++ b/InvenTree/locale/ru/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-21 09:17+0000\n" +"POT-Creation-Date: 2021-05-05 17:33+1000\n" "PO-Revision-Date: 2021-04-21 09:33\n" "Last-Translator: \n" "Language-Team: Russian\n" @@ -67,35 +67,36 @@ msgstr "" msgid "Select Category" msgstr "" -#: InvenTree/helpers.py:375 order/models.py:245 order/models.py:344 -#: stock/views.py:1763 -msgid "Invalid quantity provided" -msgstr "" - -#: InvenTree/helpers.py:378 -msgid "Empty serial number string" -msgstr "" - -#: InvenTree/helpers.py:399 +#: InvenTree/helpers.py:377 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:403 InvenTree/helpers.py:406 InvenTree/helpers.py:409 +#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:353 +#: stock/views.py:1763 +msgid "Invalid quantity provided" +msgstr "" + +#: InvenTree/helpers.py:387 +msgid "Empty serial number string" +msgstr "" + +#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 +#: InvenTree/helpers.py:440 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:414 +#: InvenTree/helpers.py:445 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:422 +#: InvenTree/helpers.py:453 msgid "No serial numbers found" msgstr "" -#: InvenTree/helpers.py:426 +#: InvenTree/helpers.py:457 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" @@ -140,7 +141,7 @@ msgstr "" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:108 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:168 +#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -165,23 +166,23 @@ msgstr "" msgid "parent" msgstr "" -#: InvenTree/settings.py:493 +#: InvenTree/settings.py:491 msgid "English" msgstr "" -#: InvenTree/settings.py:494 +#: InvenTree/settings.py:492 msgid "French" msgstr "" -#: InvenTree/settings.py:495 +#: InvenTree/settings.py:493 msgid "German" msgstr "" -#: InvenTree/settings.py:496 +#: InvenTree/settings.py:494 msgid "Polish" msgstr "" -#: InvenTree/settings.py:497 +#: InvenTree/settings.py:495 msgid "Turkish" msgstr "" @@ -375,16 +376,16 @@ msgstr "" msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1227 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1241 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:123 #: build/templates/build/detail.html:31 common/models.py:703 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:239 order/forms.py:261 -#: order/forms.py:278 order/models.py:593 order/models.py:784 +#: order/forms.py:278 order/models.py:603 order/models.py:794 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:200 +#: order/templates/order/purchase_order_detail.html:175 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:159 @@ -458,7 +459,7 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:59 order/models.py:445 +#: build/templates/build/detail.html:59 order/models.py:455 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:392 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:770 @@ -508,7 +509,7 @@ msgstr "" #: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 #: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:31 users/models.py:41 +#: templates/InvenTree/settings/tabs.html:31 users/models.py:43 msgid "Build Orders" msgstr "" @@ -516,8 +517,8 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:127 order/models.py:99 order/models.py:595 -#: order/templates/order/purchase_order_detail.html:195 +#: build/models.py:127 order/models.py:99 order/models.py:605 +#: order/templates/order/purchase_order_detail.html:170 #: order/templates/order/sales_order_detail.html:219 part/models.py:2187 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -540,10 +541,10 @@ msgstr "" #: build/models.py:152 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:118 -#: build/templates/build/detail.html:26 company/models.py:669 -#: order/models.py:637 order/models.py:669 +#: build/templates/build/detail.html:26 company/models.py:688 +#: order/models.py:647 order/models.py:679 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:156 +#: order/templates/order/purchase_order_detail.html:131 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:207 part/models.py:321 #: part/models.py:1876 part/models.py:1888 part/models.py:1906 @@ -628,7 +629,7 @@ msgstr "" msgid "Creation Date" msgstr "" -#: build/models.py:223 order/models.py:451 +#: build/models.py:223 order/models.py:461 msgid "Target completion date" msgstr "" @@ -678,9 +679,9 @@ msgstr "" #: company/models.py:135 company/models.py:501 #: company/templates/company/navbar.html:70 #: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:597 order/templates/order/po_navbar.html:29 +#: order/models.py:607 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:234 +#: order/templates/order/purchase_order_detail.html:209 #: order/templates/order/sales_order_detail.html:264 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 @@ -713,47 +714,47 @@ msgstr "" msgid "Completed build output" msgstr "" -#: build/models.py:1118 +#: build/models.py:1132 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1143 +#: build/models.py:1157 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "" -#: build/models.py:1147 +#: build/models.py:1161 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1151 +#: build/models.py:1165 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1158 order/models.py:758 +#: build/models.py:1172 order/models.py:768 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1162 order/models.py:761 +#: build/models.py:1176 order/models.py:771 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1166 +#: build/models.py:1180 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1206 stock/templates/stock/item_base.html:306 +#: build/models.py:1220 stock/templates/stock/item_base.html:306 #: templates/InvenTree/search.html:183 templates/js/build.js:714 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1207 +#: build/models.py:1221 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1214 part/templates/part/allocation.html:18 +#: build/models.py:1228 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -765,19 +766,19 @@ msgstr "" msgid "Stock Item" msgstr "" -#: build/models.py:1215 +#: build/models.py:1229 msgid "Source stock item" msgstr "" -#: build/models.py:1228 +#: build/models.py:1242 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1236 +#: build/models.py:1250 msgid "Install into" msgstr "" -#: build/models.py:1237 +#: build/models.py:1251 msgid "Destination stock item" msgstr "" @@ -801,7 +802,7 @@ msgstr "" msgid "Unallocate stock" msgstr "" -#: build/templates/build/allocate.html:26 build/views.py:308 build/views.py:794 +#: build/templates/build/allocate.html:26 build/views.py:319 build/views.py:805 msgid "Unallocate Stock" msgstr "" @@ -811,7 +812,7 @@ msgstr "" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:794 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:795 #: part/templates/part/category.html:127 msgid "Order Parts" msgstr "" @@ -954,7 +955,7 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:160 -#: build/templates/build/detail.html:84 order/models.py:667 +#: build/templates/build/detail.html:84 order/models.py:677 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:33 #: order/templates/order/sales_order_ship.html:25 @@ -1139,7 +1140,7 @@ msgstr "" msgid "Alter the quantity of stock allocated to the build output" msgstr "" -#: build/templates/build/index.html:28 build/views.py:667 +#: build/templates/build/index.html:28 build/views.py:678 msgid "New Build Order" msgstr "" @@ -1226,141 +1227,145 @@ msgstr "" msgid "Create Build Output" msgstr "" -#: build/views.py:173 stock/models.py:969 stock/views.py:1789 +#: build/views.py:168 +msgid "Maximum output quantity is " +msgstr "" + +#: build/views.py:184 stock/models.py:969 stock/views.py:1789 msgid "Serial numbers already exist" msgstr "" -#: build/views.py:182 +#: build/views.py:193 msgid "Serial numbers required for trackable build output" msgstr "" -#: build/views.py:248 +#: build/views.py:259 msgid "Delete Build Output" msgstr "" -#: build/views.py:269 build/views.py:359 +#: build/views.py:280 build/views.py:370 msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:270 build/views.py:360 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:425 msgid "Check the confirmation box" msgstr "" -#: build/views.py:282 +#: build/views.py:293 msgid "Build output does not match build" msgstr "" -#: build/views.py:284 build/views.py:485 +#: build/views.py:295 build/views.py:496 msgid "Build output must be specified" msgstr "" -#: build/views.py:296 +#: build/views.py:307 msgid "Build output deleted" msgstr "" -#: build/views.py:394 +#: build/views.py:405 msgid "Complete Build Order" msgstr "" -#: build/views.py:400 +#: build/views.py:411 msgid "Build order cannot be completed - incomplete outputs remain" msgstr "" -#: build/views.py:411 +#: build/views.py:422 msgid "Completed build order" msgstr "" -#: build/views.py:427 +#: build/views.py:438 msgid "Complete Build Output" msgstr "" -#: build/views.py:469 +#: build/views.py:480 msgid "Invalid stock status value selected" msgstr "" -#: build/views.py:476 +#: build/views.py:487 msgid "Quantity to complete cannot exceed build output quantity" msgstr "" -#: build/views.py:482 +#: build/views.py:493 msgid "Confirm completion of incomplete build" msgstr "" -#: build/views.py:581 +#: build/views.py:592 msgid "Build output completed" msgstr "" -#: build/views.py:721 +#: build/views.py:732 msgid "Created new build" msgstr "" -#: build/views.py:742 +#: build/views.py:753 msgid "Edit Build Order Details" msgstr "" -#: build/views.py:775 +#: build/views.py:786 msgid "Edited build" msgstr "" -#: build/views.py:784 +#: build/views.py:795 msgid "Delete Build Order" msgstr "" -#: build/views.py:799 +#: build/views.py:810 msgid "Removed parts from build allocation" msgstr "" -#: build/views.py:811 +#: build/views.py:822 msgid "Allocate stock to build output" msgstr "" -#: build/views.py:854 +#: build/views.py:865 msgid "Item must be currently in stock" msgstr "" -#: build/views.py:860 +#: build/views.py:871 msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:861 templates/js/bom.js:230 templates/js/build.js:575 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:575 #: templates/js/build.js:838 templates/js/build.js:1021 msgid "Available" msgstr "" -#: build/views.py:863 +#: build/views.py:874 msgid "Stock item must be selected" msgstr "" -#: build/views.py:1026 +#: build/views.py:1037 msgid "Edit Stock Allocation" msgstr "" -#: build/views.py:1030 +#: build/views.py:1041 msgid "Updated Build Item" msgstr "" -#: build/views.py:1059 +#: build/views.py:1070 msgid "Add Build Order Attachment" msgstr "" -#: build/views.py:1072 order/views.py:110 order/views.py:162 part/views.py:172 +#: build/views.py:1083 order/views.py:110 order/views.py:162 part/views.py:172 #: stock/views.py:277 msgid "Added attachment" msgstr "" -#: build/views.py:1108 order/views.py:189 order/views.py:210 +#: build/views.py:1119 order/views.py:189 order/views.py:210 msgid "Edit Attachment" msgstr "" -#: build/views.py:1118 order/views.py:193 order/views.py:214 +#: build/views.py:1129 order/views.py:193 order/views.py:214 msgid "Attachment updated" msgstr "" -#: build/views.py:1128 order/views.py:229 order/views.py:243 +#: build/views.py:1139 order/views.py:229 order/views.py:243 msgid "Delete Attachment" msgstr "" -#: build/views.py:1133 order/views.py:235 order/views.py:249 stock/views.py:333 +#: build/views.py:1144 order/views.py:235 order/views.py:249 stock/views.py:333 msgid "Deleted attachment" msgstr "" @@ -1766,7 +1771,7 @@ msgstr "" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:101 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:183 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" @@ -1865,7 +1870,7 @@ msgstr "" msgid "Base Part" msgstr "" -#: company/models.py:312 company/models.py:463 order/views.py:1372 +#: company/models.py:312 company/models.py:463 order/views.py:1384 msgid "Select part" msgstr "" @@ -1905,7 +1910,7 @@ msgstr "" #: company/models.py:475 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:174 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" @@ -2017,7 +2022,8 @@ msgstr "" #: company/templates/company/delete.html:12 #, python-format -msgid "There are %(count)s parts sourced from this company.
\n" +msgid "" +"There are %(count)s parts sourced from this company.
\n" "If this supplier is deleted, these supplier part entries will also be deleted." msgstr "" @@ -2033,7 +2039,7 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:440 +#: company/templates/company/detail.html:67 order/models.py:450 #: order/templates/order/sales_order_base.html:92 stock/models.py:415 #: stock/models.py:416 stock/templates/stock/item_base.html:251 #: templates/js/company.js:40 templates/js/order.js:267 @@ -2122,13 +2128,13 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:42 -#: order/templates/order/purchase_order_detail.html:75 +#: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 -#: order/templates/order/purchase_order_detail.html:74 +#: order/templates/order/purchase_order_detail.html:49 #: part/templates/part/supplier.html:17 templates/js/stock.js:1163 msgid "New Supplier Part" msgstr "" @@ -2226,7 +2232,7 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:184 +#: stock/views.py:1002 users/models.py:187 msgid "Delete" msgstr "" @@ -2252,7 +2258,7 @@ msgstr "" #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 #: templates/InvenTree/search.html:198 templates/js/stock.js:968 -#: templates/stats.html:72 templates/stats.html:81 users/models.py:40 +#: templates/stats.html:72 templates/stats.html:81 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2266,7 +2272,7 @@ msgstr "" #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46 -#: users/models.py:43 +#: users/models.py:45 msgid "Sales Orders" msgstr "" @@ -2278,7 +2284,7 @@ msgstr "" #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37 -#: users/models.py:42 +#: users/models.py:44 msgid "Purchase Orders" msgstr "" @@ -2357,7 +2363,7 @@ msgid "Pricing Information" msgstr "" #: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2624 +#: part/templates/part/sale_prices.html:17 part/views.py:2636 msgid "Add Price Break" msgstr "" @@ -2467,15 +2473,15 @@ msgstr "" msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2628 +#: company/views.py:799 part/views.py:2640 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2672 +#: company/views.py:855 part/views.py:2684 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2686 +#: company/views.py:870 part/views.py:2698 msgid "Delete Price Break" msgstr "" @@ -2565,7 +2571,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:452 +#: order/forms.py:145 order/models.py:462 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2601,7 +2607,7 @@ msgstr "" msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:445 +#: order/models.py:182 order/models.py:455 msgid "Purchase order status" msgstr "" @@ -2642,8 +2648,8 @@ msgstr "" msgid "Date order was completed" msgstr "" -#: order/models.py:243 order/models.py:342 part/views.py:1586 -#: stock/models.py:270 stock/models.py:953 +#: order/models.py:243 part/views.py:1586 stock/models.py:270 +#: stock/models.py:953 msgid "Quantity must be greater than zero" msgstr "" @@ -2651,120 +2657,128 @@ msgstr "" msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:337 +#: order/models.py:344 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:359 +#: order/models.py:348 +msgid "Quantity must be an integer" +msgstr "" + +#: order/models.py:350 +msgid "Quantity must be a positive number" +msgstr "" + +#: order/models.py:369 msgid "Received items" msgstr "" -#: order/models.py:441 +#: order/models.py:451 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer Reference " msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer order reference code" msgstr "" -#: order/models.py:455 templates/js/order.js:303 +#: order/models.py:465 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:462 +#: order/models.py:472 msgid "shipped by" msgstr "" -#: order/models.py:506 +#: order/models.py:516 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:593 +#: order/models.py:603 msgid "Item quantity" msgstr "" -#: order/models.py:595 +#: order/models.py:605 msgid "Line item reference" msgstr "" -#: order/models.py:597 +#: order/models.py:607 msgid "Line item notes" msgstr "" -#: order/models.py:623 order/models.py:667 +#: order/models.py:633 order/models.py:677 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:624 order/templates/order/order_base.html:9 +#: order/models.py:634 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:313 templates/js/order.js:148 msgid "Purchase Order" msgstr "" -#: order/models.py:638 +#: order/models.py:648 msgid "Supplier part" msgstr "" -#: order/models.py:641 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:214 +#: order/models.py:651 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:189 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:131 msgid "Received" msgstr "" -#: order/models.py:641 +#: order/models.py:651 msgid "Number of items received" msgstr "" -#: order/models.py:648 stock/models.py:508 +#: order/models.py:658 stock/models.py:508 #: stock/templates/stock/item_base.html:320 msgid "Purchase Price" msgstr "" -#: order/models.py:649 +#: order/models.py:659 msgid "Unit purchase price" msgstr "" -#: order/models.py:743 order/models.py:745 +#: order/models.py:753 order/models.py:755 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:749 +#: order/models.py:759 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:751 +#: order/models.py:761 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:754 +#: order/models.py:764 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:764 +#: order/models.py:774 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:769 +#: order/models.py:779 msgid "Line" msgstr "" -#: order/models.py:780 +#: order/models.py:790 msgid "Item" msgstr "" -#: order/models.py:781 +#: order/models.py:791 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:784 +#: order/models.py:794 msgid "Enter stock allocation quantity" msgstr "" @@ -2812,9 +2826,22 @@ msgstr "" msgid "Issued" msgstr "" -#: order/templates/order/order_cancel.html:7 -#: order/templates/order/sales_order_cancel.html:9 -msgid "Cancelling this order means that the order will no longer be editable." +#: order/templates/order/order_base.html:180 +#: order/templates/order/purchase_order_detail.html:100 +#: part/templates/part/category.html:185 part/templates/part/category.html:227 +#: stock/templates/stock/location.html:191 templates/js/stock.js:708 +#: templates/js/stock.js:1169 +msgid "New Location" +msgstr "" + +#: order/templates/order/order_base.html:181 +#: order/templates/order/purchase_order_detail.html:101 +#: stock/templates/stock/location.html:42 +msgid "Create new stock location" +msgstr "" + +#: order/templates/order/order_cancel.html:8 +msgid "Cancelling this order means that the order and line items will no longer be editable." msgstr "" #: order/templates/order/order_complete.html:7 @@ -2826,10 +2853,10 @@ msgid "This order has line items which have not been marked as received." msgstr "" #: order/templates/order/order_complete.html:11 -msgid "Marking this order as complete will remove these line items." +msgid "Completing this order means that the order and line items will no longer be editable." msgstr "" -#: order/templates/order/order_issue.html:7 +#: order/templates/order/order_issue.html:8 msgid "After placing this purchase order, line items will no longer be editable." msgstr "" @@ -2881,11 +2908,13 @@ msgid "Select Purchase Order" msgstr "" #: order/templates/order/order_wizard/select_pos.html:45 -msgid "Create new purchase order for {{ supplier.name }}" +#, python-format +msgid "Create new purchase order for %(name)s" msgstr "" #: order/templates/order/order_wizard/select_pos.html:68 -msgid "Select a purchase order for" +#, python-format +msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 @@ -2907,43 +2936,29 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1108 -#: order/views.py:1191 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1120 +#: order/views.py:1203 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:45 -#: order/templates/order/purchase_order_detail.html:125 -#: part/templates/part/category.html:185 part/templates/part/category.html:227 -#: stock/templates/stock/location.html:191 templates/js/stock.js:708 -#: templates/js/stock.js:1169 -msgid "New Location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:46 -#: order/templates/order/purchase_order_detail.html:126 -#: stock/templates/stock/location.html:42 -msgid "Create new stock location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:139 +#: order/templates/order/purchase_order_detail.html:114 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:205 +#: order/templates/order/purchase_order_detail.html:180 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:221 #: order/templates/order/sales_order_detail.html:294 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:247 +#: order/templates/order/purchase_order_detail.html:222 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:227 msgid "Receive line item" msgstr "" @@ -2966,7 +2981,7 @@ msgstr "" #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:577 #: templates/navbar.html:23 templates/stats.html:59 templates/stats.html:68 -#: users/models.py:38 +#: users/models.py:40 msgid "Parts" msgstr "" @@ -3019,6 +3034,10 @@ msgstr "" msgid "Warning" msgstr "" +#: order/templates/order/sales_order_cancel.html:9 +msgid "Cancelling this order means that the order will no longer be editable." +msgstr "" + #: order/templates/order/sales_order_detail.html:13 msgid "Sales Order Items" msgstr "" @@ -3213,65 +3232,65 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1060 +#: order/views.py:1069 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1117 +#: order/views.py:1129 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1123 +#: order/views.py:1135 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1242 order/views.py:1260 +#: order/views.py:1254 order/views.py:1272 msgid "Edit Line Item" msgstr "" -#: order/views.py:1276 order/views.py:1288 +#: order/views.py:1288 order/views.py:1300 msgid "Delete Line Item" msgstr "" -#: order/views.py:1281 order/views.py:1293 +#: order/views.py:1293 order/views.py:1305 msgid "Deleted line item" msgstr "" -#: order/views.py:1306 +#: order/views.py:1318 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1351 +#: order/views.py:1363 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1367 +#: order/views.py:1379 msgid "Select line item" msgstr "" -#: order/views.py:1398 +#: order/views.py:1410 msgid "No matching item for serial" msgstr "" -#: order/views.py:1408 +#: order/views.py:1420 msgid "is not in stock" msgstr "" -#: order/views.py:1416 +#: order/views.py:1428 msgid "already allocated to an order" msgstr "" -#: order/views.py:1470 +#: order/views.py:1482 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1544 +#: order/views.py:1556 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1559 +#: order/views.py:1571 msgid "Remove allocation" msgstr "" @@ -3457,7 +3476,7 @@ msgstr "" #: part/models.py:83 part/templates/part/category.html:23 #: part/templates/part/category.html:94 part/templates/part/category.html:141 #: templates/InvenTree/search.html:127 templates/stats.html:63 -#: users/models.py:37 +#: users/models.py:39 msgid "Part Categories" msgstr "" @@ -4004,7 +4023,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2270 +#: part/templates/part/category.html:29 part/views.py:2282 msgid "Create new part category" msgstr "" @@ -4694,63 +4713,63 @@ msgstr "" msgid "Part Pricing" msgstr "" -#: part/views.py:2069 +#: part/views.py:2081 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2079 +#: part/views.py:2091 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2086 +#: part/views.py:2098 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2094 +#: part/views.py:2106 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2144 +#: part/views.py:2156 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2158 +#: part/views.py:2170 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2218 +#: part/views.py:2230 msgid "Edit Part Category" msgstr "" -#: part/views.py:2256 +#: part/views.py:2268 msgid "Delete Part Category" msgstr "" -#: part/views.py:2262 +#: part/views.py:2274 msgid "Part category was deleted" msgstr "" -#: part/views.py:2314 +#: part/views.py:2326 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2415 +#: part/views.py:2427 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2471 +#: part/views.py:2483 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2490 +#: part/views.py:2502 msgid "Create BOM Item" msgstr "" -#: part/views.py:2560 +#: part/views.py:2572 msgid "Edit BOM item" msgstr "" -#: part/views.py:2616 +#: part/views.py:2628 msgid "Confim BOM item deletion" msgstr "" @@ -5301,15 +5320,15 @@ msgid "Stock adjustment actions" msgstr "" #: stock/templates/stock/item_base.html:164 -#: stock/templates/stock/location.html:65 templates/stock_table.html:56 +#: stock/templates/stock/location.html:65 templates/stock_table.html:57 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:167 templates/stock_table.html:54 +#: stock/templates/stock/item_base.html:167 templates/stock_table.html:55 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:170 templates/stock_table.html:55 +#: stock/templates/stock/item_base.html:170 templates/stock_table.html:56 msgid "Remove stock" msgstr "" @@ -5503,7 +5522,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:76 users/models.py:39 +#: templates/stats.html:76 users/models.py:41 msgid "Stock Locations" msgstr "" @@ -5689,7 +5708,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:180 +#: stock/views.py:1001 users/models.py:183 msgid "Add" msgstr "" @@ -5867,6 +5886,31 @@ msgstr "" msgid "No stock location set" msgstr "" +#: templates/InvenTree/settings/appearance.html:10 +msgid "Theme Settings" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:17 +msgid "Color Themes" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:29 +#, python-format +msgid "" +"\n" +" The CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" +" Please select another color theme :)\n" +" " +msgstr "" + +#: templates/InvenTree/settings/appearance.html:39 +msgid "Language" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:61 +msgid "Set Language" +msgstr "" + #: templates/InvenTree/settings/build.html:10 msgid "Build Order Settings" msgstr "" @@ -5950,7 +5994,7 @@ msgstr "" msgid "Stock Settings" msgstr "" -#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:49 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:50 msgid "Stock Options" msgstr "" @@ -5964,7 +6008,7 @@ msgid "Account" msgstr "" #: templates/InvenTree/settings/tabs.html:9 -msgid "Theme" +msgid "Appearance" msgstr "" #: templates/InvenTree/settings/tabs.html:13 @@ -5983,22 +6027,6 @@ msgstr "" msgid "Categories" 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" -"\t\tThe CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" -"\t\tPlease select another color theme :)\n" -"\t" -msgstr "" - #: templates/InvenTree/settings/user.html:16 msgid "User Information" msgstr "" @@ -6061,13 +6089,23 @@ msgid "View Code on GitHub" msgstr "" #: templates/about.html:63 -msgid "Get the App" +msgid "Credits" msgstr "" #: templates/about.html:68 +msgid "Mobile App" +msgstr "" + +#: templates/about.html:73 msgid "Submit Bug Report" msgstr "" +#: templates/about.html:82 templates/js/modals.js:550 +#: templates/js/modals.js:809 templates/modals.html:28 templates/modals.html:52 +#: templates/modals.html:93 +msgid "Close" +msgstr "" + #: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "" @@ -6263,7 +6301,7 @@ msgid "Quantity Per" msgstr "" #: templates/js/build.js:638 templates/js/build.js:1056 -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order stock" msgstr "" @@ -6396,11 +6434,6 @@ msgstr "" msgid "Submit" msgstr "" -#: templates/js/modals.js:550 templates/js/modals.js:809 -#: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93 -msgid "Close" -msgstr "" - #: templates/js/modals.js:760 msgid "Invalid response from server" msgstr "" @@ -6974,6 +7007,10 @@ msgstr "" msgid "Form errors exist" msgstr "" +#: templates/navbar.html:13 +msgid "Toggle navigation" +msgstr "" + #: templates/navbar.html:33 msgid "Buy" msgstr "" @@ -6986,7 +7023,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:36 +#: templates/navbar.html:77 users/models.py:38 msgid "Admin" msgstr "" @@ -7118,43 +7155,43 @@ msgstr "" msgid "Print test reports" msgstr "" -#: templates/stock_table.html:54 +#: templates/stock_table.html:55 msgid "Add to selected stock items" msgstr "" -#: templates/stock_table.html:55 +#: templates/stock_table.html:56 msgid "Remove from selected stock items" msgstr "" -#: templates/stock_table.html:56 +#: templates/stock_table.html:57 msgid "Stocktake selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move stock" msgstr "" -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order selected items" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change status" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change stock status" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete selected items" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete Stock" msgstr "" @@ -7190,34 +7227,34 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:167 +#: users/models.py:170 msgid "Permission set" msgstr "" -#: users/models.py:175 +#: users/models.py:178 msgid "Group" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "View" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "Permission to view items" msgstr "" -#: users/models.py:180 +#: users/models.py:183 msgid "Permission to add items" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Change" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Permissions to edit items" msgstr "" -#: users/models.py:184 +#: users/models.py:187 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/tr/LC_MESSAGES/django.po b/InvenTree/locale/tr/LC_MESSAGES/django.po index b8105d1fde..db257af1fe 100644 --- a/InvenTree/locale/tr/LC_MESSAGES/django.po +++ b/InvenTree/locale/tr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-21 22:29+1000\n" +"POT-Creation-Date: 2021-05-05 17:33+1000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -73,35 +73,36 @@ msgstr "" msgid "Select Category" msgstr "" -#: InvenTree/helpers.py:375 order/models.py:245 order/models.py:344 -#: stock/views.py:1763 -msgid "Invalid quantity provided" -msgstr "" - -#: InvenTree/helpers.py:378 -msgid "Empty serial number string" -msgstr "" - -#: InvenTree/helpers.py:399 +#: InvenTree/helpers.py:377 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:403 InvenTree/helpers.py:406 InvenTree/helpers.py:409 +#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:353 +#: stock/views.py:1763 +msgid "Invalid quantity provided" +msgstr "" + +#: InvenTree/helpers.py:387 +msgid "Empty serial number string" +msgstr "" + +#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 +#: InvenTree/helpers.py:440 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:414 +#: InvenTree/helpers.py:445 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:422 +#: InvenTree/helpers.py:453 msgid "No serial numbers found" msgstr "" -#: InvenTree/helpers.py:426 +#: InvenTree/helpers.py:457 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" @@ -146,7 +147,7 @@ msgstr "" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:108 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:168 +#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -171,23 +172,23 @@ msgstr "" msgid "parent" msgstr "" -#: InvenTree/settings.py:493 +#: InvenTree/settings.py:491 msgid "English" msgstr "" -#: InvenTree/settings.py:494 +#: InvenTree/settings.py:492 msgid "French" msgstr "" -#: InvenTree/settings.py:495 +#: InvenTree/settings.py:493 msgid "German" msgstr "" -#: InvenTree/settings.py:496 +#: InvenTree/settings.py:494 msgid "Polish" msgstr "" -#: InvenTree/settings.py:497 +#: InvenTree/settings.py:495 msgid "Turkish" msgstr "" @@ -378,20 +379,19 @@ msgid "Target Date" msgstr "" #: build/forms.py:43 build/models.py:224 -msgid "" -"Target date for build completion. Build will be overdue after this date." +msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1227 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1241 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:123 #: build/templates/build/detail.html:31 common/models.py:703 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:239 order/forms.py:261 -#: order/forms.py:278 order/models.py:593 order/models.py:784 +#: order/forms.py:278 order/models.py:603 order/models.py:794 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:200 +#: order/templates/order/purchase_order_detail.html:175 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:159 @@ -465,7 +465,7 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:59 order/models.py:445 +#: build/templates/build/detail.html:59 order/models.py:455 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:392 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:770 @@ -515,7 +515,7 @@ msgstr "" #: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 #: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:31 users/models.py:41 +#: templates/InvenTree/settings/tabs.html:31 users/models.py:43 msgid "Build Orders" msgstr "" @@ -523,8 +523,8 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:127 order/models.py:99 order/models.py:595 -#: order/templates/order/purchase_order_detail.html:195 +#: build/models.py:127 order/models.py:99 order/models.py:605 +#: order/templates/order/purchase_order_detail.html:170 #: order/templates/order/sales_order_detail.html:219 part/models.py:2187 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -547,10 +547,10 @@ msgstr "" #: build/models.py:152 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:118 -#: build/templates/build/detail.html:26 company/models.py:669 -#: order/models.py:637 order/models.py:669 +#: build/templates/build/detail.html:26 company/models.py:688 +#: order/models.py:647 order/models.py:679 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:156 +#: order/templates/order/purchase_order_detail.html:131 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:207 part/models.py:321 #: part/models.py:1876 part/models.py:1888 part/models.py:1906 @@ -587,9 +587,7 @@ msgid "Source Location" msgstr "" #: build/models.py:178 -msgid "" -"Select location to take stock from for this build (leave blank to take from " -"any stock location)" +msgid "Select location to take stock from for this build (leave blank to take from any stock location)" msgstr "" #: build/models.py:183 @@ -637,7 +635,7 @@ msgstr "" msgid "Creation Date" msgstr "" -#: build/models.py:223 order/models.py:451 +#: build/models.py:223 order/models.py:461 msgid "Target completion date" msgstr "" @@ -687,9 +685,9 @@ msgstr "" #: company/models.py:135 company/models.py:501 #: company/templates/company/navbar.html:70 #: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:597 order/templates/order/po_navbar.html:29 +#: order/models.py:607 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:234 +#: order/templates/order/purchase_order_detail.html:209 #: order/templates/order/sales_order_detail.html:264 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 @@ -722,48 +720,47 @@ msgstr "" msgid "Completed build output" msgstr "" -#: build/models.py:1118 +#: build/models.py:1132 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1143 -msgid "" -"Build item must specify a build output, as master part is marked as trackable" +#: build/models.py:1157 +msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "" -#: build/models.py:1147 +#: build/models.py:1161 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1151 +#: build/models.py:1165 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1158 order/models.py:758 +#: build/models.py:1172 order/models.py:768 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1162 order/models.py:761 +#: build/models.py:1176 order/models.py:771 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1166 +#: build/models.py:1180 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1206 stock/templates/stock/item_base.html:306 +#: build/models.py:1220 stock/templates/stock/item_base.html:306 #: templates/InvenTree/search.html:183 templates/js/build.js:714 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1207 +#: build/models.py:1221 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1214 part/templates/part/allocation.html:18 +#: build/models.py:1228 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -775,19 +772,19 @@ msgstr "" msgid "Stock Item" msgstr "" -#: build/models.py:1215 +#: build/models.py:1229 msgid "Source stock item" msgstr "" -#: build/models.py:1228 +#: build/models.py:1242 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1236 +#: build/models.py:1250 msgid "Install into" msgstr "" -#: build/models.py:1237 +#: build/models.py:1251 msgid "Destination stock item" msgstr "" @@ -811,7 +808,7 @@ msgstr "" msgid "Unallocate stock" msgstr "" -#: build/templates/build/allocate.html:26 build/views.py:308 build/views.py:794 +#: build/templates/build/allocate.html:26 build/views.py:319 build/views.py:805 msgid "Unallocate Stock" msgstr "" @@ -821,7 +818,7 @@ msgstr "" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:794 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:795 #: part/templates/part/category.html:127 msgid "Order Parts" msgstr "" @@ -862,8 +859,7 @@ msgid "Automatically Allocate Stock" msgstr "" #: build/templates/build/auto_allocate.html:10 -msgid "" -"The following stock items will be allocated to the specified build output" +msgid "The following stock items will be allocated to the specified build output" msgstr "" #: build/templates/build/auto_allocate.html:37 @@ -965,7 +961,7 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:160 -#: build/templates/build/detail.html:84 order/models.py:667 +#: build/templates/build/detail.html:84 order/models.py:677 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:33 #: order/templates/order/sales_order_ship.html:25 @@ -1089,9 +1085,7 @@ msgstr "" #: build/templates/build/create_build_item.html:11 #, python-format -msgid "" -"The allocated stock will be installed into the following build output:
" -"%(output)s" +msgid "The allocated stock will be installed into the following build output:
%(output)s" msgstr "" #: build/templates/build/create_build_item.html:17 @@ -1152,7 +1146,7 @@ msgstr "" msgid "Alter the quantity of stock allocated to the build output" msgstr "" -#: build/templates/build/index.html:28 build/views.py:667 +#: build/templates/build/index.html:28 build/views.py:678 msgid "New Build Order" msgstr "" @@ -1239,141 +1233,145 @@ msgstr "" msgid "Create Build Output" msgstr "" -#: build/views.py:173 stock/models.py:969 stock/views.py:1789 +#: build/views.py:168 +msgid "Maximum output quantity is " +msgstr "" + +#: build/views.py:184 stock/models.py:969 stock/views.py:1789 msgid "Serial numbers already exist" msgstr "" -#: build/views.py:182 +#: build/views.py:193 msgid "Serial numbers required for trackable build output" msgstr "" -#: build/views.py:248 +#: build/views.py:259 msgid "Delete Build Output" msgstr "" -#: build/views.py:269 build/views.py:359 +#: build/views.py:280 build/views.py:370 msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:270 build/views.py:360 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:425 msgid "Check the confirmation box" msgstr "" -#: build/views.py:282 +#: build/views.py:293 msgid "Build output does not match build" msgstr "" -#: build/views.py:284 build/views.py:485 +#: build/views.py:295 build/views.py:496 msgid "Build output must be specified" msgstr "" -#: build/views.py:296 +#: build/views.py:307 msgid "Build output deleted" msgstr "" -#: build/views.py:394 +#: build/views.py:405 msgid "Complete Build Order" msgstr "" -#: build/views.py:400 +#: build/views.py:411 msgid "Build order cannot be completed - incomplete outputs remain" msgstr "" -#: build/views.py:411 +#: build/views.py:422 msgid "Completed build order" msgstr "" -#: build/views.py:427 +#: build/views.py:438 msgid "Complete Build Output" msgstr "" -#: build/views.py:469 +#: build/views.py:480 msgid "Invalid stock status value selected" msgstr "" -#: build/views.py:476 +#: build/views.py:487 msgid "Quantity to complete cannot exceed build output quantity" msgstr "" -#: build/views.py:482 +#: build/views.py:493 msgid "Confirm completion of incomplete build" msgstr "" -#: build/views.py:581 +#: build/views.py:592 msgid "Build output completed" msgstr "" -#: build/views.py:721 +#: build/views.py:732 msgid "Created new build" msgstr "" -#: build/views.py:742 +#: build/views.py:753 msgid "Edit Build Order Details" msgstr "" -#: build/views.py:775 +#: build/views.py:786 msgid "Edited build" msgstr "" -#: build/views.py:784 +#: build/views.py:795 msgid "Delete Build Order" msgstr "" -#: build/views.py:799 +#: build/views.py:810 msgid "Removed parts from build allocation" msgstr "" -#: build/views.py:811 +#: build/views.py:822 msgid "Allocate stock to build output" msgstr "" -#: build/views.py:854 +#: build/views.py:865 msgid "Item must be currently in stock" msgstr "" -#: build/views.py:860 +#: build/views.py:871 msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:861 templates/js/bom.js:230 templates/js/build.js:575 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:575 #: templates/js/build.js:838 templates/js/build.js:1021 msgid "Available" msgstr "" -#: build/views.py:863 +#: build/views.py:874 msgid "Stock item must be selected" msgstr "" -#: build/views.py:1026 +#: build/views.py:1037 msgid "Edit Stock Allocation" msgstr "" -#: build/views.py:1030 +#: build/views.py:1041 msgid "Updated Build Item" msgstr "" -#: build/views.py:1059 +#: build/views.py:1070 msgid "Add Build Order Attachment" msgstr "" -#: build/views.py:1072 order/views.py:110 order/views.py:162 part/views.py:172 +#: build/views.py:1083 order/views.py:110 order/views.py:162 part/views.py:172 #: stock/views.py:277 msgid "Added attachment" msgstr "" -#: build/views.py:1108 order/views.py:189 order/views.py:210 +#: build/views.py:1119 order/views.py:189 order/views.py:210 msgid "Edit Attachment" msgstr "" -#: build/views.py:1118 order/views.py:193 order/views.py:214 +#: build/views.py:1129 order/views.py:193 order/views.py:214 msgid "Attachment updated" msgstr "" -#: build/views.py:1128 order/views.py:229 order/views.py:243 +#: build/views.py:1139 order/views.py:229 order/views.py:243 msgid "Delete Attachment" msgstr "" -#: build/views.py:1133 order/views.py:235 order/views.py:249 stock/views.py:333 +#: build/views.py:1144 order/views.py:235 order/views.py:249 stock/views.py:333 msgid "Deleted attachment" msgstr "" @@ -1779,7 +1777,7 @@ msgstr "" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:101 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:183 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" @@ -1878,7 +1876,7 @@ msgstr "" msgid "Base Part" msgstr "" -#: company/models.py:312 company/models.py:463 order/views.py:1372 +#: company/models.py:312 company/models.py:463 order/views.py:1384 msgid "Select part" msgstr "" @@ -1918,7 +1916,7 @@ msgstr "" #: company/models.py:475 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:174 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" @@ -2032,8 +2030,7 @@ msgstr "" #, python-format msgid "" "There are %(count)s parts sourced from this company.
\n" -"If this supplier is deleted, these supplier part entries will also be " -"deleted." +"If this supplier is deleted, these supplier part entries will also be deleted." msgstr "" #: company/templates/company/detail.html:21 @@ -2048,7 +2045,7 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:440 +#: company/templates/company/detail.html:67 order/models.py:450 #: order/templates/order/sales_order_base.html:92 stock/models.py:415 #: stock/models.py:416 stock/templates/stock/item_base.html:251 #: templates/js/company.js:40 templates/js/order.js:267 @@ -2137,13 +2134,13 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:42 -#: order/templates/order/purchase_order_detail.html:75 +#: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 -#: order/templates/order/purchase_order_detail.html:74 +#: order/templates/order/purchase_order_detail.html:49 #: part/templates/part/supplier.html:17 templates/js/stock.js:1163 msgid "New Supplier Part" msgstr "" @@ -2197,9 +2194,7 @@ msgstr "" #: company/templates/company/manufacturer_part_delete.html:36 #, python-format -msgid "" -"There are %(count)s suppliers defined for this manufacturer part. If you " -"delete it, the following supplier parts will also be deleted:" +msgid "There are %(count)s suppliers defined for this manufacturer part. If you delete it, the following supplier parts will also be deleted:" msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 @@ -2243,7 +2238,7 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:184 +#: stock/views.py:1002 users/models.py:187 msgid "Delete" msgstr "" @@ -2269,7 +2264,7 @@ msgstr "" #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 #: templates/InvenTree/search.html:198 templates/js/stock.js:968 -#: templates/stats.html:72 templates/stats.html:81 users/models.py:40 +#: templates/stats.html:72 templates/stats.html:81 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2283,7 +2278,7 @@ msgstr "" #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46 -#: users/models.py:43 +#: users/models.py:45 msgid "Sales Orders" msgstr "" @@ -2295,7 +2290,7 @@ msgstr "" #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37 -#: users/models.py:42 +#: users/models.py:44 msgid "Purchase Orders" msgstr "" @@ -2374,7 +2369,7 @@ msgid "Pricing Information" msgstr "" #: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2624 +#: part/templates/part/sale_prices.html:17 part/views.py:2636 msgid "Add Price Break" msgstr "" @@ -2484,15 +2479,15 @@ msgstr "" msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2628 +#: company/views.py:799 part/views.py:2640 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2672 +#: company/views.py:855 part/views.py:2684 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2686 +#: company/views.py:870 part/views.py:2698 msgid "Delete Price Break" msgstr "" @@ -2582,9 +2577,8 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:452 -msgid "" -"Target date for order completion. Order will be overdue after this date." +#: order/forms.py:145 order/models.py:462 +msgid "Target date for order completion. Order will be overdue after this date." msgstr "" #: order/forms.py:235 @@ -2619,7 +2613,7 @@ msgstr "" msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:445 +#: order/models.py:182 order/models.py:455 msgid "Purchase order status" msgstr "" @@ -2653,16 +2647,15 @@ msgid "Target Delivery Date" msgstr "" #: order/models.py:213 -msgid "" -"Expected date for order delivery. Order will be overdue after this date." +msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" #: order/models.py:219 msgid "Date order was completed" msgstr "" -#: order/models.py:243 order/models.py:342 part/views.py:1586 -#: stock/models.py:270 stock/models.py:953 +#: order/models.py:243 part/views.py:1586 stock/models.py:270 +#: stock/models.py:953 msgid "Quantity must be greater than zero" msgstr "" @@ -2670,120 +2663,128 @@ msgstr "" msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:337 +#: order/models.py:344 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:359 +#: order/models.py:348 +msgid "Quantity must be an integer" +msgstr "" + +#: order/models.py:350 +msgid "Quantity must be a positive number" +msgstr "" + +#: order/models.py:369 msgid "Received items" msgstr "" -#: order/models.py:441 +#: order/models.py:451 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer Reference " msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer order reference code" msgstr "" -#: order/models.py:455 templates/js/order.js:303 +#: order/models.py:465 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:462 +#: order/models.py:472 msgid "shipped by" msgstr "" -#: order/models.py:506 +#: order/models.py:516 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:593 +#: order/models.py:603 msgid "Item quantity" msgstr "" -#: order/models.py:595 +#: order/models.py:605 msgid "Line item reference" msgstr "" -#: order/models.py:597 +#: order/models.py:607 msgid "Line item notes" msgstr "" -#: order/models.py:623 order/models.py:667 +#: order/models.py:633 order/models.py:677 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:624 order/templates/order/order_base.html:9 +#: order/models.py:634 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:313 templates/js/order.js:148 msgid "Purchase Order" msgstr "" -#: order/models.py:638 +#: order/models.py:648 msgid "Supplier part" msgstr "" -#: order/models.py:641 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:214 +#: order/models.py:651 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:189 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:131 msgid "Received" msgstr "" -#: order/models.py:641 +#: order/models.py:651 msgid "Number of items received" msgstr "" -#: order/models.py:648 stock/models.py:508 +#: order/models.py:658 stock/models.py:508 #: stock/templates/stock/item_base.html:320 msgid "Purchase Price" msgstr "" -#: order/models.py:649 +#: order/models.py:659 msgid "Unit purchase price" msgstr "" -#: order/models.py:743 order/models.py:745 +#: order/models.py:753 order/models.py:755 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:749 +#: order/models.py:759 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:751 +#: order/models.py:761 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:754 +#: order/models.py:764 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:764 +#: order/models.py:774 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:769 +#: order/models.py:779 msgid "Line" msgstr "" -#: order/models.py:780 +#: order/models.py:790 msgid "Item" msgstr "" -#: order/models.py:781 +#: order/models.py:791 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:784 +#: order/models.py:794 msgid "Enter stock allocation quantity" msgstr "" @@ -2831,9 +2832,22 @@ msgstr "" msgid "Issued" msgstr "" -#: order/templates/order/order_cancel.html:7 -#: order/templates/order/sales_order_cancel.html:9 -msgid "Cancelling this order means that the order will no longer be editable." +#: order/templates/order/order_base.html:180 +#: order/templates/order/purchase_order_detail.html:100 +#: part/templates/part/category.html:185 part/templates/part/category.html:227 +#: stock/templates/stock/location.html:191 templates/js/stock.js:708 +#: templates/js/stock.js:1169 +msgid "New Location" +msgstr "" + +#: order/templates/order/order_base.html:181 +#: order/templates/order/purchase_order_detail.html:101 +#: stock/templates/stock/location.html:42 +msgid "Create new stock location" +msgstr "" + +#: order/templates/order/order_cancel.html:8 +msgid "Cancelling this order means that the order and line items will no longer be editable." msgstr "" #: order/templates/order/order_complete.html:7 @@ -2845,12 +2859,11 @@ msgid "This order has line items which have not been marked as received." msgstr "" #: order/templates/order/order_complete.html:11 -msgid "Marking this order as complete will remove these line items." +msgid "Completing this order means that the order and line items will no longer be editable." msgstr "" -#: order/templates/order/order_issue.html:7 -msgid "" -"After placing this purchase order, line items will no longer be editable." +#: order/templates/order/order_issue.html:8 +msgid "After placing this purchase order, line items will no longer be editable." msgstr "" #: order/templates/order/order_notes.html:13 @@ -2929,43 +2942,29 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1108 -#: order/views.py:1191 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1120 +#: order/views.py:1203 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:45 -#: order/templates/order/purchase_order_detail.html:125 -#: part/templates/part/category.html:185 part/templates/part/category.html:227 -#: stock/templates/stock/location.html:191 templates/js/stock.js:708 -#: templates/js/stock.js:1169 -msgid "New Location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:46 -#: order/templates/order/purchase_order_detail.html:126 -#: stock/templates/stock/location.html:42 -msgid "Create new stock location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:139 +#: order/templates/order/purchase_order_detail.html:114 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:205 +#: order/templates/order/purchase_order_detail.html:180 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:221 #: order/templates/order/sales_order_detail.html:294 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:247 +#: order/templates/order/purchase_order_detail.html:222 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:227 msgid "Receive line item" msgstr "" @@ -2988,7 +2987,7 @@ msgstr "" #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:577 #: templates/navbar.html:23 templates/stats.html:59 templates/stats.html:68 -#: users/models.py:38 +#: users/models.py:40 msgid "Parts" msgstr "" @@ -3041,6 +3040,10 @@ msgstr "" msgid "Warning" msgstr "" +#: order/templates/order/sales_order_cancel.html:9 +msgid "Cancelling this order means that the order will no longer be editable." +msgstr "" + #: order/templates/order/sales_order_detail.html:13 msgid "Sales Order Items" msgstr "" @@ -3103,9 +3106,7 @@ msgid "Sales Order Notes" msgstr "" #: order/templates/order/sales_order_ship.html:10 -msgid "" -"This order has not been fully allocated. If the order is marked as shipped, " -"it can no longer be adjusted." +msgid "This order has not been fully allocated. If the order is marked as shipped, it can no longer be adjusted." msgstr "" #: order/templates/order/sales_order_ship.html:12 @@ -3237,65 +3238,65 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1060 +#: order/views.py:1069 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1117 +#: order/views.py:1129 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1123 +#: order/views.py:1135 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1242 order/views.py:1260 +#: order/views.py:1254 order/views.py:1272 msgid "Edit Line Item" msgstr "" -#: order/views.py:1276 order/views.py:1288 +#: order/views.py:1288 order/views.py:1300 msgid "Delete Line Item" msgstr "" -#: order/views.py:1281 order/views.py:1293 +#: order/views.py:1293 order/views.py:1305 msgid "Deleted line item" msgstr "" -#: order/views.py:1306 +#: order/views.py:1318 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1351 +#: order/views.py:1363 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1367 +#: order/views.py:1379 msgid "Select line item" msgstr "" -#: order/views.py:1398 +#: order/views.py:1410 msgid "No matching item for serial" msgstr "" -#: order/views.py:1408 +#: order/views.py:1420 msgid "is not in stock" msgstr "" -#: order/views.py:1416 +#: order/views.py:1428 msgid "already allocated to an order" msgstr "" -#: order/views.py:1470 +#: order/views.py:1482 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1544 +#: order/views.py:1556 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1559 +#: order/views.py:1571 msgid "Remove allocation" msgstr "" @@ -3481,7 +3482,7 @@ msgstr "" #: part/models.py:83 part/templates/part/category.html:23 #: part/templates/part/category.html:94 part/templates/part/category.html:141 #: templates/InvenTree/search.html:127 templates/stats.html:63 -#: users/models.py:37 +#: users/models.py:39 msgid "Part Categories" msgstr "" @@ -3826,9 +3827,7 @@ msgid "Select Related Part" msgstr "" #: part/models.py:2440 -msgid "" -"Error creating relationship: check that the part is not related to itself " -"and that the relationship is unique" +msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" #: part/templates/part/allocation.html:11 @@ -3859,8 +3858,7 @@ msgstr "" #: part/templates/part/bom.html:21 #, python-format -msgid "" -"The BOM for %(part)s was last checked by %(checker)s on %(check_date)s" +msgid "The BOM for %(part)s was last checked by %(checker)s on %(check_date)s" msgstr "" #: part/templates/part/bom.html:25 @@ -3995,8 +3993,7 @@ msgid "Requirements for BOM upload" msgstr "" #: part/templates/part/bom_upload/upload_file.html:21 -msgid "" -"The BOM file must contain the required named columns as provided in the " +msgid "The BOM file must contain the required named columns as provided in the " msgstr "" #: part/templates/part/bom_upload/upload_file.html:21 @@ -4013,8 +4010,7 @@ msgstr "" #: part/templates/part/bom_validate.html:6 #, python-format -msgid "" -"Confirm that the Bill of Materials (BOM) is valid for:
%(part)s" +msgid "Confirm that the Bill of Materials (BOM) is valid for:
%(part)s" msgstr "" #: part/templates/part/bom_validate.html:9 @@ -4033,7 +4029,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2270 +#: part/templates/part/category.html:29 part/views.py:2282 msgid "Create new part category" msgstr "" @@ -4115,8 +4111,7 @@ msgid "This category contains %(count)s child categories" msgstr "" #: part/templates/part/category_delete.html:9 -msgid "" -"If this category is deleted, these child categories will be moved to the" +msgid "If this category is deleted, these child categories will be moved to the" msgstr "" #: part/templates/part/category_delete.html:11 @@ -4134,15 +4129,11 @@ msgstr "" #: part/templates/part/category_delete.html:27 #, python-format -msgid "" -"If this category is deleted, these parts will be moved to the parent " -"category %(path)s" +msgid "If this category is deleted, these parts will be moved to the parent category %(path)s" msgstr "" #: part/templates/part/category_delete.html:29 -msgid "" -"If this category is deleted, these parts will be moved to the top-level " -"category Teile" +msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" #: part/templates/part/category_navbar.html:34 @@ -4489,37 +4480,27 @@ msgstr "" #: part/templates/part/partial_delete.html:12 #, python-format -msgid "" -"This part is used in BOMs for %(count)s other parts. If you delete this " -"part, the BOMs for the following parts will be updated" +msgid "This part is used in BOMs for %(count)s other parts. If you delete this part, the BOMs for the following parts will be updated" msgstr "" #: part/templates/part/partial_delete.html:22 #, python-format -msgid "" -"There are %(count)s stock entries defined for this part. If you delete this " -"part, the following stock entries will also be deleted:" +msgid "There are %(count)s stock entries defined for this part. If you delete this part, the following stock entries will also be deleted:" msgstr "" #: part/templates/part/partial_delete.html:33 #, python-format -msgid "" -"There are %(count)s manufacturers defined for this part. If you delete this " -"part, the following manufacturer parts will also be deleted:" +msgid "There are %(count)s manufacturers defined for this part. If you delete this part, the following manufacturer parts will also be deleted:" msgstr "" #: part/templates/part/partial_delete.html:44 #, python-format -msgid "" -"There are %(count)s suppliers defined for this part. If you delete this " -"part, the following supplier parts will also be deleted:" +msgid "There are %(count)s suppliers defined for this part. If you delete this part, the following supplier parts will also be deleted:" msgstr "" #: part/templates/part/partial_delete.html:55 #, python-format -msgid "" -"There are %(count)s unique parts tracked for '%(full_name)s'. Deleting this " -"part will permanently remove this tracking information." +msgid "There are %(count)s unique parts tracked for '%(full_name)s'. Deleting this part will permanently remove this tracking information." msgstr "" #: part/templates/part/related.html:18 @@ -4738,63 +4719,63 @@ msgstr "" msgid "Part Pricing" msgstr "" -#: part/views.py:2069 +#: part/views.py:2081 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2079 +#: part/views.py:2091 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2086 +#: part/views.py:2098 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2094 +#: part/views.py:2106 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2144 +#: part/views.py:2156 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2158 +#: part/views.py:2170 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2218 +#: part/views.py:2230 msgid "Edit Part Category" msgstr "" -#: part/views.py:2256 +#: part/views.py:2268 msgid "Delete Part Category" msgstr "" -#: part/views.py:2262 +#: part/views.py:2274 msgid "Part category was deleted" msgstr "" -#: part/views.py:2314 +#: part/views.py:2326 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2415 +#: part/views.py:2427 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2471 +#: part/views.py:2483 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2490 +#: part/views.py:2502 msgid "Create BOM Item" msgstr "" -#: part/views.py:2560 +#: part/views.py:2572 msgid "Edit BOM item" msgstr "" -#: part/views.py:2616 +#: part/views.py:2628 msgid "Confim BOM item deletion" msgstr "" @@ -4942,9 +4923,7 @@ msgid "Enter unique serial numbers (or leave blank)" msgstr "" #: stock/forms.py:169 -msgid "" -"Destination for serialized stock (by default, will remain in current " -"location)" +msgid "Destination for serialized stock (by default, will remain in current location)" msgstr "" #: stock/forms.py:171 @@ -5126,8 +5105,7 @@ msgid "Destination Sales Order" msgstr "" #: stock/models.py:476 -msgid "" -"Expiry date for stock item. Stock will be considered expired after this date" +msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" #: stock/models.py:489 @@ -5274,9 +5252,7 @@ msgid "Stock Item Attachments" msgstr "" #: stock/templates/stock/item_base.html:24 -msgid "" -"You are not in the list of owners of this item. This stock item cannot be " -"edited." +msgid "You are not in the list of owners of this item. This stock item cannot be edited." msgstr "" #: stock/templates/stock/item_base.html:31 @@ -5293,8 +5269,7 @@ msgstr "" #: stock/templates/stock/item_base.html:53 #, python-format -msgid "" -"This stock item is allocated to Sales Order %(link)s (Quantity: %(qty)s)" +msgid "This stock item is allocated to Sales Order %(link)s (Quantity: %(qty)s)" msgstr "" #: stock/templates/stock/item_base.html:61 @@ -5303,9 +5278,7 @@ msgid "This stock item is allocated to Build %(link)s (Quantity: %(qty)s)" msgstr "" #: stock/templates/stock/item_base.html:67 -msgid "" -"This stock item is serialized - it has a unique serial number and the " -"quantity cannot be adjusted." +msgid "This stock item is serialized - it has a unique serial number and the quantity cannot be adjusted." msgstr "" #: stock/templates/stock/item_base.html:71 @@ -5313,8 +5286,7 @@ msgid "This stock item cannot be deleted as it has child items" msgstr "" #: stock/templates/stock/item_base.html:75 -msgid "" -"This stock item will be automatically deleted when all stock is depleted." +msgid "This stock item will be automatically deleted when all stock is depleted." msgstr "" #: stock/templates/stock/item_base.html:95 @@ -5354,15 +5326,15 @@ msgid "Stock adjustment actions" msgstr "" #: stock/templates/stock/item_base.html:164 -#: stock/templates/stock/location.html:65 templates/stock_table.html:56 +#: stock/templates/stock/location.html:65 templates/stock_table.html:57 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:167 templates/stock_table.html:54 +#: stock/templates/stock/item_base.html:167 templates/stock_table.html:55 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:170 templates/stock_table.html:55 +#: stock/templates/stock/item_base.html:170 templates/stock_table.html:56 msgid "Remove stock" msgstr "" @@ -5463,8 +5435,7 @@ msgstr "" #: stock/templates/stock/item_delete.html:12 #, python-format -msgid "" -"This will remove %(qty)s units of %(full_name)s from stock." +msgid "This will remove %(qty)s units of %(full_name)s from stock." msgstr "" #: stock/templates/stock/item_install.html:7 @@ -5510,9 +5481,7 @@ msgid "Add Test Data" msgstr "" #: stock/templates/stock/location.html:20 -msgid "" -"You are not in the list of owners of this location. This stock location " -"cannot be edited." +msgid "You are not in the list of owners of this location. This stock location cannot be edited." msgstr "" #: stock/templates/stock/location.html:37 @@ -5559,7 +5528,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:76 users/models.py:39 +#: templates/stats.html:76 users/models.py:41 msgid "Stock Locations" msgstr "" @@ -5745,7 +5714,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:180 +#: stock/views.py:1001 users/models.py:183 msgid "Add" msgstr "" @@ -5923,6 +5892,31 @@ msgstr "" msgid "No stock location set" msgstr "" +#: templates/InvenTree/settings/appearance.html:10 +msgid "Theme Settings" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:17 +msgid "Color Themes" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:29 +#, python-format +msgid "" +"\n" +" The CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" +" Please select another color theme :)\n" +" " +msgstr "" + +#: templates/InvenTree/settings/appearance.html:39 +msgid "Language" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:61 +msgid "Set Language" +msgstr "" + #: templates/InvenTree/settings/build.html:10 msgid "Build Order Settings" msgstr "" @@ -6006,7 +6000,7 @@ msgstr "" msgid "Stock Settings" msgstr "" -#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:49 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:50 msgid "Stock Options" msgstr "" @@ -6020,7 +6014,7 @@ msgid "Account" msgstr "" #: templates/InvenTree/settings/tabs.html:9 -msgid "Theme" +msgid "Appearance" msgstr "" #: templates/InvenTree/settings/tabs.html:13 @@ -6039,24 +6033,6 @@ msgstr "" msgid "Categories" 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" -"\t\tThe CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected " -"color theme was not found.
\n" -"\t\tPlease select another color theme :)\n" -"\t" -msgstr "" - #: templates/InvenTree/settings/user.html:16 msgid "User Information" msgstr "" @@ -6119,13 +6095,23 @@ msgid "View Code on GitHub" msgstr "" #: templates/about.html:63 -msgid "Get the App" +msgid "Credits" msgstr "" #: templates/about.html:68 +msgid "Mobile App" +msgstr "" + +#: templates/about.html:73 msgid "Submit Bug Report" msgstr "" +#: templates/about.html:82 templates/js/modals.js:550 +#: templates/js/modals.js:809 templates/modals.html:28 templates/modals.html:52 +#: templates/modals.html:93 +msgid "Close" +msgstr "" + #: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "" @@ -6203,8 +6189,7 @@ msgid "Link Barcode to Stock Item" msgstr "" #: templates/js/barcode.js:311 -msgid "" -"This will remove the association between this stock item and the barcode" +msgid "This will remove the association between this stock item and the barcode" msgstr "" #: templates/js/barcode.js:317 @@ -6322,7 +6307,7 @@ msgid "Quantity Per" msgstr "" #: templates/js/build.js:638 templates/js/build.js:1056 -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order stock" msgstr "" @@ -6455,11 +6440,6 @@ msgstr "" msgid "Submit" msgstr "" -#: templates/js/modals.js:550 templates/js/modals.js:809 -#: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93 -msgid "Close" -msgstr "" - #: templates/js/modals.js:760 msgid "Invalid response from server" msgstr "" @@ -7033,6 +7013,10 @@ msgstr "" msgid "Form errors exist" msgstr "" +#: templates/navbar.html:13 +msgid "Toggle navigation" +msgstr "" + #: templates/navbar.html:33 msgid "Buy" msgstr "" @@ -7045,7 +7029,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:36 +#: templates/navbar.html:77 users/models.py:38 msgid "Admin" msgstr "" @@ -7106,21 +7090,15 @@ msgid "Change password" msgstr "" #: templates/registration/password_reset_confirm.html:61 -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." +msgid "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." msgstr "" #: templates/registration/password_reset_done.html:52 -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." +msgid "We've emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly." msgstr "" #: templates/registration/password_reset_done.html:55 -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." +msgid "If you don't receive an email, please make sure you've entered the address you registered with, and check your spam folder." msgstr "" #: templates/registration/password_reset_form.html:53 @@ -7183,43 +7161,43 @@ msgstr "" msgid "Print test reports" msgstr "" -#: templates/stock_table.html:54 +#: templates/stock_table.html:55 msgid "Add to selected stock items" msgstr "" -#: templates/stock_table.html:55 +#: templates/stock_table.html:56 msgid "Remove from selected stock items" msgstr "" -#: templates/stock_table.html:56 +#: templates/stock_table.html:57 msgid "Stocktake selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move stock" msgstr "" -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order selected items" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change status" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change stock status" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete selected items" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete Stock" msgstr "" @@ -7255,34 +7233,34 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:167 +#: users/models.py:170 msgid "Permission set" msgstr "" -#: users/models.py:175 +#: users/models.py:178 msgid "Group" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "View" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "Permission to view items" msgstr "" -#: users/models.py:180 +#: users/models.py:183 msgid "Permission to add items" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Change" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Permissions to edit items" msgstr "" -#: users/models.py:184 +#: users/models.py:187 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/zh/LC_MESSAGES/django.mo b/InvenTree/locale/zh/LC_MESSAGES/django.mo index 6c5906d1cd061dff54de8b533942893de34efc9e..d02b517fab4f5decbc17e3e4aaf12a440530d8f6 100644 GIT binary patch delta 140 zcmcb}bed^`3ZvjeRgH-;S|LUTMuxfuCb~w33I>)|#>QMeiNz(lAw`LK#W{&3`9)R= zK#{!k(!}&s-H_D8Tq_0VjLf{$;#7s;%-n*U%(TqZ6u1g2g{q8rXTOPGqg4ZPN{bS6 cblvica*M4L@(RG*Vp~IN1qjpDz?zEz04qf<2><{9 delta 163 zcmX@jbdhO-3ZwW$RSo_CM`v$GcUOfl*Pvief4_;oTJ@2xjzPM<{<%0zOD*3uD*_*J`Rp9E8ZLQsfoE(3OJ$+qu!%~ZiGxPJT6bvWc_GV-N E0Bz$j1poj5 diff --git a/InvenTree/locale/zh/LC_MESSAGES/django.po b/InvenTree/locale/zh/LC_MESSAGES/django.po index 2534d27c42..2075ec9326 100644 --- a/InvenTree/locale/zh/LC_MESSAGES/django.po +++ b/InvenTree/locale/zh/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-21 09:17+0000\n" +"POT-Creation-Date: 2021-05-05 17:33+1000\n" "PO-Revision-Date: 2021-04-21 09:33\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" @@ -67,35 +67,36 @@ msgstr "" msgid "Select Category" msgstr "" -#: InvenTree/helpers.py:375 order/models.py:245 order/models.py:344 -#: stock/views.py:1763 -msgid "Invalid quantity provided" -msgstr "" - -#: InvenTree/helpers.py:378 -msgid "Empty serial number string" -msgstr "" - -#: InvenTree/helpers.py:399 +#: InvenTree/helpers.py:377 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:403 InvenTree/helpers.py:406 InvenTree/helpers.py:409 +#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:353 +#: stock/views.py:1763 +msgid "Invalid quantity provided" +msgstr "" + +#: InvenTree/helpers.py:387 +msgid "Empty serial number string" +msgstr "" + +#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 +#: InvenTree/helpers.py:440 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:414 +#: InvenTree/helpers.py:445 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:422 +#: InvenTree/helpers.py:453 msgid "No serial numbers found" msgstr "" -#: InvenTree/helpers.py:426 +#: InvenTree/helpers.py:457 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" @@ -140,7 +141,7 @@ msgstr "" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:108 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:168 +#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -165,23 +166,23 @@ msgstr "" msgid "parent" msgstr "" -#: InvenTree/settings.py:493 +#: InvenTree/settings.py:491 msgid "English" msgstr "" -#: InvenTree/settings.py:494 +#: InvenTree/settings.py:492 msgid "French" msgstr "" -#: InvenTree/settings.py:495 +#: InvenTree/settings.py:493 msgid "German" msgstr "" -#: InvenTree/settings.py:496 +#: InvenTree/settings.py:494 msgid "Polish" msgstr "" -#: InvenTree/settings.py:497 +#: InvenTree/settings.py:495 msgid "Turkish" msgstr "" @@ -375,16 +376,16 @@ msgstr "" msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1227 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1241 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:123 #: build/templates/build/detail.html:31 common/models.py:703 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:239 order/forms.py:261 -#: order/forms.py:278 order/models.py:593 order/models.py:784 +#: order/forms.py:278 order/models.py:603 order/models.py:794 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:200 +#: order/templates/order/purchase_order_detail.html:175 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:159 @@ -458,7 +459,7 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:59 order/models.py:445 +#: build/templates/build/detail.html:59 order/models.py:455 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:392 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:770 @@ -508,7 +509,7 @@ msgstr "" #: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 #: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:31 users/models.py:41 +#: templates/InvenTree/settings/tabs.html:31 users/models.py:43 msgid "Build Orders" msgstr "" @@ -516,8 +517,8 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:127 order/models.py:99 order/models.py:595 -#: order/templates/order/purchase_order_detail.html:195 +#: build/models.py:127 order/models.py:99 order/models.py:605 +#: order/templates/order/purchase_order_detail.html:170 #: order/templates/order/sales_order_detail.html:219 part/models.py:2187 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -540,10 +541,10 @@ msgstr "" #: build/models.py:152 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:118 -#: build/templates/build/detail.html:26 company/models.py:669 -#: order/models.py:637 order/models.py:669 +#: build/templates/build/detail.html:26 company/models.py:688 +#: order/models.py:647 order/models.py:679 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:156 +#: order/templates/order/purchase_order_detail.html:131 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:207 part/models.py:321 #: part/models.py:1876 part/models.py:1888 part/models.py:1906 @@ -628,7 +629,7 @@ msgstr "" msgid "Creation Date" msgstr "" -#: build/models.py:223 order/models.py:451 +#: build/models.py:223 order/models.py:461 msgid "Target completion date" msgstr "" @@ -678,9 +679,9 @@ msgstr "" #: company/models.py:135 company/models.py:501 #: company/templates/company/navbar.html:70 #: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:597 order/templates/order/po_navbar.html:29 +#: order/models.py:607 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:234 +#: order/templates/order/purchase_order_detail.html:209 #: order/templates/order/sales_order_detail.html:264 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 @@ -713,47 +714,47 @@ msgstr "" msgid "Completed build output" msgstr "" -#: build/models.py:1118 +#: build/models.py:1132 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1143 +#: build/models.py:1157 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "" -#: build/models.py:1147 +#: build/models.py:1161 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1151 +#: build/models.py:1165 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1158 order/models.py:758 +#: build/models.py:1172 order/models.py:768 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1162 order/models.py:761 +#: build/models.py:1176 order/models.py:771 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1166 +#: build/models.py:1180 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1206 stock/templates/stock/item_base.html:306 +#: build/models.py:1220 stock/templates/stock/item_base.html:306 #: templates/InvenTree/search.html:183 templates/js/build.js:714 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1207 +#: build/models.py:1221 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1214 part/templates/part/allocation.html:18 +#: build/models.py:1228 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -765,19 +766,19 @@ msgstr "" msgid "Stock Item" msgstr "" -#: build/models.py:1215 +#: build/models.py:1229 msgid "Source stock item" msgstr "" -#: build/models.py:1228 +#: build/models.py:1242 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1236 +#: build/models.py:1250 msgid "Install into" msgstr "" -#: build/models.py:1237 +#: build/models.py:1251 msgid "Destination stock item" msgstr "" @@ -801,7 +802,7 @@ msgstr "" msgid "Unallocate stock" msgstr "" -#: build/templates/build/allocate.html:26 build/views.py:308 build/views.py:794 +#: build/templates/build/allocate.html:26 build/views.py:319 build/views.py:805 msgid "Unallocate Stock" msgstr "" @@ -811,7 +812,7 @@ msgstr "" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:794 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:795 #: part/templates/part/category.html:127 msgid "Order Parts" msgstr "" @@ -954,7 +955,7 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:160 -#: build/templates/build/detail.html:84 order/models.py:667 +#: build/templates/build/detail.html:84 order/models.py:677 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:33 #: order/templates/order/sales_order_ship.html:25 @@ -1139,7 +1140,7 @@ msgstr "" msgid "Alter the quantity of stock allocated to the build output" msgstr "" -#: build/templates/build/index.html:28 build/views.py:667 +#: build/templates/build/index.html:28 build/views.py:678 msgid "New Build Order" msgstr "" @@ -1226,141 +1227,145 @@ msgstr "" msgid "Create Build Output" msgstr "" -#: build/views.py:173 stock/models.py:969 stock/views.py:1789 +#: build/views.py:168 +msgid "Maximum output quantity is " +msgstr "" + +#: build/views.py:184 stock/models.py:969 stock/views.py:1789 msgid "Serial numbers already exist" msgstr "" -#: build/views.py:182 +#: build/views.py:193 msgid "Serial numbers required for trackable build output" msgstr "" -#: build/views.py:248 +#: build/views.py:259 msgid "Delete Build Output" msgstr "" -#: build/views.py:269 build/views.py:359 +#: build/views.py:280 build/views.py:370 msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:270 build/views.py:360 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:425 msgid "Check the confirmation box" msgstr "" -#: build/views.py:282 +#: build/views.py:293 msgid "Build output does not match build" msgstr "" -#: build/views.py:284 build/views.py:485 +#: build/views.py:295 build/views.py:496 msgid "Build output must be specified" msgstr "" -#: build/views.py:296 +#: build/views.py:307 msgid "Build output deleted" msgstr "" -#: build/views.py:394 +#: build/views.py:405 msgid "Complete Build Order" msgstr "" -#: build/views.py:400 +#: build/views.py:411 msgid "Build order cannot be completed - incomplete outputs remain" msgstr "" -#: build/views.py:411 +#: build/views.py:422 msgid "Completed build order" msgstr "" -#: build/views.py:427 +#: build/views.py:438 msgid "Complete Build Output" msgstr "" -#: build/views.py:469 +#: build/views.py:480 msgid "Invalid stock status value selected" msgstr "" -#: build/views.py:476 +#: build/views.py:487 msgid "Quantity to complete cannot exceed build output quantity" msgstr "" -#: build/views.py:482 +#: build/views.py:493 msgid "Confirm completion of incomplete build" msgstr "" -#: build/views.py:581 +#: build/views.py:592 msgid "Build output completed" msgstr "" -#: build/views.py:721 +#: build/views.py:732 msgid "Created new build" msgstr "" -#: build/views.py:742 +#: build/views.py:753 msgid "Edit Build Order Details" msgstr "" -#: build/views.py:775 +#: build/views.py:786 msgid "Edited build" msgstr "" -#: build/views.py:784 +#: build/views.py:795 msgid "Delete Build Order" msgstr "" -#: build/views.py:799 +#: build/views.py:810 msgid "Removed parts from build allocation" msgstr "" -#: build/views.py:811 +#: build/views.py:822 msgid "Allocate stock to build output" msgstr "" -#: build/views.py:854 +#: build/views.py:865 msgid "Item must be currently in stock" msgstr "" -#: build/views.py:860 +#: build/views.py:871 msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:861 templates/js/bom.js:230 templates/js/build.js:575 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:575 #: templates/js/build.js:838 templates/js/build.js:1021 msgid "Available" msgstr "" -#: build/views.py:863 +#: build/views.py:874 msgid "Stock item must be selected" msgstr "" -#: build/views.py:1026 +#: build/views.py:1037 msgid "Edit Stock Allocation" msgstr "" -#: build/views.py:1030 +#: build/views.py:1041 msgid "Updated Build Item" msgstr "" -#: build/views.py:1059 +#: build/views.py:1070 msgid "Add Build Order Attachment" msgstr "" -#: build/views.py:1072 order/views.py:110 order/views.py:162 part/views.py:172 +#: build/views.py:1083 order/views.py:110 order/views.py:162 part/views.py:172 #: stock/views.py:277 msgid "Added attachment" msgstr "" -#: build/views.py:1108 order/views.py:189 order/views.py:210 +#: build/views.py:1119 order/views.py:189 order/views.py:210 msgid "Edit Attachment" msgstr "" -#: build/views.py:1118 order/views.py:193 order/views.py:214 +#: build/views.py:1129 order/views.py:193 order/views.py:214 msgid "Attachment updated" msgstr "" -#: build/views.py:1128 order/views.py:229 order/views.py:243 +#: build/views.py:1139 order/views.py:229 order/views.py:243 msgid "Delete Attachment" msgstr "" -#: build/views.py:1133 order/views.py:235 order/views.py:249 stock/views.py:333 +#: build/views.py:1144 order/views.py:235 order/views.py:249 stock/views.py:333 msgid "Deleted attachment" msgstr "" @@ -1766,7 +1771,7 @@ msgstr "" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:101 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:183 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" @@ -1865,7 +1870,7 @@ msgstr "" msgid "Base Part" msgstr "" -#: company/models.py:312 company/models.py:463 order/views.py:1372 +#: company/models.py:312 company/models.py:463 order/views.py:1384 msgid "Select part" msgstr "" @@ -1905,7 +1910,7 @@ msgstr "" #: company/models.py:475 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:174 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" @@ -2017,7 +2022,8 @@ msgstr "" #: company/templates/company/delete.html:12 #, python-format -msgid "There are %(count)s parts sourced from this company.
\n" +msgid "" +"There are %(count)s parts sourced from this company.
\n" "If this supplier is deleted, these supplier part entries will also be deleted." msgstr "" @@ -2033,7 +2039,7 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:440 +#: company/templates/company/detail.html:67 order/models.py:450 #: order/templates/order/sales_order_base.html:92 stock/models.py:415 #: stock/models.py:416 stock/templates/stock/item_base.html:251 #: templates/js/company.js:40 templates/js/order.js:267 @@ -2122,13 +2128,13 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:42 -#: order/templates/order/purchase_order_detail.html:75 +#: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 -#: order/templates/order/purchase_order_detail.html:74 +#: order/templates/order/purchase_order_detail.html:49 #: part/templates/part/supplier.html:17 templates/js/stock.js:1163 msgid "New Supplier Part" msgstr "" @@ -2226,7 +2232,7 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:184 +#: stock/views.py:1002 users/models.py:187 msgid "Delete" msgstr "" @@ -2252,7 +2258,7 @@ msgstr "" #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 #: templates/InvenTree/search.html:198 templates/js/stock.js:968 -#: templates/stats.html:72 templates/stats.html:81 users/models.py:40 +#: templates/stats.html:72 templates/stats.html:81 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2266,7 +2272,7 @@ msgstr "" #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46 -#: users/models.py:43 +#: users/models.py:45 msgid "Sales Orders" msgstr "" @@ -2278,7 +2284,7 @@ msgstr "" #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37 -#: users/models.py:42 +#: users/models.py:44 msgid "Purchase Orders" msgstr "" @@ -2357,7 +2363,7 @@ msgid "Pricing Information" msgstr "" #: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2624 +#: part/templates/part/sale_prices.html:17 part/views.py:2636 msgid "Add Price Break" msgstr "" @@ -2467,15 +2473,15 @@ msgstr "" msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2628 +#: company/views.py:799 part/views.py:2640 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2672 +#: company/views.py:855 part/views.py:2684 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2686 +#: company/views.py:870 part/views.py:2698 msgid "Delete Price Break" msgstr "" @@ -2565,7 +2571,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:452 +#: order/forms.py:145 order/models.py:462 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2601,7 +2607,7 @@ msgstr "" msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:445 +#: order/models.py:182 order/models.py:455 msgid "Purchase order status" msgstr "" @@ -2642,8 +2648,8 @@ msgstr "" msgid "Date order was completed" msgstr "" -#: order/models.py:243 order/models.py:342 part/views.py:1586 -#: stock/models.py:270 stock/models.py:953 +#: order/models.py:243 part/views.py:1586 stock/models.py:270 +#: stock/models.py:953 msgid "Quantity must be greater than zero" msgstr "" @@ -2651,120 +2657,128 @@ msgstr "" msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:337 +#: order/models.py:344 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:359 +#: order/models.py:348 +msgid "Quantity must be an integer" +msgstr "" + +#: order/models.py:350 +msgid "Quantity must be a positive number" +msgstr "" + +#: order/models.py:369 msgid "Received items" msgstr "" -#: order/models.py:441 +#: order/models.py:451 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer Reference " msgstr "" -#: order/models.py:447 +#: order/models.py:457 msgid "Customer order reference code" msgstr "" -#: order/models.py:455 templates/js/order.js:303 +#: order/models.py:465 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:462 +#: order/models.py:472 msgid "shipped by" msgstr "" -#: order/models.py:506 +#: order/models.py:516 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:593 +#: order/models.py:603 msgid "Item quantity" msgstr "" -#: order/models.py:595 +#: order/models.py:605 msgid "Line item reference" msgstr "" -#: order/models.py:597 +#: order/models.py:607 msgid "Line item notes" msgstr "" -#: order/models.py:623 order/models.py:667 +#: order/models.py:633 order/models.py:677 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:624 order/templates/order/order_base.html:9 +#: order/models.py:634 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:313 templates/js/order.js:148 msgid "Purchase Order" msgstr "" -#: order/models.py:638 +#: order/models.py:648 msgid "Supplier part" msgstr "" -#: order/models.py:641 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:214 +#: order/models.py:651 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:189 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:131 msgid "Received" msgstr "" -#: order/models.py:641 +#: order/models.py:651 msgid "Number of items received" msgstr "" -#: order/models.py:648 stock/models.py:508 +#: order/models.py:658 stock/models.py:508 #: stock/templates/stock/item_base.html:320 msgid "Purchase Price" msgstr "" -#: order/models.py:649 +#: order/models.py:659 msgid "Unit purchase price" msgstr "" -#: order/models.py:743 order/models.py:745 +#: order/models.py:753 order/models.py:755 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:749 +#: order/models.py:759 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:751 +#: order/models.py:761 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:754 +#: order/models.py:764 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:764 +#: order/models.py:774 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:769 +#: order/models.py:779 msgid "Line" msgstr "" -#: order/models.py:780 +#: order/models.py:790 msgid "Item" msgstr "" -#: order/models.py:781 +#: order/models.py:791 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:784 +#: order/models.py:794 msgid "Enter stock allocation quantity" msgstr "" @@ -2812,9 +2826,22 @@ msgstr "" msgid "Issued" msgstr "" -#: order/templates/order/order_cancel.html:7 -#: order/templates/order/sales_order_cancel.html:9 -msgid "Cancelling this order means that the order will no longer be editable." +#: order/templates/order/order_base.html:180 +#: order/templates/order/purchase_order_detail.html:100 +#: part/templates/part/category.html:185 part/templates/part/category.html:227 +#: stock/templates/stock/location.html:191 templates/js/stock.js:708 +#: templates/js/stock.js:1169 +msgid "New Location" +msgstr "" + +#: order/templates/order/order_base.html:181 +#: order/templates/order/purchase_order_detail.html:101 +#: stock/templates/stock/location.html:42 +msgid "Create new stock location" +msgstr "" + +#: order/templates/order/order_cancel.html:8 +msgid "Cancelling this order means that the order and line items will no longer be editable." msgstr "" #: order/templates/order/order_complete.html:7 @@ -2826,10 +2853,10 @@ msgid "This order has line items which have not been marked as received." msgstr "" #: order/templates/order/order_complete.html:11 -msgid "Marking this order as complete will remove these line items." +msgid "Completing this order means that the order and line items will no longer be editable." msgstr "" -#: order/templates/order/order_issue.html:7 +#: order/templates/order/order_issue.html:8 msgid "After placing this purchase order, line items will no longer be editable." msgstr "" @@ -2881,11 +2908,13 @@ msgid "Select Purchase Order" msgstr "" #: order/templates/order/order_wizard/select_pos.html:45 -msgid "Create new purchase order for {{ supplier.name }}" +#, python-format +msgid "Create new purchase order for %(name)s" msgstr "" #: order/templates/order/order_wizard/select_pos.html:68 -msgid "Select a purchase order for" +#, python-format +msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 @@ -2907,43 +2936,29 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1108 -#: order/views.py:1191 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1120 +#: order/views.py:1203 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:45 -#: order/templates/order/purchase_order_detail.html:125 -#: part/templates/part/category.html:185 part/templates/part/category.html:227 -#: stock/templates/stock/location.html:191 templates/js/stock.js:708 -#: templates/js/stock.js:1169 -msgid "New Location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:46 -#: order/templates/order/purchase_order_detail.html:126 -#: stock/templates/stock/location.html:42 -msgid "Create new stock location" -msgstr "" - -#: order/templates/order/purchase_order_detail.html:139 +#: order/templates/order/purchase_order_detail.html:114 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:205 +#: order/templates/order/purchase_order_detail.html:180 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:221 #: order/templates/order/sales_order_detail.html:294 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:247 +#: order/templates/order/purchase_order_detail.html:222 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:227 msgid "Receive line item" msgstr "" @@ -2966,7 +2981,7 @@ msgstr "" #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:25 templates/js/part.js:577 #: templates/navbar.html:23 templates/stats.html:59 templates/stats.html:68 -#: users/models.py:38 +#: users/models.py:40 msgid "Parts" msgstr "" @@ -3019,6 +3034,10 @@ msgstr "" msgid "Warning" msgstr "" +#: order/templates/order/sales_order_cancel.html:9 +msgid "Cancelling this order means that the order will no longer be editable." +msgstr "" + #: order/templates/order/sales_order_detail.html:13 msgid "Sales Order Items" msgstr "" @@ -3213,65 +3232,65 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1060 +#: order/views.py:1069 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1117 +#: order/views.py:1129 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1123 +#: order/views.py:1135 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1242 order/views.py:1260 +#: order/views.py:1254 order/views.py:1272 msgid "Edit Line Item" msgstr "" -#: order/views.py:1276 order/views.py:1288 +#: order/views.py:1288 order/views.py:1300 msgid "Delete Line Item" msgstr "" -#: order/views.py:1281 order/views.py:1293 +#: order/views.py:1293 order/views.py:1305 msgid "Deleted line item" msgstr "" -#: order/views.py:1306 +#: order/views.py:1318 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1351 +#: order/views.py:1363 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1367 +#: order/views.py:1379 msgid "Select line item" msgstr "" -#: order/views.py:1398 +#: order/views.py:1410 msgid "No matching item for serial" msgstr "" -#: order/views.py:1408 +#: order/views.py:1420 msgid "is not in stock" msgstr "" -#: order/views.py:1416 +#: order/views.py:1428 msgid "already allocated to an order" msgstr "" -#: order/views.py:1470 +#: order/views.py:1482 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1544 +#: order/views.py:1556 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1559 +#: order/views.py:1571 msgid "Remove allocation" msgstr "" @@ -3457,7 +3476,7 @@ msgstr "" #: part/models.py:83 part/templates/part/category.html:23 #: part/templates/part/category.html:94 part/templates/part/category.html:141 #: templates/InvenTree/search.html:127 templates/stats.html:63 -#: users/models.py:37 +#: users/models.py:39 msgid "Part Categories" msgstr "" @@ -4004,7 +4023,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2270 +#: part/templates/part/category.html:29 part/views.py:2282 msgid "Create new part category" msgstr "" @@ -4694,63 +4713,63 @@ msgstr "" msgid "Part Pricing" msgstr "" -#: part/views.py:2069 +#: part/views.py:2081 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2079 +#: part/views.py:2091 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2086 +#: part/views.py:2098 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2094 +#: part/views.py:2106 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2144 +#: part/views.py:2156 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2158 +#: part/views.py:2170 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2218 +#: part/views.py:2230 msgid "Edit Part Category" msgstr "" -#: part/views.py:2256 +#: part/views.py:2268 msgid "Delete Part Category" msgstr "" -#: part/views.py:2262 +#: part/views.py:2274 msgid "Part category was deleted" msgstr "" -#: part/views.py:2314 +#: part/views.py:2326 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2415 +#: part/views.py:2427 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2471 +#: part/views.py:2483 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2490 +#: part/views.py:2502 msgid "Create BOM Item" msgstr "" -#: part/views.py:2560 +#: part/views.py:2572 msgid "Edit BOM item" msgstr "" -#: part/views.py:2616 +#: part/views.py:2628 msgid "Confim BOM item deletion" msgstr "" @@ -5301,15 +5320,15 @@ msgid "Stock adjustment actions" msgstr "" #: stock/templates/stock/item_base.html:164 -#: stock/templates/stock/location.html:65 templates/stock_table.html:56 +#: stock/templates/stock/location.html:65 templates/stock_table.html:57 msgid "Count stock" msgstr "" -#: stock/templates/stock/item_base.html:167 templates/stock_table.html:54 +#: stock/templates/stock/item_base.html:167 templates/stock_table.html:55 msgid "Add stock" msgstr "" -#: stock/templates/stock/item_base.html:170 templates/stock_table.html:55 +#: stock/templates/stock/item_base.html:170 templates/stock_table.html:56 msgid "Remove stock" msgstr "" @@ -5503,7 +5522,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:76 users/models.py:39 +#: templates/stats.html:76 users/models.py:41 msgid "Stock Locations" msgstr "" @@ -5689,7 +5708,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:180 +#: stock/views.py:1001 users/models.py:183 msgid "Add" msgstr "" @@ -5867,6 +5886,31 @@ msgstr "" msgid "No stock location set" msgstr "" +#: templates/InvenTree/settings/appearance.html:10 +msgid "Theme Settings" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:17 +msgid "Color Themes" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:29 +#, python-format +msgid "" +"\n" +" The CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" +" Please select another color theme :)\n" +" " +msgstr "" + +#: templates/InvenTree/settings/appearance.html:39 +msgid "Language" +msgstr "" + +#: templates/InvenTree/settings/appearance.html:61 +msgid "Set Language" +msgstr "" + #: templates/InvenTree/settings/build.html:10 msgid "Build Order Settings" msgstr "" @@ -5950,7 +5994,7 @@ msgstr "" msgid "Stock Settings" msgstr "" -#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:49 +#: templates/InvenTree/settings/stock.html:13 templates/stock_table.html:50 msgid "Stock Options" msgstr "" @@ -5964,7 +6008,7 @@ msgid "Account" msgstr "" #: templates/InvenTree/settings/tabs.html:9 -msgid "Theme" +msgid "Appearance" msgstr "" #: templates/InvenTree/settings/tabs.html:13 @@ -5983,22 +6027,6 @@ msgstr "" msgid "Categories" 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" -"\t\tThe CSS sheet \"%(invalid_color_theme)s.css\" for the currently selected color theme was not found.
\n" -"\t\tPlease select another color theme :)\n" -"\t" -msgstr "" - #: templates/InvenTree/settings/user.html:16 msgid "User Information" msgstr "" @@ -6061,13 +6089,23 @@ msgid "View Code on GitHub" msgstr "" #: templates/about.html:63 -msgid "Get the App" +msgid "Credits" msgstr "" #: templates/about.html:68 +msgid "Mobile App" +msgstr "" + +#: templates/about.html:73 msgid "Submit Bug Report" msgstr "" +#: templates/about.html:82 templates/js/modals.js:550 +#: templates/js/modals.js:809 templates/modals.html:28 templates/modals.html:52 +#: templates/modals.html:93 +msgid "Close" +msgstr "" + #: templates/attachment_table.html:6 msgid "Add Attachment" msgstr "" @@ -6263,7 +6301,7 @@ msgid "Quantity Per" msgstr "" #: templates/js/build.js:638 templates/js/build.js:1056 -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order stock" msgstr "" @@ -6396,11 +6434,6 @@ msgstr "" msgid "Submit" msgstr "" -#: templates/js/modals.js:550 templates/js/modals.js:809 -#: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93 -msgid "Close" -msgstr "" - #: templates/js/modals.js:760 msgid "Invalid response from server" msgstr "" @@ -6974,6 +7007,10 @@ msgstr "" msgid "Form errors exist" msgstr "" +#: templates/navbar.html:13 +msgid "Toggle navigation" +msgstr "" + #: templates/navbar.html:33 msgid "Buy" msgstr "" @@ -6986,7 +7023,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:36 +#: templates/navbar.html:77 users/models.py:38 msgid "Admin" msgstr "" @@ -7118,43 +7155,43 @@ msgstr "" msgid "Print test reports" msgstr "" -#: templates/stock_table.html:54 +#: templates/stock_table.html:55 msgid "Add to selected stock items" msgstr "" -#: templates/stock_table.html:55 +#: templates/stock_table.html:56 msgid "Remove from selected stock items" msgstr "" -#: templates/stock_table.html:56 +#: templates/stock_table.html:57 msgid "Stocktake selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move selected stock items" msgstr "" -#: templates/stock_table.html:57 +#: templates/stock_table.html:58 msgid "Move stock" msgstr "" -#: templates/stock_table.html:58 +#: templates/stock_table.html:59 msgid "Order selected items" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change status" msgstr "" -#: templates/stock_table.html:59 +#: templates/stock_table.html:60 msgid "Change stock status" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete selected items" msgstr "" -#: templates/stock_table.html:62 +#: templates/stock_table.html:63 msgid "Delete Stock" msgstr "" @@ -7190,35 +7227,34 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:167 +#: users/models.py:170 msgid "Permission set" msgstr "" -#: users/models.py:175 +#: users/models.py:178 msgid "Group" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "View" msgstr "" -#: users/models.py:178 +#: users/models.py:181 msgid "Permission to view items" msgstr "" -#: users/models.py:180 +#: users/models.py:183 msgid "Permission to add items" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Change" msgstr "" -#: users/models.py:182 +#: users/models.py:185 msgid "Permissions to edit items" msgstr "" -#: users/models.py:184 +#: users/models.py:187 msgid "Permission to delete items" msgstr "" - diff --git a/tasks.py b/tasks.py index 6eed4c488e..37cbc71eab 100644 --- a/tasks.py +++ b/tasks.py @@ -185,7 +185,7 @@ def translate(c): """ # Translate applicable .py / .html / .js files - manage(c, "makemessages --all -e py,html,js") + manage(c, "makemessages --all -e py,html,js --no-wrap") manage(c, "compilemessages") path = os.path.join('InvenTree', 'script', 'translation_stats.py') From ee028ef9254eecd75e8d8f30fa1bd04a0aa50504 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 5 May 2021 20:38:27 +0200 Subject: [PATCH 08/56] space cleanup --- InvenTree/part/urls.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index b90b11b568..c734b7f610 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -30,11 +30,10 @@ sale_price_break_urls = [ ] part_parameter_urls = [ - url(r'^template/new/', views.PartParameterTemplateCreate.as_view(), name='part-param-template-create'), url(r'^template/(?P\d+)/edit/', views.PartParameterTemplateEdit.as_view(), name='part-param-template-edit'), url(r'^template/(?P\d+)/delete/', views.PartParameterTemplateDelete.as_view(), name='part-param-template-edit'), - + url(r'^new/', views.PartParameterCreate.as_view(), name='part-param-create'), url(r'^(?P\d+)/edit/', views.PartParameterEdit.as_view(), name='part-param-edit'), url(r'^(?P\d+)/delete/', views.PartParameterDelete.as_view(), name='part-param-delete'), @@ -49,10 +48,10 @@ part_detail_urls = [ url(r'^duplicate/', views.PartDuplicate.as_view(), name='part-duplicate'), url(r'^make-variant/', views.MakePartVariant.as_view(), name='make-part-variant'), url(r'^pricing/', views.PartPricing.as_view(), name='part-pricing'), - + url(r'^bom-upload/?', views.BomUpload.as_view(), name='upload-bom'), url(r'^bom-duplicate/?', views.BomDuplicate.as_view(), name='duplicate-bom'), - + url(r'^params/', views.PartDetail.as_view(template_name='part/params.html'), name='part-params'), url(r'^variants/?', views.PartDetail.as_view(template_name='part/variants.html'), name='part-variants'), url(r'^stock/?', views.PartDetail.as_view(template_name='part/stock.html'), name='part-stock'), @@ -70,7 +69,7 @@ part_detail_urls = [ url(r'^related-parts/?', views.PartDetail.as_view(template_name='part/related.html'), name='part-related'), url(r'^attachments/?', views.PartDetail.as_view(template_name='part/attachments.html'), name='part-attachments'), url(r'^notes/?', views.PartNotes.as_view(), name='part-notes'), - + url(r'^qr_code/?', views.PartQRCode.as_view(), name='part-qr'), # Normal thumbnail with form @@ -104,7 +103,7 @@ category_urls = [ url(r'^subcategory/', views.CategoryDetail.as_view(template_name='part/subcategory.html'), name='category-subcategory'), url(r'^parametric/', views.CategoryParametric.as_view(), name='category-parametric'), - + # Anything else url(r'^.*$', views.CategoryDetail.as_view(), name='category-detail'), ])) From dc4fb64987591ab451a9fd7a99cf47ac39d8e4bf Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 5 May 2021 20:53:53 +0200 Subject: [PATCH 09/56] add in price modal in table --- .../templates/order/sales_order_detail.html | 17 ++++++++++++++++- InvenTree/order/urls.py | 1 + InvenTree/order/views.py | 15 +++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/InvenTree/order/templates/order/sales_order_detail.html b/InvenTree/order/templates/order/sales_order_detail.html index e611ebc9e1..33487398b1 100644 --- a/InvenTree/order/templates/order/sales_order_detail.html +++ b/InvenTree/order/templates/order/sales_order_detail.html @@ -296,7 +296,8 @@ $("#so-lines-table").inventreeTable({ if (part.assembly) { html += makeIconButton('fa-tools', 'button-build', row.part, '{% trans "Build stock" %}'); } - + + html += makeIconButton('fa-dollar-sign icon-green', 'button-price', pk, '{% trans "Calculate price" %}'); } html += makeIconButton('fa-edit icon-blue', 'button-edit', pk, '{% trans "Edit line item" %}'); @@ -396,6 +397,20 @@ function setupCallbacks() { }, }); }); + + $(".button-price").click(function() { + var pk = $(this).attr('pk'); + + launchModalForm( + "{% url 'line-pricing' %}", + { + submit_text: '{% trans "Calculate price" %}', + data: { + line_item: pk, + }, + } + ); + }); } {% endblock %} \ No newline at end of file diff --git a/InvenTree/order/urls.py b/InvenTree/order/urls.py index 97903d81c1..746a482c4a 100644 --- a/InvenTree/order/urls.py +++ b/InvenTree/order/urls.py @@ -31,6 +31,7 @@ purchase_order_urls = [ url(r'^new/', views.PurchaseOrderCreate.as_view(), name='po-create'), url(r'^order-parts/', views.OrderParts.as_view(), name='order-parts'), + url(r'^pricing/', views.LineItemPricing.as_view(), name='line-pricing'), # Display detail view for a single purchase order url(r'^(?P\d+)/', include(purchase_order_detail_urls)), diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index 284a24fcf5..9b642feb83 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -29,6 +29,7 @@ from part.models import Part from common.models import InvenTreeSetting from . import forms as order_forms +from part.views import PartPricing from InvenTree.views import AjaxView, AjaxCreateView, AjaxUpdateView, AjaxDeleteView from InvenTree.helpers import DownloadFile, str2bool @@ -1559,3 +1560,17 @@ class SalesOrderAllocationDelete(AjaxDeleteView): ajax_form_title = _("Remove allocation") context_object_name = 'allocation' ajax_template_name = "order/so_allocation_delete.html" + + +class LineItemPricing(PartPricing): + """ View for inspecting part pricing information """ + + def get_part(self): + if 'line_item' in self.request.GET: + try: + part_id = self.request.GET.get('line_item') + return SalesOrderLineItem.objects.get(id=part_id).part + except Part.DoesNotExist: + return None + else: + return None From b392586a0866a662b9be8a49a2caa4ad77b571f7 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 5 May 2021 20:55:37 +0200 Subject: [PATCH 10/56] quantity also for modal --- .../templates/order/sales_order_detail.html | 3 +++ InvenTree/part/views.py | 18 +++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/InvenTree/order/templates/order/sales_order_detail.html b/InvenTree/order/templates/order/sales_order_detail.html index 33487398b1..d57c0da98a 100644 --- a/InvenTree/order/templates/order/sales_order_detail.html +++ b/InvenTree/order/templates/order/sales_order_detail.html @@ -400,6 +400,8 @@ function setupCallbacks() { $(".button-price").click(function() { var pk = $(this).attr('pk'); + var idx = $(this).closest('tr').attr('data-index'); + var row = table.bootstrapTable('getData')[idx]; launchModalForm( "{% url 'line-pricing' %}", @@ -407,6 +409,7 @@ function setupCallbacks() { submit_text: '{% trans "Calculate price" %}', data: { line_item: pk, + quantity: row.quantity, }, } ); diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index d7c68dd6a3..b7bebb6d05 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -1959,8 +1959,19 @@ class PartPricing(AjaxView): def get_quantity(self): """ Return set quantity in decimal format """ - - return Decimal(self.request.POST.get('quantity', 1)) + + # check POST + qty = self.request.POST.get('quantity', None) + + # check GET + if not qty: + qty = self.request.GET.get('quantity', None) + + # nothing found: return 1 + if not qty: + return Decimal(1) + # return as decimal + return Decimal(qty) def get_part(self): try: @@ -2048,7 +2059,8 @@ class PartPricing(AjaxView): def get(self, request, *args, **kwargs): - return self.renderJsonResponse(request, self.form_class(), context=self.get_pricing()) + quantity = self.get_quantity() + return self.renderJsonResponse(request, self.form_class(initial={'quantity': quantity}), context=self.get_pricing(quantity)) def post(self, request, *args, **kwargs): From 2cfb9c60a3eaf5597d057bcedca85f72823940ce Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 5 May 2021 20:57:00 +0200 Subject: [PATCH 11/56] space cleanup --- InvenTree/InvenTree/static/script/inventree/inventree.js | 2 +- InvenTree/order/templates/order/sales_order_detail.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/InvenTree/InvenTree/static/script/inventree/inventree.js b/InvenTree/InvenTree/static/script/inventree/inventree.js index 238fc0a6a6..d4269c1ffb 100644 --- a/InvenTree/InvenTree/static/script/inventree/inventree.js +++ b/InvenTree/InvenTree/static/script/inventree/inventree.js @@ -100,7 +100,7 @@ function makeIconButton(icon, cls, pk, title, options={}) { if (options.disabled) { extraProps += "disabled='true' "; } - + html += ``; diff --git a/InvenTree/order/templates/order/sales_order_detail.html b/InvenTree/order/templates/order/sales_order_detail.html index d57c0da98a..09c15eb865 100644 --- a/InvenTree/order/templates/order/sales_order_detail.html +++ b/InvenTree/order/templates/order/sales_order_detail.html @@ -287,7 +287,7 @@ $("#so-lines-table").inventreeTable({ html += makeIconButton('fa-hashtag icon-green', 'button-add-by-sn', pk, '{% trans "Allocate serial numbers" %}'); } - html += makeIconButton('fa-sign-in-alt icon-green', 'button-add', pk, '{% trans "Allocate stock" %}'); + html += makeIconButton('fa-sign-in-alt icon-green', 'button-add', pk, '{% trans "Allocate stock" %}'); if (part.purchaseable) { html += makeIconButton('fa-shopping-cart', 'button-buy', row.part, '{% trans "Purchase stock" %}'); From 287a05ddc5cece2f534c5d81dc575d02b5a1935c Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 5 May 2021 21:48:58 +0200 Subject: [PATCH 12/56] clearer spacing in html --- .../part/templates/part/part_pricing.html | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/InvenTree/part/templates/part/part_pricing.html b/InvenTree/part/templates/part/part_pricing.html index b14be2c61f..9922813210 100644 --- a/InvenTree/part/templates/part/part_pricing.html +++ b/InvenTree/part/templates/part/part_pricing.html @@ -19,9 +19,10 @@ {{ quantity }} - {% if part.supplier_count > 0 %} + +{% if part.supplier_count > 0 %}

{% trans 'Supplier Pricing' %}

- +
{% if min_total_buy_price %} @@ -42,12 +43,12 @@ {% endif %} -
{% trans 'Unit Cost' %}
- {% endif %} + +{% endif %} - {% if part.bom_count > 0 %} +{% if part.bom_count > 0 %}

{% trans 'BOM Pricing' %}

- +
{% if min_total_bom_price %} @@ -75,8 +76,8 @@ {% endif %} -
{% trans 'Unit Cost' %}
- {% endif %} + +{% endif %} {% if min_unit_buy_price or min_unit_bom_price %} {% else %} @@ -84,7 +85,5 @@ {% trans 'No pricing information is available for this part.' %} {% endif %} -
- {% endblock %} \ No newline at end of file From 1a227faec4fa3f0d1fe5a77546e56771283dff22 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 5 May 2021 23:42:52 +0200 Subject: [PATCH 13/56] abstracting get_price --- InvenTree/common/models.py | 68 +++++++++++++++++++++++++++++++++++++ InvenTree/company/models.py | 65 +---------------------------------- 2 files changed, 69 insertions(+), 64 deletions(-) diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index bc2ca4214b..4280177629 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -7,6 +7,8 @@ These models are 'generic' and do not fit a particular business logic object. from __future__ import unicode_literals import os +import decimal +import math from django.db import models, transaction from django.db.utils import IntegrityError, OperationalError @@ -730,6 +732,72 @@ class PriceBreak(models.Model): return converted.amount +def get_price(instance, quantity, moq=True, multiples=True, currency=None): + """ Calculate the price based on quantity price breaks. + + - Don't forget to add in flat-fee cost (base_cost field) + - If MOQ (minimum order quantity) is required, bump quantity + - If order multiples are to be observed, then we need to calculate based on that, too + """ + + price_breaks = instance.price_breaks.all() + + # No price break information available? + if len(price_breaks) == 0: + return None + + # Check if quantity is fraction and disable multiples + multiples = (quantity % 1 == 0) + + # Order multiples + if multiples: + quantity = int(math.ceil(quantity / instance.multiple) * instance.multiple) + + pb_found = False + pb_quantity = -1 + pb_cost = 0.0 + + if currency is None: + # Default currency selection + currency = InvenTreeSetting.get_setting('INVENTREE_DEFAULT_CURRENCY') + + pb_min = None + for pb in instance.price_breaks.all(): + # Store smallest price break + if not pb_min: + pb_min = pb + + # Ignore this pricebreak (quantity is too high) + if pb.quantity > quantity: + continue + + pb_found = True + + # If this price-break quantity is the largest so far, use it! + if pb.quantity > pb_quantity: + pb_quantity = pb.quantity + + # Convert everything to the selected currency + pb_cost = pb.convert_to(currency) + + # Use smallest price break + if not pb_found and pb_min: + # Update price break information + pb_quantity = pb_min.quantity + pb_cost = pb_min.convert_to(currency) + # Trigger cost calculation using smallest price break + pb_found = True + + # Convert quantity to decimal.Decimal format + quantity = decimal.Decimal(f'{quantity}') + + if pb_found: + cost = pb_cost * quantity + return InvenTree.helpers.normalize(cost + instance.base_cost) + else: + return None + + class ColorTheme(models.Model): """ Color Theme Setting """ diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py index 89a3f6c9bf..baac95d44d 100644 --- a/InvenTree/company/models.py +++ b/InvenTree/company/models.py @@ -558,70 +558,7 @@ class SupplierPart(models.Model): price=price ) - def get_price(self, quantity, moq=True, multiples=True, currency=None): - """ Calculate the supplier price based on quantity price breaks. - - - Don't forget to add in flat-fee cost (base_cost field) - - If MOQ (minimum order quantity) is required, bump quantity - - If order multiples are to be observed, then we need to calculate based on that, too - """ - - price_breaks = self.price_breaks.all() - - # No price break information available? - if len(price_breaks) == 0: - return None - - # Check if quantity is fraction and disable multiples - multiples = (quantity % 1 == 0) - - # Order multiples - if multiples: - quantity = int(math.ceil(quantity / self.multiple) * self.multiple) - - pb_found = False - pb_quantity = -1 - pb_cost = 0.0 - - if currency is None: - # Default currency selection - currency = common.models.InvenTreeSetting.get_setting('INVENTREE_DEFAULT_CURRENCY') - - pb_min = None - for pb in self.price_breaks.all(): - # Store smallest price break - if not pb_min: - pb_min = pb - - # Ignore this pricebreak (quantity is too high) - if pb.quantity > quantity: - continue - - pb_found = True - - # If this price-break quantity is the largest so far, use it! - if pb.quantity > pb_quantity: - pb_quantity = pb.quantity - - # Convert everything to the selected currency - pb_cost = pb.convert_to(currency) - - # Use smallest price break - if not pb_found and pb_min: - # Update price break information - pb_quantity = pb_min.quantity - pb_cost = pb_min.convert_to(currency) - # Trigger cost calculation using smallest price break - pb_found = True - - # Convert quantity to decimal.Decimal format - quantity = decimal.Decimal(f'{quantity}') - - if pb_found: - cost = pb_cost * quantity - return normalize(cost + self.base_cost) - else: - return None + get_price = common.models.get_price def open_orders(self): """ Return a database query for PO line items for this SupplierPart, From 1b7ade94052178b04cc7a5c8bbbb410a8e94620f Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 5 May 2021 23:47:46 +0200 Subject: [PATCH 14/56] adding in missing parts for full saleprice --- .../migrations/0065_auto_20210505_2144.py | 24 ++++++++++++ InvenTree/part/models.py | 38 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 InvenTree/part/migrations/0065_auto_20210505_2144.py diff --git a/InvenTree/part/migrations/0065_auto_20210505_2144.py b/InvenTree/part/migrations/0065_auto_20210505_2144.py new file mode 100644 index 0000000000..328ce1f588 --- /dev/null +++ b/InvenTree/part/migrations/0065_auto_20210505_2144.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2 on 2021-05-05 21:44 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('part', '0064_auto_20210404_2016'), + ] + + operations = [ + migrations.AddField( + model_name='part', + name='base_cost', + field=models.DecimalField(decimal_places=3, default=0, help_text='Minimum charge (e.g. stocking fee)', max_digits=10, validators=[django.core.validators.MinValueValidator(0)], verbose_name='base cost'), + ), + migrations.AddField( + model_name='part', + name='multiple', + field=models.PositiveIntegerField(default=1, help_text='Sell multiple', validators=[django.core.validators.MinValueValidator(1)], verbose_name='multiple'), + ), + ] diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 137781ba2b..4c7086f51d 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -1611,6 +1611,44 @@ class Part(MPTTModel): max(buy_price_range[1], bom_price_range[1]) ) + base_cost = models.DecimalField(max_digits=10, decimal_places=3, default=0, validators=[MinValueValidator(0)], verbose_name=_('base cost'), help_text=_('Minimum charge (e.g. stocking fee)')) + + multiple = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1)], verbose_name=_('multiple'), help_text=_('Sell multiple')) + + get_price = common.models.get_price + + @property + def has_price_breaks(self): + return self.price_breaks.count() > 0 + + @property + def price_breaks(self): + """ Return the associated price breaks in the correct order """ + return self.salepricebreaks.order_by('quantity').all() + + @property + def unit_pricing(self): + return self.get_price(1) + + def add_price_break(self, quantity, price): + """ + Create a new price break for this part + + args: + quantity - Numerical quantity + price - Must be a Money object + """ + + # Check if a price break at that quantity already exists... + if self.price_breaks.filter(quantity=quantity, part=self.pk).exists(): + return + + PartSellPriceBreak.objects.create( + part=self, + quantity=quantity, + price=price + ) + @transaction.atomic def copy_bom_from(self, other, clear=True, **kwargs): """ From 030865f8dd96b45f621c80b5833301786b004c35 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 5 May 2021 23:49:04 +0200 Subject: [PATCH 15/56] sale price in pricing table --- InvenTree/part/templates/part/part_pricing.html | 14 ++++++++++++++ InvenTree/part/views.py | 6 ++++++ 2 files changed, 20 insertions(+) diff --git a/InvenTree/part/templates/part/part_pricing.html b/InvenTree/part/templates/part/part_pricing.html index 9922813210..df43ed8799 100644 --- a/InvenTree/part/templates/part/part_pricing.html +++ b/InvenTree/part/templates/part/part_pricing.html @@ -79,6 +79,20 @@ {% endif %} +{% if total_part_price %} +

{% trans 'Sale Price' %}

+ + + + + + + + + +
{% trans 'Unit Cost' %}{% include "price.html" with price=unit_part_price %}
{% trans 'Total Cost' %}{% include "price.html" with price=total_part_price %}
+{% endif %} + {% if min_unit_buy_price or min_unit_bom_price %} {% else %}
diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index b7bebb6d05..5af90cb383 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -2055,6 +2055,12 @@ class PartPricing(AjaxView): ctx['max_total_bom_price'] = max_bom_price ctx['max_unit_bom_price'] = max_unit_bom_price + # part pricing information + part_price = part.get_price(quantity) + if part_price is not None: + ctx['total_part_price'] = round(part_price, 3) + ctx['unit_part_price'] = round(part_price / quantity, 3) + return ctx def get(self, request, *args, **kwargs): From efa9da2ce1b38a98afb09f3b7ab2a965529a8432 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 6 May 2021 00:00:13 +0200 Subject: [PATCH 16/56] removed unused imports --- InvenTree/company/models.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py index baac95d44d..32f1d07a33 100644 --- a/InvenTree/company/models.py +++ b/InvenTree/company/models.py @@ -6,8 +6,6 @@ Company database model definitions from __future__ import unicode_literals import os -import decimal -import math from django.utils.translation import ugettext_lazy as _ from django.core.validators import MinValueValidator @@ -26,7 +24,6 @@ from markdownx.models import MarkdownxField from stdimage.models import StdImageField from InvenTree.helpers import getMediaUrl, getBlankImage, getBlankThumbnail -from InvenTree.helpers import normalize from InvenTree.fields import InvenTreeURLField from InvenTree.status_codes import PurchaseOrderStatus From 66f198baa93150a8e1602e4bb6c8836eb20d71df Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 6 May 2021 00:17:46 +0200 Subject: [PATCH 17/56] removing duplicate information in pricing table --- InvenTree/part/templates/part/part_pricing.html | 5 ----- 1 file changed, 5 deletions(-) diff --git a/InvenTree/part/templates/part/part_pricing.html b/InvenTree/part/templates/part/part_pricing.html index df43ed8799..af916a43fd 100644 --- a/InvenTree/part/templates/part/part_pricing.html +++ b/InvenTree/part/templates/part/part_pricing.html @@ -4,11 +4,6 @@ {% block pre_form_content %} -
-{% blocktrans %}Pricing information for:
{{part}}.{% endblocktrans %} -
- -

{% trans 'Quantity' %}

From f9463fa277bf0d7da0284ed843849e83a560f10b Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 6 May 2021 00:33:34 +0200 Subject: [PATCH 18/56] fixes navbar-layout shift with narrow dollar-sign --- InvenTree/part/templates/part/navbar.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/part/templates/part/navbar.html b/InvenTree/part/templates/part/navbar.html index d8750a49a5..df49841e31 100644 --- a/InvenTree/part/templates/part/navbar.html +++ b/InvenTree/part/templates/part/navbar.html @@ -91,7 +91,7 @@ {% if part.salable and roles.sales_order.view %}
  • - + {% trans "Sale Price" %}
  • From 1259374822ae330ae54bcb7c6745f2ecd2cb69db Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 6 May 2021 00:37:45 +0200 Subject: [PATCH 19/56] removes layout-shift due to typo in menubar --- InvenTree/part/templates/part/sale_prices.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/part/templates/part/sale_prices.html b/InvenTree/part/templates/part/sale_prices.html index ce50c1f20d..f19d65a59a 100644 --- a/InvenTree/part/templates/part/sale_prices.html +++ b/InvenTree/part/templates/part/sale_prices.html @@ -2,7 +2,7 @@ {% load static %} {% load i18n %} -{% block menubar %}} +{% block menubar %} {% include 'part/navbar.html' with tab='sales-prices' %} {% endblock %} From f2b0717d10db0b831d6a8045fed3aa4febbdf18c Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 6 May 2021 12:11:38 +0200 Subject: [PATCH 20/56] removes all lines consisting only of spaces this really bothers me for some reason - nothing technical --- InvenTree/InvenTree/api_tester.py | 2 +- InvenTree/InvenTree/context.py | 2 +- InvenTree/InvenTree/exchange.py | 2 +- InvenTree/InvenTree/fields.py | 2 +- InvenTree/InvenTree/helpers.py | 24 ++--- InvenTree/InvenTree/models.py | 2 +- InvenTree/InvenTree/permissions.py | 2 +- InvenTree/InvenTree/serializers.py | 2 +- InvenTree/InvenTree/status.py | 2 +- InvenTree/InvenTree/status_codes.py | 2 +- InvenTree/InvenTree/test_api.py | 2 +- InvenTree/InvenTree/test_tasks.py | 2 +- InvenTree/InvenTree/tests.py | 6 +- InvenTree/InvenTree/urls.py | 4 +- InvenTree/InvenTree/validators.py | 2 +- InvenTree/InvenTree/views.py | 24 ++--- InvenTree/barcodes/api.py | 8 +- InvenTree/barcodes/barcode.py | 2 +- InvenTree/barcodes/tests.py | 4 +- InvenTree/build/api.py | 4 +- InvenTree/build/models.py | 28 ++--- InvenTree/build/test_api.py | 4 +- InvenTree/build/test_build.py | 10 +- InvenTree/build/tests.py | 16 +-- InvenTree/build/views.py | 40 +++---- InvenTree/common/admin.py | 2 +- InvenTree/common/models.py | 12 +-- InvenTree/common/settings.py | 2 +- InvenTree/common/test_views.py | 2 +- InvenTree/common/tests.py | 2 +- InvenTree/common/views.py | 2 +- InvenTree/company/api.py | 10 +- InvenTree/company/forms.py | 2 +- InvenTree/company/models.py | 20 ++-- InvenTree/company/serializers.py | 6 +- InvenTree/company/test_migrations.py | 12 +-- InvenTree/company/test_views.py | 12 +-- InvenTree/company/tests.py | 10 +- InvenTree/company/urls.py | 2 +- InvenTree/company/views.py | 22 ++-- InvenTree/label/api.py | 6 +- InvenTree/label/apps.py | 2 +- InvenTree/label/models.py | 4 +- InvenTree/label/test_api.py | 2 +- InvenTree/order/forms.py | 2 +- InvenTree/order/models.py | 18 ++-- InvenTree/order/serializers.py | 16 +-- InvenTree/order/test_api.py | 4 +- InvenTree/order/test_sales_order.py | 8 +- InvenTree/order/test_views.py | 10 +- InvenTree/order/tests.py | 6 +- InvenTree/order/views.py | 50 ++++----- InvenTree/part/admin.py | 6 +- InvenTree/part/api.py | 26 ++--- InvenTree/part/apps.py | 2 +- InvenTree/part/bom.py | 22 ++-- InvenTree/part/forms.py | 6 +- InvenTree/part/models.py | 46 ++++---- InvenTree/part/serializers.py | 8 +- .../part/templatetags/inventree_extras.py | 6 +- InvenTree/part/test_api.py | 14 +-- InvenTree/part/test_bom_item.py | 6 +- InvenTree/part/test_category.py | 6 +- InvenTree/part/test_migrations.py | 2 +- InvenTree/part/test_param.py | 2 +- InvenTree/part/test_part.py | 6 +- InvenTree/part/test_views.py | 14 +-- InvenTree/part/urls.py | 12 +-- InvenTree/part/views.py | 102 +++++++++--------- InvenTree/plugins/action/action.py | 4 +- InvenTree/report/api.py | 18 ++-- InvenTree/report/models.py | 6 +- InvenTree/report/templatetags/barcode.py | 2 +- InvenTree/report/templatetags/report.py | 2 +- InvenTree/script/translate.py | 2 +- InvenTree/script/translation_stats.py | 2 +- InvenTree/stock/admin.py | 4 +- InvenTree/stock/api.py | 30 +++--- InvenTree/stock/forms.py | 24 ++--- InvenTree/stock/models.py | 24 ++--- InvenTree/stock/serializers.py | 4 +- InvenTree/stock/test_api.py | 16 +-- InvenTree/stock/test_views.py | 12 +-- InvenTree/stock/tests.py | 6 +- InvenTree/stock/urls.py | 2 +- InvenTree/stock/views.py | 76 ++++++------- InvenTree/users/admin.py | 2 +- InvenTree/users/models.py | 8 +- InvenTree/users/test_migrations.py | 2 +- InvenTree/users/tests.py | 6 +- tasks.py | 6 +- 91 files changed, 494 insertions(+), 494 deletions(-) diff --git a/InvenTree/InvenTree/api_tester.py b/InvenTree/InvenTree/api_tester.py index 2e69e40969..eb92bd80c1 100644 --- a/InvenTree/InvenTree/api_tester.py +++ b/InvenTree/InvenTree/api_tester.py @@ -83,7 +83,7 @@ class InvenTreeAPITestCase(APITestCase): self.assertEqual(response.status_code, code) return response - + def post(self, url, data): """ Issue a POST request diff --git a/InvenTree/InvenTree/context.py b/InvenTree/InvenTree/context.py index e072f5a5ea..669b55b0c0 100644 --- a/InvenTree/InvenTree/context.py +++ b/InvenTree/InvenTree/context.py @@ -71,7 +71,7 @@ def status_codes(request): def user_roles(request): """ Return a map of the current roles assigned to the user. - + Roles are denoted by their simple names, and then the permission type. Permissions can be access as follows: diff --git a/InvenTree/InvenTree/exchange.py b/InvenTree/InvenTree/exchange.py index 04ceabccd8..06de4861ec 100644 --- a/InvenTree/InvenTree/exchange.py +++ b/InvenTree/InvenTree/exchange.py @@ -17,5 +17,5 @@ class InvenTreeManualExchangeBackend(BaseExchangeBackend): """ Do not get any rates... """ - + return {} diff --git a/InvenTree/InvenTree/fields.py b/InvenTree/InvenTree/fields.py index 155f77c639..c496c1bb22 100644 --- a/InvenTree/InvenTree/fields.py +++ b/InvenTree/InvenTree/fields.py @@ -102,5 +102,5 @@ class RoundingDecimalField(models.DecimalField): } defaults.update(kwargs) - + return super().formfield(**kwargs) diff --git a/InvenTree/InvenTree/helpers.py b/InvenTree/InvenTree/helpers.py index d5508b7db2..1097c5663b 100644 --- a/InvenTree/InvenTree/helpers.py +++ b/InvenTree/InvenTree/helpers.py @@ -35,7 +35,7 @@ def generateTestKey(test_name): """ Generate a test 'key' for a given test name. This must not have illegal chars as it will be used for dict lookup in a template. - + Tests must be named such that they will have unique keys. """ @@ -102,7 +102,7 @@ def TestIfImageURL(url): '.tif', '.tiff', '.webp', '.gif', ] - + def str2bool(text, test=True): """ Test if a string 'looks' like a boolean value. @@ -137,10 +137,10 @@ def isNull(text): """ Test if a string 'looks' like a null value. This is useful for querying the API against a null key. - + Args: text: Input text - + Returns: True if the text looks like a null value """ @@ -157,7 +157,7 @@ def normalize(d): d = Decimal(d) d = d.normalize() - + # Ref: https://docs.python.org/3/library/decimal.html return d.quantize(Decimal(1)) if d == d.to_integral() else d.normalize() @@ -165,14 +165,14 @@ def normalize(d): def increment(n): """ Attempt to increment an integer (or a string that looks like an integer!) - + e.g. 001 -> 002 2 -> 3 AB01 -> AB02 QQQ -> QQQ - + """ value = str(n).strip() @@ -314,7 +314,7 @@ def MakeBarcode(object_name, object_pk, object_data={}, **kwargs): def GetExportFormats(): """ Return a list of allowable file formats for exporting data """ - + return [ 'csv', 'tsv', @@ -327,7 +327,7 @@ def GetExportFormats(): def DownloadFile(data, filename, content_type='application/text'): """ Create a dynamic file for the user to download. - + Args: data: Raw file data (string or bytes) filename: Filename for the file download @@ -525,7 +525,7 @@ def addUserPermission(user, permission): """ Shortcut function for adding a certain permission to a user. """ - + perm = Permission.objects.get(codename=permission) user.user_permissions.add(perm) @@ -576,7 +576,7 @@ def getOldestMigrationFile(app, exclude_extension=True, ignore_initial=True): continue num = int(f.split('_')[0]) - + if oldest_file is None or num < oldest_num: oldest_num = num oldest_file = f @@ -585,7 +585,7 @@ def getOldestMigrationFile(app, exclude_extension=True, ignore_initial=True): oldest_file = oldest_file.replace('.py', '') return oldest_file - + def getNewestMigrationFile(app, exclude_extension=True): """ diff --git a/InvenTree/InvenTree/models.py b/InvenTree/InvenTree/models.py index 8494b52a10..5822f8a19f 100644 --- a/InvenTree/InvenTree/models.py +++ b/InvenTree/InvenTree/models.py @@ -129,7 +129,7 @@ class InvenTreeTree(MPTTModel): Here an 'item' is considered to be the 'leaf' at the end of each branch, and the exact nature here will depend on the class implementation. - + The default implementation returns zero """ return 0 diff --git a/InvenTree/InvenTree/permissions.py b/InvenTree/InvenTree/permissions.py index 973395a2a0..defb370435 100644 --- a/InvenTree/InvenTree/permissions.py +++ b/InvenTree/InvenTree/permissions.py @@ -17,7 +17,7 @@ class RolePermission(permissions.BasePermission): - PUT - PATCH - DELETE - + Specify the required "role" using the role_required attribute. e.g. diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 6b40b8eb31..fa7674723c 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -44,7 +44,7 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): In addition to running validators on the serializer fields, this class ensures that the underlying model is also validated. """ - + # Run any native validation checks first (may throw an ValidationError) data = super(serializers.ModelSerializer, self).validate(data) diff --git a/InvenTree/InvenTree/status.py b/InvenTree/InvenTree/status.py index 5531d4c270..970e88831d 100644 --- a/InvenTree/InvenTree/status.py +++ b/InvenTree/InvenTree/status.py @@ -64,7 +64,7 @@ def is_email_configured(): if not settings.EMAIL_HOST_USER: configured = False - + # Display warning unless in test mode if not settings.TESTING: logger.warning("EMAIL_HOST_USER is not configured") diff --git a/InvenTree/InvenTree/status_codes.py b/InvenTree/InvenTree/status_codes.py index 6294eba06e..c73ef10018 100644 --- a/InvenTree/InvenTree/status_codes.py +++ b/InvenTree/InvenTree/status_codes.py @@ -16,7 +16,7 @@ class StatusCode: # If the key cannot be found, pass it back if key not in cls.options.keys(): return key - + value = cls.options.get(key, key) color = cls.colors.get(key, 'grey') diff --git a/InvenTree/InvenTree/test_api.py b/InvenTree/InvenTree/test_api.py index 52765db2a7..8435d756fb 100644 --- a/InvenTree/InvenTree/test_api.py +++ b/InvenTree/InvenTree/test_api.py @@ -119,7 +119,7 @@ class APITests(InvenTreeAPITestCase): self.assertNotIn('add', roles[rule]) self.assertNotIn('change', roles[rule]) self.assertNotIn('delete', roles[rule]) - + def test_with_superuser(self): """ Superuser should have *all* roles assigned diff --git a/InvenTree/InvenTree/test_tasks.py b/InvenTree/InvenTree/test_tasks.py index 02e8d14e5e..e9c9d9f01c 100644 --- a/InvenTree/InvenTree/test_tasks.py +++ b/InvenTree/InvenTree/test_tasks.py @@ -37,7 +37,7 @@ class ScheduledTaskTests(TestCase): # Attempt to schedule the same task again InvenTree.tasks.schedule_task(task, schedule_type=Schedule.MINUTES, minutes=5) self.assertEqual(self.get_tasks(task).count(), 1) - + # But the 'minutes' should have been updated t = Schedule.objects.get(func=task) self.assertEqual(t.minutes, 5) diff --git a/InvenTree/InvenTree/tests.py b/InvenTree/InvenTree/tests.py index af812fe8a3..d65829cf8e 100644 --- a/InvenTree/InvenTree/tests.py +++ b/InvenTree/InvenTree/tests.py @@ -97,7 +97,7 @@ class TestHelpers(TestCase): self.assertEqual(helpers.getMediaUrl('xx/yy.png'), '/media/xx/yy.png') def testDecimal2String(self): - + self.assertEqual(helpers.decimal2string(Decimal('1.2345000')), '1.2345') self.assertEqual(helpers.decimal2string('test'), 'test') @@ -205,7 +205,7 @@ class TestMPTT(TestCase): child = StockLocation.objects.get(pk=5) parent.parent = child - + with self.assertRaises(InvalidMove): parent.save() @@ -223,7 +223,7 @@ class TestMPTT(TestCase): drawer.save() self.assertNotEqual(tree, drawer.tree_id) - + class TestSerialNumberExtraction(TestCase): """ Tests for serial number extraction code """ diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index c57e82addc..ab2ced7d5e 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -81,7 +81,7 @@ settings_urls = [ url(r'^user/?', SettingsView.as_view(template_name='InvenTree/settings/user.html'), name='settings-user'), url(r'^appearance/?', AppearanceSelectView.as_view(), name='settings-appearance'), url(r'^i18n/?', include('django.conf.urls.i18n')), - + url(r'^global/?', SettingsView.as_view(template_name='InvenTree/settings/global.html'), name='settings-global'), url(r'^report/?', SettingsView.as_view(template_name='InvenTree/settings/report.html'), name='settings-report'), url(r'^category/?', SettingCategorySelectView.as_view(), name='settings-category'), @@ -137,7 +137,7 @@ urlpatterns = [ url(r'^login/?', auth_views.LoginView.as_view(), name='login'), url(r'^logout/', auth_views.LogoutView.as_view(template_name='registration/logged_out.html'), name='logout'), - + url(r'^settings/', include(settings_urls)), url(r'^edit-user/', EditUserView.as_view(), name='edit-user'), diff --git a/InvenTree/InvenTree/validators.py b/InvenTree/InvenTree/validators.py index f8199ef20b..622d1511ec 100644 --- a/InvenTree/InvenTree/validators.py +++ b/InvenTree/InvenTree/validators.py @@ -130,7 +130,7 @@ def validate_overage(value): if i < 0: raise ValidationError(_("Overage value must not be negative")) - + # Looks like an integer! return True except ValueError: diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py index def4b34781..d285efae36 100644 --- a/InvenTree/InvenTree/views.py +++ b/InvenTree/InvenTree/views.py @@ -176,7 +176,7 @@ class InvenTreeRoleMixin(PermissionRequiredMixin): if role not in RuleSet.RULESET_NAMES: raise ValueError(f"Role '{role}' is not a valid role") - + if permission not in RuleSet.RULESET_PERMISSIONS: raise ValueError(f"Permission '{permission}' is not a valid permission") @@ -223,7 +223,7 @@ class InvenTreeRoleMixin(PermissionRequiredMixin): Return the 'permission_class' required for the current View. Must be one of: - + - view - change - add @@ -389,7 +389,7 @@ class QRCodeView(AjaxView): """ ajax_template_name = "qr_code.html" - + def get(self, request, *args, **kwargs): self.request = request self.pk = self.kwargs['pk'] @@ -398,7 +398,7 @@ class QRCodeView(AjaxView): def get_qr_data(self): """ Returns the text object to render to a QR code. The actual rendering will be handled by the template """ - + return None def get_context_data(self): @@ -406,7 +406,7 @@ class QRCodeView(AjaxView): Explicity passes the parameter 'qr_data' """ - + context = {} qr = self.get_qr_data() @@ -415,7 +415,7 @@ class QRCodeView(AjaxView): context['qr_data'] = qr else: context['error_msg'] = 'Error generating QR code' - + return context @@ -507,7 +507,7 @@ class AjaxUpdateView(AjaxMixin, UpdateView): """ super(UpdateView, self).get(request, *args, **kwargs) - + return self.renderJsonResponse(request, self.get_form(), context=self.get_context_data()) def save(self, object, form, **kwargs): @@ -673,7 +673,7 @@ class SetPasswordView(AjaxUpdateView): p1 = request.POST.get('enter_password', '') p2 = request.POST.get('confirm_password', '') - + if valid: # Passwords must match @@ -712,7 +712,7 @@ class IndexView(TemplateView): # Generate a list of orderable parts which have stock below their minimum values # TODO - Is there a less expensive way to get these from the database # context['to_order'] = [part for part in Part.objects.filter(purchaseable=True) if part.need_to_restock()] - + # Generate a list of assembly parts which have stock below their minimum values # TODO - Is there a less expensive way to get these from the database # context['to_build'] = [part for part in Part.objects.filter(assembly=True) if part.need_to_restock()] @@ -752,7 +752,7 @@ class DynamicJsView(TemplateView): template_name = "" content_type = 'text/javascript' - + class SettingsView(TemplateView): """ View for configuring User settings @@ -830,7 +830,7 @@ class AppearanceSelectView(FormView): if form.is_valid(): theme_selected = form.cleaned_data['name'] - + # Set color theme to form selection user_theme.name = theme_selected user_theme.save() @@ -893,7 +893,7 @@ class DatabaseStatsView(AjaxView): # Part stats ctx['part_count'] = Part.objects.count() ctx['part_cat_count'] = PartCategory.objects.count() - + # Stock stats ctx['stock_item_count'] = StockItem.objects.count() ctx['stock_loc_count'] = StockLocation.objects.count() diff --git a/InvenTree/barcodes/api.py b/InvenTree/barcodes/api.py index e6b3ea84e3..6ab848c3f6 100644 --- a/InvenTree/barcodes/api.py +++ b/InvenTree/barcodes/api.py @@ -73,7 +73,7 @@ class BarcodeScan(APIView): # A plugin has been found! if plugin is not None: - + # Try to associate with a stock item item = plugin.getStockItem() @@ -133,7 +133,7 @@ class BarcodeScan(APIView): class BarcodeAssign(APIView): """ Endpoint for assigning a barcode to a stock item. - + - This only works if the barcode is not already associated with an object in the database - If the barcode does not match an object, then the barcode hash is assigned to the StockItem """ @@ -178,7 +178,7 @@ class BarcodeAssign(APIView): # Matching plugin was found if plugin is not None: - + hash = plugin.hash() response['hash'] = hash response['plugin'] = plugin.name @@ -234,7 +234,7 @@ class BarcodeAssign(APIView): barcode_api_urls = [ url(r'^link/$', BarcodeAssign.as_view(), name='api-barcode-link'), - + # Catch-all performs barcode 'scan' url(r'^.*$', BarcodeScan.as_view(), name='api-barcode-scan'), ] diff --git a/InvenTree/barcodes/barcode.py b/InvenTree/barcodes/barcode.py index a00e91d7e4..7ab9f3716a 100644 --- a/InvenTree/barcodes/barcode.py +++ b/InvenTree/barcodes/barcode.py @@ -21,7 +21,7 @@ def hash_barcode(barcode_data): HACK: Remove any 'non printable' characters from the hash, as it seems browers will remove special control characters... - + TODO: Work out a way around this! """ diff --git a/InvenTree/barcodes/tests.py b/InvenTree/barcodes/tests.py index 5f178d923c..1d8f53ec4c 100644 --- a/InvenTree/barcodes/tests.py +++ b/InvenTree/barcodes/tests.py @@ -92,7 +92,7 @@ class BarcodeAPITest(APITestCase): data = response.data self.assertEqual(response.status_code, status.HTTP_200_OK) - + self.assertIn('stockitem', data) pk = data['stockitem']['pk'] @@ -121,7 +121,7 @@ class BarcodeAPITest(APITestCase): data = response.data self.assertEqual(response.status_code, status.HTTP_200_OK) - + self.assertIn('success', data) hash = data['hash'] diff --git a/InvenTree/build/api.py b/InvenTree/build/api.py index 10cc7e2024..160642281a 100644 --- a/InvenTree/build/api.py +++ b/InvenTree/build/api.py @@ -20,7 +20,7 @@ from .serializers import BuildSerializer, BuildItemSerializer class BuildList(generics.ListCreateAPIView): """ API endpoint for accessing a list of Build objects. - + - GET: Return list of objects (with filters) - POST: Create a new Build object """ @@ -65,7 +65,7 @@ class BuildList(generics.ListCreateAPIView): queryset = BuildSerializer.annotate_queryset(queryset) return queryset - + def filter_queryset(self, queryset): queryset = super().filter_queryset(queryset) diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index c5da505f43..a278b4e17c 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -118,7 +118,7 @@ class Build(MPTTModel): def get_absolute_url(self): return reverse('build-detail', kwargs={'pk': self.id}) - + reference = models.CharField( unique=True, max_length=64, @@ -168,7 +168,7 @@ class Build(MPTTModel): null=True, blank=True, help_text=_('SalesOrder to which this build is allocated') ) - + take_from = models.ForeignKey( 'stock.StockLocation', verbose_name=_('Source Location'), @@ -177,7 +177,7 @@ class Build(MPTTModel): null=True, blank=True, help_text=_('Select location to take stock from for this build (leave blank to take from any stock location)') ) - + destination = models.ForeignKey( 'stock.StockLocation', verbose_name=_('Destination Location'), @@ -207,7 +207,7 @@ class Build(MPTTModel): validators=[MinValueValidator(0)], help_text=_('Build status code') ) - + batch = models.CharField( verbose_name=_('Batch Code'), max_length=100, @@ -215,9 +215,9 @@ class Build(MPTTModel): null=True, help_text=_('Batch code for this build output') ) - + creation_date = models.DateField(auto_now_add=True, editable=False, verbose_name=_('Creation Date')) - + target_date = models.DateField( null=True, blank=True, verbose_name=_('Target completion date'), @@ -251,7 +251,7 @@ class Build(MPTTModel): help_text=_('User responsible for this build order'), related_name='builds_responsible', ) - + link = InvenTree.fields.InvenTreeURLField( verbose_name=_('External Link'), blank=True, help_text=_('Link to external URL') @@ -272,7 +272,7 @@ class Build(MPTTModel): else: descendants = self.get_descendants(include_self=True) Build.objects.filter(parent__pk__in=[d.pk for d in descendants]) - + def sub_build_count(self, cascade=True): """ Return the number of sub builds under this one. @@ -295,7 +295,7 @@ class Build(MPTTModel): query = query.filter(Build.OVERDUE_FILTER) return query.exists() - + @property def active(self): """ @@ -441,7 +441,7 @@ class Build(MPTTModel): # Extract the "most recent" build order reference builds = cls.objects.exclude(reference=None) - + if not builds.exists(): return None @@ -543,7 +543,7 @@ class Build(MPTTModel): - The sub_item in the BOM line must *not* be trackable - There is only a single stock item available (which has not already been allocated to this build) - The stock item has an availability greater than zero - + Returns: A list object containing the StockItem objects to be allocated (and the quantities). Each item in the list is a dict as follows: @@ -648,7 +648,7 @@ class Build(MPTTModel): """ Deletes all stock allocations for this build. """ - + allocations = BuildItem.objects.filter(build=self) allocations.delete() @@ -1145,7 +1145,7 @@ class BuildItem(models.Model): """ self.validate_unique() - + super().clean() errors = {} @@ -1159,7 +1159,7 @@ class BuildItem(models.Model): # Allocated part must be in the BOM for the master part if self.stock_item.part not in self.build.part.getRequiredParts(recursive=False): errors['stock_item'] = [_("Selected stock item not found in BOM for part '{p}'").format(p=self.build.part.full_name)] - + # Allocated quantity cannot exceed available stock quantity if self.quantity > self.stock_item.quantity: errors['quantity'] = [_("Allocated quantity ({n}) must not exceed available quantity ({q})").format( diff --git a/InvenTree/build/test_api.py b/InvenTree/build/test_api.py index 02bcde6bb4..a1d0c3df9f 100644 --- a/InvenTree/build/test_api.py +++ b/InvenTree/build/test_api.py @@ -30,7 +30,7 @@ class BuildAPITest(InvenTreeAPITestCase): 'build.change', 'build.add' ] - + def setUp(self): super().setUp() @@ -54,7 +54,7 @@ class BuildListTest(BuildAPITest): builds = self.get(self.url, data={'active': True}) self.assertEqual(len(builds.data), 1) - + builds = self.get(self.url, data={'status': BuildStatus.COMPLETE}) self.assertEqual(len(builds.data), 4) diff --git a/InvenTree/build/test_build.py b/InvenTree/build/test_build.py index 0beab60d52..a3b69646dd 100644 --- a/InvenTree/build/test_build.py +++ b/InvenTree/build/test_build.py @@ -114,7 +114,7 @@ class BuildTest(TestCase): # Perform some basic tests before we start the ball rolling self.assertEqual(StockItem.objects.count(), 6) - + # Build is PENDING self.assertEqual(self.build.status, status.BuildStatus.PENDING) @@ -142,7 +142,7 @@ class BuildTest(TestCase): # Create a BuiltItem which points to an invalid StockItem b = BuildItem(stock_item=stock, build=self.build, quantity=10) - + with self.assertRaises(ValidationError): b.save() @@ -339,7 +339,7 @@ class BuildTest(TestCase): self.assertTrue(self.build.can_complete) self.build.complete_build(None) - + self.assertEqual(self.build.status, status.BuildStatus.COMPLETE) # the original BuildItem objects should have been deleted! @@ -351,12 +351,12 @@ class BuildTest(TestCase): # This stock item has been depleted! with self.assertRaises(StockItem.DoesNotExist): StockItem.objects.get(pk=self.stock_1_1.pk) - + # This stock item has *not* been depleted x = StockItem.objects.get(pk=self.stock_2_1.pk) self.assertEqual(x.quantity, 4970) - + # And 10 new stock items created for the build output outputs = StockItem.objects.filter(build=self.build) diff --git a/InvenTree/build/tests.py b/InvenTree/build/tests.py index e16ef9a282..9a440e0b93 100644 --- a/InvenTree/build/tests.py +++ b/InvenTree/build/tests.py @@ -251,7 +251,7 @@ class TestBuildViews(TestCase): content = str(response.content) self.assertIn(build.title, content) - + def test_build_create(self): """ Test the build creation view (ajax form) """ @@ -260,7 +260,7 @@ class TestBuildViews(TestCase): # Create build without specifying part response = self.client.get(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertEqual(response.status_code, 200) - + # Create build with valid part response = self.client.get(url, {'part': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertEqual(response.status_code, 200) @@ -281,7 +281,7 @@ class TestBuildViews(TestCase): # Get the page in editing mode response = self.client.get(url, {'edit': 1}) self.assertEqual(response.status_code, 200) - + def test_build_item_create(self): """ Test the BuildItem creation view (ajax form) """ @@ -305,7 +305,7 @@ class TestBuildViews(TestCase): def test_build_item_edit(self): """ Test the BuildItem edit view (ajax form) """ - + # TODO # url = reverse('build-item-edit') pass @@ -323,7 +323,7 @@ class TestBuildViews(TestCase): # Test without confirmation response = self.client.post(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertEqual(response.status_code, 200) - + data = json.loads(response.content) self.assertFalse(data['form_valid']) @@ -353,7 +353,7 @@ class TestBuildViews(TestCase): # Test with confirmation, invalid location response = self.client.post(url, {'confirm': 1, 'location': 9999}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertEqual(response.status_code, 200) - + data = json.loads(response.content) self.assertFalse(data['form_valid']) @@ -365,7 +365,7 @@ class TestBuildViews(TestCase): # Test without confirmation response = self.client.post(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertEqual(response.status_code, 200) - + data = json.loads(response.content) self.assertFalse(data['form_valid']) @@ -393,7 +393,7 @@ class TestBuildViews(TestCase): data = json.loads(response.content) self.assertFalse(data['form_valid']) - + # Test with confirmation response = self.client.post(url, {'confirm': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertEqual(response.status_code, 200) diff --git a/InvenTree/build/views.py b/InvenTree/build/views.py index 66815cae70..6e72f7f3e6 100644 --- a/InvenTree/build/views.py +++ b/InvenTree/build/views.py @@ -159,7 +159,7 @@ class BuildOutputCreate(AjaxUpdateView): if quantity: build = self.get_object() - + # Check that requested output don't exceed build remaining quantity maximum_output = int(build.remaining - build.incomplete_count) if quantity > maximum_output: @@ -318,7 +318,7 @@ class BuildUnallocate(AjaxUpdateView): form_class = forms.UnallocateBuildForm ajax_form_title = _("Unallocate Stock") ajax_template_name = "build/unallocate.html" - + def get_initial(self): initials = super().get_initial() @@ -341,7 +341,7 @@ class BuildUnallocate(AjaxUpdateView): build = self.get_object() form = self.get_form() - + confirm = request.POST.get('confirm', False) output_id = request.POST.get('output_id', None) @@ -382,7 +382,7 @@ class BuildUnallocate(AjaxUpdateView): # Unallocate "untracked" parts else: build.unallocateUntracked(part=part) - + data = { 'form_valid': valid, } @@ -401,7 +401,7 @@ class BuildComplete(AjaxUpdateView): model = Build form_class = forms.CompleteBuildForm - + ajax_form_title = _('Complete Build Order') ajax_template_name = 'build/complete.html' @@ -437,9 +437,9 @@ class BuildOutputComplete(AjaxUpdateView): context_object_name = "build" ajax_form_title = _("Complete Build Output") ajax_template_name = "build/complete_output.html" - + def get_form(self): - + build = self.get_object() form = super().get_form() @@ -500,7 +500,7 @@ class BuildOutputComplete(AjaxUpdateView): - If the part being built has a default location, pre-select that location """ - + initials = super().get_initial() build = self.get_object() @@ -585,7 +585,7 @@ class BuildOutputComplete(AjaxUpdateView): location=location, status=stock_status, ) - + def get_data(self): """ Provide feedback data back to the form """ return { @@ -600,7 +600,7 @@ class BuildNotes(InvenTreeRoleMixin, UpdateView): context_object_name = 'build' template_name = 'build/notes.html' model = Build - + # Override the default permission role for this View role_required = 'build.view' @@ -612,7 +612,7 @@ class BuildNotes(InvenTreeRoleMixin, UpdateView): def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) - + ctx['editing'] = str2bool(self.request.GET.get('edit', '')) return ctx @@ -746,7 +746,7 @@ class BuildCreate(AjaxCreateView): class BuildUpdate(AjaxUpdateView): """ View for editing a Build object """ - + model = Build form_class = forms.EditBuildForm context_object_name = 'build' @@ -804,7 +804,7 @@ class BuildItemDelete(AjaxDeleteView): ajax_template_name = 'build/delete_build_item.html' ajax_form_title = _('Unallocate Stock') context_object_name = 'item' - + def get_data(self): return { 'danger': _('Removed parts from build allocation') @@ -826,7 +826,7 @@ class BuildItemCreate(AjaxCreateView): # The "part" which is being allocated to the output part = None - + available_stock = None def get_context_data(self): @@ -906,7 +906,7 @@ class BuildItemCreate(AjaxCreateView): if part_id: try: self.part = Part.objects.get(pk=part_id) - + except (ValueError, Part.DoesNotExist): pass @@ -958,7 +958,7 @@ class BuildItemCreate(AjaxCreateView): # Reference to a StockItem object item = None - + # Reference to a Build object build = None @@ -999,7 +999,7 @@ class BuildItemCreate(AjaxCreateView): quantity = float(quantity) elif required_quantity is not None: quantity = required_quantity - + item_id = self.get_param('item') # If the request specifies a particular StockItem @@ -1035,7 +1035,7 @@ class BuildItemEdit(AjaxUpdateView): ajax_template_name = 'build/edit_build_item.html' form_class = forms.EditBuildItemForm ajax_form_title = _('Edit Stock Allocation') - + def get_data(self): return { 'info': _('Updated Build Item'), @@ -1068,7 +1068,7 @@ class BuildAttachmentCreate(AjaxCreateView): model = BuildOrderAttachment form_class = forms.EditBuildAttachmentForm ajax_form_title = _('Add Build Order Attachment') - + def save(self, form, **kwargs): """ Add information on the user that uploaded the attachment @@ -1105,7 +1105,7 @@ class BuildAttachmentCreate(AjaxCreateView): form = super().get_form() form.fields['build'].widget = HiddenInput() - + return form diff --git a/InvenTree/common/admin.py b/InvenTree/common/admin.py index 3edcd1fa8d..c2da1ddd63 100644 --- a/InvenTree/common/admin.py +++ b/InvenTree/common/admin.py @@ -9,7 +9,7 @@ from .models import InvenTreeSetting class SettingsAdmin(ImportExportModelAdmin): - + list_display = ('key', 'value') diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index bc2ca4214b..356e58e8e9 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -40,7 +40,7 @@ class InvenTreeSetting(models.Model): The key of each item is the name of the value as it appears in the database. Each global setting has the following parameters: - + - name: Translatable string name of the setting (required) - description: Translatable string description of the setting (required) - default: Default value (optional) @@ -412,7 +412,7 @@ class InvenTreeSetting(models.Model): # Evaluate the function (we expect it will return a list of tuples...) return choices() """ - + return choices @classmethod @@ -522,7 +522,7 @@ class InvenTreeSetting(models.Model): # Enforce standard boolean representation if setting.is_bool(): value = InvenTree.helpers.str2bool(value) - + setting.value = str(value) setting.save() @@ -664,7 +664,7 @@ class InvenTreeSetting(models.Model): if validator == int: return True - + if type(validator) in [list, tuple]: for v in validator: if v == int: @@ -675,7 +675,7 @@ class InvenTreeSetting(models.Model): def as_int(self): """ Return the value of this setting converted to a boolean value. - + If an error occurs, return the default value """ @@ -685,7 +685,7 @@ class InvenTreeSetting(models.Model): value = self.default_value() return value - + class PriceBreak(models.Model): """ diff --git a/InvenTree/common/settings.py b/InvenTree/common/settings.py index 134d3f3f7c..4d98bc495b 100644 --- a/InvenTree/common/settings.py +++ b/InvenTree/common/settings.py @@ -19,7 +19,7 @@ def currency_code_default(): if code not in CURRENCIES: code = 'USD' - + return code diff --git a/InvenTree/common/test_views.py b/InvenTree/common/test_views.py index 0cd902d083..8dc5830108 100644 --- a/InvenTree/common/test_views.py +++ b/InvenTree/common/test_views.py @@ -117,7 +117,7 @@ class SettingsViewTest(TestCase): """ Test for binary value """ - + setting = InvenTreeSetting.get_setting_object('PART_COMPONENT') self.assertTrue(setting.as_bool()) diff --git a/InvenTree/common/tests.py b/InvenTree/common/tests.py index d8777785f9..d20f76baa0 100644 --- a/InvenTree/common/tests.py +++ b/InvenTree/common/tests.py @@ -19,7 +19,7 @@ class SettingsTest(TestCase): 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() diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index 31d11e30cc..8cc344c9ab 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -48,7 +48,7 @@ class SettingEdit(AjaxUpdateView): """ form = super().get_form() - + setting = self.get_object() choices = setting.choices() diff --git a/InvenTree/company/api.py b/InvenTree/company/api.py index 494b3652b2..ff8b6d667b 100644 --- a/InvenTree/company/api.py +++ b/InvenTree/company/api.py @@ -41,7 +41,7 @@ class CompanyList(generics.ListCreateAPIView): queryset = CompanySerializer.annotate_queryset(queryset) return queryset - + filter_backends = [ DjangoFilterBackend, filters.SearchFilter, @@ -116,7 +116,7 @@ class ManufacturerPartList(generics.ListCreateAPIView): kwargs['pretty'] = str2bool(self.request.query_params.get('pretty', None)) except AttributeError: pass - + kwargs['context'] = self.get_serializer_context() return self.serializer_class(*args, **kwargs) @@ -167,7 +167,7 @@ class ManufacturerPartList(generics.ListCreateAPIView): 'part__name', 'part__description', ] - + class ManufacturerPartDetail(generics.RetrieveUpdateDestroyAPIView): """ API endpoint for detail view of ManufacturerPart object @@ -255,7 +255,7 @@ class SupplierPartList(generics.ListCreateAPIView): kwargs['part_detail'] = str2bool(self.request.query_params.get('part_detail', None)) except AttributeError: pass - + try: kwargs['supplier_detail'] = str2bool(self.request.query_params.get('supplier_detail', None)) except AttributeError: @@ -270,7 +270,7 @@ class SupplierPartList(generics.ListCreateAPIView): kwargs['pretty'] = str2bool(self.request.query_params.get('pretty', None)) except AttributeError: pass - + kwargs['context'] = self.get_serializer_context() return self.serializer_class(*args, **kwargs) diff --git a/InvenTree/company/forms.py b/InvenTree/company/forms.py index 8ad8c6bfea..62a46fcd6f 100644 --- a/InvenTree/company/forms.py +++ b/InvenTree/company/forms.py @@ -158,7 +158,7 @@ class EditSupplierPartForm(HelperForm): empty_choice = [('', '----------')] manufacturers = [(manufacturer.id, manufacturer.name) for manufacturer in Company.objects.filter(is_manufacturer=True)] - + return empty_choice + manufacturers def __init__(self, *args, **kwargs): diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py index 89a3f6c9bf..8b6a45556e 100644 --- a/InvenTree/company/models.py +++ b/InvenTree/company/models.py @@ -152,7 +152,7 @@ class Company(models.Model): def currency_code(self): """ Return the currency code associated with this company. - + - If the currency code is invalid, use the default currency - If the currency code is not specified, use the default currency """ @@ -187,7 +187,7 @@ class Company(models.Model): return getMediaUrl(self.image.thumbnail.url) else: return getBlankThumbnail() - + @property def manufactured_part_count(self): """ The number of parts manufactured by this company """ @@ -302,7 +302,7 @@ class ManufacturerPart(models.Model): class Meta: unique_together = ('part', 'manufacturer', 'MPN') - + part = models.ForeignKey('part.Part', on_delete=models.CASCADE, related_name='manufacturer_parts', verbose_name=_('Base Part'), @@ -311,7 +311,7 @@ class ManufacturerPart(models.Model): }, help_text=_('Select part'), ) - + manufacturer = models.ForeignKey( Company, on_delete=models.CASCADE, @@ -359,7 +359,7 @@ class ManufacturerPart(models.Model): if not manufacturer_part: manufacturer_part = ManufacturerPart(part=part, manufacturer=manufacturer, MPN=mpn, description=description, link=link) manufacturer_part.save() - + return manufacturer_part def __str__(self): @@ -414,7 +414,7 @@ class SupplierPart(models.Model): MPN = kwargs.pop('MPN') else: MPN = None - + if manufacturer or MPN: if not self.manufacturer_part: # Create ManufacturerPart @@ -429,7 +429,7 @@ class SupplierPart(models.Model): manufacturer_part_id = self.manufacturer_part.id except AttributeError: manufacturer_part_id = None - + if manufacturer_part_id: try: (manufacturer_part, created) = ManufacturerPart.objects.update_or_create(part=self.part, @@ -504,7 +504,7 @@ class SupplierPart(models.Model): base_cost = models.DecimalField(max_digits=10, decimal_places=3, default=0, validators=[MinValueValidator(0)], verbose_name=_('base cost'), help_text=_('Minimum charge (e.g. stocking fee)')) packaging = models.CharField(max_length=50, blank=True, null=True, verbose_name=_('Packaging'), help_text=_('Part packaging')) - + multiple = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1)], verbose_name=_('multiple'), help_text=_('Order multiple')) # TODO - Reimplement lead-time as a charfield with special validation (pattern matching). @@ -613,7 +613,7 @@ class SupplierPart(models.Model): pb_cost = pb_min.convert_to(currency) # Trigger cost calculation using smallest price break pb_found = True - + # Convert quantity to decimal.Decimal format quantity = decimal.Decimal(f'{quantity}') @@ -669,7 +669,7 @@ class SupplierPart(models.Model): if self.manufacturer_string: s = s + ' | ' + self.manufacturer_string - + return s diff --git a/InvenTree/company/serializers.py b/InvenTree/company/serializers.py index 335a351583..4b1019656e 100644 --- a/InvenTree/company/serializers.py +++ b/InvenTree/company/serializers.py @@ -51,7 +51,7 @@ class CompanySerializer(InvenTreeModelSerializer): return queryset url = serializers.CharField(source='get_absolute_url', read_only=True) - + image = serializers.CharField(source='get_thumbnail_url', read_only=True) parts_supplied = serializers.IntegerField(read_only=True) @@ -157,9 +157,9 @@ class SupplierPartSerializer(InvenTreeModelSerializer): self.fields.pop('pretty_name') supplier = serializers.PrimaryKeyRelatedField(queryset=Company.objects.filter(is_supplier=True)) - + manufacturer = serializers.PrimaryKeyRelatedField(source='manufacturer_part.manufacturer', read_only=True) - + MPN = serializers.StringRelatedField(source='manufacturer_part.MPN') manufacturer_part = ManufacturerPartSerializer(read_only=True) diff --git a/InvenTree/company/test_migrations.py b/InvenTree/company/test_migrations.py index bf6e212f7a..882d54260f 100644 --- a/InvenTree/company/test_migrations.py +++ b/InvenTree/company/test_migrations.py @@ -48,7 +48,7 @@ class TestManufacturerField(MigratorTestCase): - Company object (supplier) - SupplierPart object """ - + Part = self.old_state.apps.get_model('part', 'part') Company = self.old_state.apps.get_model('company', 'company') SupplierPart = self.old_state.apps.get_model('company', 'supplierpart') @@ -123,7 +123,7 @@ class TestManufacturerPart(MigratorTestCase): - Company object (supplier) - SupplierPart object """ - + Part = self.old_state.apps.get_model('part', 'part') Company = self.old_state.apps.get_model('company', 'company') SupplierPart = self.old_state.apps.get_model('company', 'supplierpart') @@ -220,7 +220,7 @@ class TestManufacturerPart(MigratorTestCase): # Check on the SupplierPart objects SupplierPart = self.new_state.apps.get_model('company', 'supplierpart') - + supplier_parts = SupplierPart.objects.all() self.assertEqual(supplier_parts.count(), 6) @@ -229,10 +229,10 @@ class TestManufacturerPart(MigratorTestCase): # Check on the ManufacturerPart objects ManufacturerPart = self.new_state.apps.get_model('company', 'manufacturerpart') - + manufacturer_parts = ManufacturerPart.objects.all() self.assertEqual(manufacturer_parts.count(), 4) - + manufacturer_part = manufacturer_parts.first() self.assertEqual(manufacturer_part.MPN, 'MUR-CAP-123456') @@ -293,7 +293,7 @@ class TestCurrencyMigration(MigratorTestCase): self.assertIsNone(pb.price) def test_currency_migration(self): - + PB = self.new_state.apps.get_model('company', 'supplierpricebreak') for pb in PB.objects.all(): diff --git a/InvenTree/company/test_views.py b/InvenTree/company/test_views.py index e6eb54e0bf..cdb2d32af9 100644 --- a/InvenTree/company/test_views.py +++ b/InvenTree/company/test_views.py @@ -30,7 +30,7 @@ class CompanyViewTestBase(TestCase): # Create a user user = get_user_model() - + self.user = user.objects.create_user( username='username', email='user@email.com', @@ -83,7 +83,7 @@ class SupplierPartViewTests(CompanyViewTestBase): def test_supplier_part_create(self): """ Test the SupplierPartCreate view. - + This view allows some additional functionality, specifically it allows the user to create a single-quantity price break automatically, when saving the new SupplierPart model. @@ -171,7 +171,7 @@ class SupplierPartViewTests(CompanyViewTestBase): 'confirm_delete': True }, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - + self.assertEqual(response.status_code, 200) self.assertEqual(n - 2, SupplierPart.objects.count()) @@ -213,7 +213,7 @@ class ManufacturerPartViewTests(CompanyViewTestBase): """ Test the ManufacturerPartCreate view. """ - + url = reverse('manufacturer-part-create') # First check that we can GET the form @@ -252,7 +252,7 @@ class ManufacturerPartViewTests(CompanyViewTestBase): """ Test that the SupplierPartCreate view creates Manufacturer Part. """ - + url = reverse('supplier-part-create') # First check that we can GET the form @@ -297,7 +297,7 @@ class ManufacturerPartViewTests(CompanyViewTestBase): 'confirm_delete': True }, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - + self.assertEqual(response.status_code, 200) # Check that the ManufacturerPart was deleted diff --git a/InvenTree/company/tests.py b/InvenTree/company/tests.py index ec56503815..5dd3bf81ab 100644 --- a/InvenTree/company/tests.py +++ b/InvenTree/company/tests.py @@ -71,7 +71,7 @@ class CompanySimpleTest(TestCase): acme = Company.objects.get(pk=1) appel = Company.objects.get(pk=2) zerg = Company.objects.get(pk=3) - + self.assertTrue(acme.has_parts) self.assertEqual(acme.supplied_part_count, 4) @@ -82,7 +82,7 @@ class CompanySimpleTest(TestCase): self.assertEqual(zerg.supplied_part_count, 2) def test_price_breaks(self): - + self.assertTrue(self.acme0001.has_price_breaks) self.assertTrue(self.acme0002.has_price_breaks) self.assertTrue(self.zergm312.has_price_breaks) @@ -121,7 +121,7 @@ class CompanySimpleTest(TestCase): pmin, pmax = m2x4.get_price_range(5) self.assertEqual(pmin, 35) self.assertEqual(pmax, 37.5) - + m3x12 = Part.objects.get(name='M3x12 SHCS') self.assertEqual(m3x12.get_price_info(0.3), Decimal('2.4')) @@ -187,14 +187,14 @@ class ManufacturerPartSimpleTest(TestCase): # Create a manufacturer part self.part = Part.objects.get(pk=1) manufacturer = Company.objects.get(pk=1) - + self.mp = ManufacturerPart.create( part=self.part, manufacturer=manufacturer, mpn='PART_NUMBER', description='THIS IS A MANUFACTURER PART', ) - + # Create a supplier part supplier = Company.objects.get(pk=5) supplier_part = SupplierPart.objects.create( diff --git a/InvenTree/company/urls.py b/InvenTree/company/urls.py index b87b0626ae..11f1be5339 100644 --- a/InvenTree/company/urls.py +++ b/InvenTree/company/urls.py @@ -55,7 +55,7 @@ price_break_urls = [ manufacturer_part_detail_urls = [ url(r'^edit/?', views.ManufacturerPartEdit.as_view(), name='manufacturer-part-edit'), - + url(r'^suppliers/', views.ManufacturerPartDetail.as_view(template_name='company/manufacturer_part_suppliers.html'), name='manufacturer-part-suppliers'), url('^.*$', views.ManufacturerPartDetail.as_view(template_name='company/manufacturer_part_suppliers.html'), name='manufacturer-part-detail'), diff --git a/InvenTree/company/views.py b/InvenTree/company/views.py index be7d326c36..120832a31c 100644 --- a/InvenTree/company/views.py +++ b/InvenTree/company/views.py @@ -96,7 +96,7 @@ class CompanyIndex(InvenTreeRoleMixin, ListView): if self.request.path == item: context = lookup[item] break - + if context is None: context = default @@ -279,7 +279,7 @@ class CompanyCreate(AjaxCreateView): if url == reverse('supplier-create'): return _("Create new Supplier") - + if url == reverse('manufacturer-create'): return _('Create new Manufacturer') @@ -298,7 +298,7 @@ class CompanyCreate(AjaxCreateView): initials['is_supplier'] = True initials['is_customer'] = False initials['is_manufacturer'] = False - + elif url == reverse('manufacturer-create'): initials['is_manufacturer'] = True initials['is_supplier'] = True @@ -319,7 +319,7 @@ class CompanyCreate(AjaxCreateView): class CompanyDelete(AjaxDeleteView): """ View for deleting a Company object """ - + model = Company success_url = '/company/' ajax_template_name = 'company/delete.html' @@ -415,7 +415,7 @@ class ManufacturerPartCreate(AjaxCreateView): initials['manufacturer'] = Company.objects.get(pk=manufacturer_id) except (ValueError, Company.DoesNotExist): pass - + if part_id: try: initials['part'] = Part.objects.get(pk=part_id) @@ -427,7 +427,7 @@ class ManufacturerPartCreate(AjaxCreateView): class ManufacturerPartDelete(AjaxDeleteView): """ Delete view for removing a ManufacturerPart. - + ManufacturerParts can be deleted using a variety of 'selectors'. - ?part= -> Delete a single ManufacturerPart object @@ -561,7 +561,7 @@ class SupplierPartEdit(AjaxUpdateView): initials = super(SupplierPartEdit, self).get_initial().copy() supplier_part = self.get_object() - + if supplier_part.manufacturer_part: initials['manufacturer'] = supplier_part.manufacturer_part.manufacturer.id initials['MPN'] = supplier_part.manufacturer_part.MPN @@ -686,7 +686,7 @@ class SupplierPartCreate(AjaxCreateView): initials['MPN'] = manufacturer_part_obj.MPN except (ValueError, ManufacturerPart.DoesNotExist, Part.DoesNotExist, Company.DoesNotExist): pass - + if part_id: try: initials['part'] = Part.objects.get(pk=part_id) @@ -703,13 +703,13 @@ class SupplierPartCreate(AjaxCreateView): if currency_code: initials['single_pricing'] = ('', currency) - + return initials class SupplierPartDelete(AjaxDeleteView): """ Delete view for removing a SupplierPart. - + SupplierParts can be deleted using a variety of 'selectors'. - ?part= -> Delete a single SupplierPart object @@ -840,7 +840,7 @@ class PriceBreakCreate(AjaxCreateView): # Extract the currency object associated with the code currency = CURRENCIES.get(currency_code, None) - + if currency: initials['price'] = [1.0, currency] diff --git a/InvenTree/label/api.py b/InvenTree/label/api.py index 0d0d71b50d..fc082e4a50 100644 --- a/InvenTree/label/api.py +++ b/InvenTree/label/api.py @@ -159,7 +159,7 @@ class StockItemLabelList(LabelListView, StockItemLabelMixin): """ Filter the StockItem label queryset. """ - + queryset = super().filter_queryset(queryset) # List of StockItem objects to match against @@ -178,7 +178,7 @@ class StockItemLabelList(LabelListView, StockItemLabelMixin): # Keep track of which labels match every specified stockitem valid_label_ids = set() - + for label in queryset.all(): matches = True @@ -293,7 +293,7 @@ class StockLocationLabelList(LabelListView, StockLocationLabelMixin): """ queryset = super().filter_queryset(queryset) - + # List of StockLocation objects to match against locations = self.get_locations() diff --git a/InvenTree/label/apps.py b/InvenTree/label/apps.py index 2b99921703..e51767d5f0 100644 --- a/InvenTree/label/apps.py +++ b/InvenTree/label/apps.py @@ -139,7 +139,7 @@ class LabelConfig(AppConfig): except: # Database might not yet be ready return - + src_dir = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'templates', diff --git a/InvenTree/label/models.py b/InvenTree/label/models.py index 5c1b104670..71ccc73ac9 100644 --- a/InvenTree/label/models.py +++ b/InvenTree/label/models.py @@ -44,7 +44,7 @@ def rename_label(instance, filename): def validate_stock_item_filters(filters): - + filters = validateFilterString(filters, model=stock.models.StockItem) return filters @@ -82,7 +82,7 @@ class LabelTemplate(models.Model): # Each class of label files will be stored in a separate subdirectory SUBDIR = "label" - + # Object we will be printing against (will be filled out later) object_to_print = None diff --git a/InvenTree/label/test_api.py b/InvenTree/label/test_api.py index 92e7733891..af4c0782ec 100644 --- a/InvenTree/label/test_api.py +++ b/InvenTree/label/test_api.py @@ -40,7 +40,7 @@ class TestReportTests(InvenTreeAPITestCase): return response.data def test_list(self): - + response = self.do_list() # TODO - Add some report templates to the fixtures diff --git a/InvenTree/order/forms.py b/InvenTree/order/forms.py index 4c9caf3b53..e7336f5b0d 100644 --- a/InvenTree/order/forms.py +++ b/InvenTree/order/forms.py @@ -64,7 +64,7 @@ class CancelSalesOrderForm(HelperForm): fields = [ 'confirm', ] - + class ShipSalesOrderForm(HelperForm): diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index d3b09dec1e..97e69cf562 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -309,7 +309,7 @@ class PurchaseOrder(Order): """ A PurchaseOrder can only be cancelled under the following circumstances: """ - + return self.status in [ PurchaseOrderStatus.PLACED, PurchaseOrderStatus.PENDING @@ -378,7 +378,7 @@ class PurchaseOrder(Order): # Has this order been completed? if len(self.pending_line_items()) == 0: - + self.received_by = user self.complete_order() # This will save the model @@ -419,7 +419,7 @@ class SalesOrder(Order): except (ValueError, TypeError): # Date processing error, return queryset unchanged return queryset - + # Construct a queryset for "completed" orders within the range completed = Q(status__in=SalesOrderStatus.COMPLETE) & Q(shipment_date__gte=min_date) & Q(shipment_date__lte=max_date) @@ -495,7 +495,7 @@ class SalesOrder(Order): for line in self.lines.all(): if not line.is_fully_allocated(): return False - + return True def is_over_allocated(self): @@ -590,11 +590,11 @@ class SalesOrderAttachment(InvenTreeAttachment): class OrderLineItem(models.Model): """ Abstract model for an order line item - + Attributes: quantity: Number of items note: Annotation for the item - + """ class Meta: @@ -603,13 +603,13 @@ class OrderLineItem(models.Model): quantity = RoundingDecimalField(max_digits=15, decimal_places=5, validators=[MinValueValidator(0)], default=1, verbose_name=_('Quantity'), help_text=_('Item quantity')) reference = models.CharField(max_length=100, blank=True, verbose_name=_('Reference'), help_text=_('Line item reference')) - + notes = models.CharField(max_length=500, blank=True, verbose_name=_('Notes'), help_text=_('Line item notes')) class PurchaseOrderLineItem(OrderLineItem): """ Model for a purchase order line item. - + Attributes: order: Reference to a PurchaseOrder object @@ -637,7 +637,7 @@ class PurchaseOrderLineItem(OrderLineItem): def get_base_part(self): """ Return the base-part for the line item """ return self.part.part - + # TODO - Function callback for when the SupplierPart is deleted? part = models.ForeignKey( diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index a04798c303..cd2dca828f 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -61,7 +61,7 @@ class POSerializer(InvenTreeModelSerializer): return queryset supplier_detail = CompanyBriefSerializer(source='supplier', many=False, read_only=True) - + line_items = serializers.IntegerField(read_only=True) status_text = serializers.CharField(source='get_status_display', read_only=True) @@ -70,7 +70,7 @@ class POSerializer(InvenTreeModelSerializer): class Meta: model = PurchaseOrder - + fields = [ 'pk', 'issue_date', @@ -89,7 +89,7 @@ class POSerializer(InvenTreeModelSerializer): 'target_date', 'notes', ] - + read_only_fields = [ 'reference', 'status' @@ -110,10 +110,10 @@ class POLineItemSerializer(InvenTreeModelSerializer): quantity = serializers.FloatField() received = serializers.FloatField() - + part_detail = PartBriefSerializer(source='get_base_part', many=False, read_only=True) supplier_part_detail = SupplierPartSerializer(source='part', many=False, read_only=True) - + purchase_price_string = serializers.CharField(source='purchase_price', read_only=True) class Meta: @@ -144,7 +144,7 @@ class POAttachmentSerializer(InvenTreeModelSerializer): class Meta: model = PurchaseOrderAttachment - + fields = [ 'pk', 'order', @@ -270,7 +270,7 @@ class SOLineItemSerializer(InvenTreeModelSerializer): if allocations is not True: self.fields.pop('allocations') - + order_detail = SalesOrderSerializer(source='order', many=False, read_only=True) part_detail = PartBriefSerializer(source='part', many=False, read_only=True) allocations = SalesOrderAllocationSerializer(many=True, read_only=True) @@ -306,7 +306,7 @@ class SOAttachmentSerializer(InvenTreeModelSerializer): class Meta: model = SalesOrderAttachment - + fields = [ 'pk', 'order', diff --git a/InvenTree/order/test_api.py b/InvenTree/order/test_api.py index cb92b8b384..0ef63e485a 100644 --- a/InvenTree/order/test_api.py +++ b/InvenTree/order/test_api.py @@ -94,7 +94,7 @@ class PurchaseOrderTest(OrderTest): url = '/api/order/po/1/' response = self.get(url) - + self.assertEqual(response.status_code, 200) data = response.data @@ -109,7 +109,7 @@ class PurchaseOrderTest(OrderTest): response = self.get(url) self.assertEqual(response.status_code, status.HTTP_200_OK) - + class SalesOrderTest(OrderTest): """ diff --git a/InvenTree/order/test_sales_order.py b/InvenTree/order/test_sales_order.py index 0b37b96409..8337ff4b57 100644 --- a/InvenTree/order/test_sales_order.py +++ b/InvenTree/order/test_sales_order.py @@ -73,7 +73,7 @@ class SalesOrderTest(TestCase): def test_add_duplicate_line_item(self): # Adding a duplicate line item to a SalesOrder is accepted - + for ii in range(1, 5): SalesOrderLineItem.objects.create(order=self.order, part=self.part, quantity=ii) @@ -107,7 +107,7 @@ class SalesOrderTest(TestCase): self.assertTrue(self.order.is_fully_allocated()) self.assertTrue(self.line.is_fully_allocated()) self.assertEqual(self.line.allocated_quantity(), 50) - + def test_order_cancel(self): # Allocate line items then cancel the order @@ -154,7 +154,7 @@ class SalesOrderTest(TestCase): for item in outputs.all(): self.assertEqual(item.quantity, 25) - + self.assertEqual(sa.sales_order, None) self.assertEqual(sb.sales_order, None) @@ -162,7 +162,7 @@ class SalesOrderTest(TestCase): self.assertEqual(SalesOrderAllocation.objects.count(), 0) self.assertEqual(self.order.status, status.SalesOrderStatus.SHIPPED) - + self.assertTrue(self.order.is_fully_allocated()) self.assertTrue(self.line.is_fully_allocated()) self.assertEqual(self.line.fulfilled_quantity(), 50) diff --git a/InvenTree/order/test_views.py b/InvenTree/order/test_views.py index 51981af105..23122d079d 100644 --- a/InvenTree/order/test_views.py +++ b/InvenTree/order/test_views.py @@ -17,7 +17,7 @@ import json class OrderViewTestCase(TestCase): - + fixtures = [ 'category', 'part', @@ -193,7 +193,7 @@ class POTests(OrderViewTestCase): # Test without confirmation response = self.client.post(url, {'confirm': 0}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertEqual(response.status_code, 200) - + data = json.loads(response.content) self.assertFalse(data['form_valid']) @@ -221,7 +221,7 @@ class POTests(OrderViewTestCase): # GET the form (pass the correct info) response = self.client.get(url, {'order': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - + post_data = { 'part': 100, 'quantity': 45, @@ -303,7 +303,7 @@ class TestPOReceive(OrderViewTestCase): self.client.get(self.url, data, HTTP_X_REQUESTED_WITH='XMLHttpRequest') def test_receive_lines(self): - + post_data = { } @@ -330,7 +330,7 @@ class TestPOReceive(OrderViewTestCase): # Receive negative number post_data['line-1'] = -100 - + self.post(post_data, validate=False) # Receive 75 items diff --git a/InvenTree/order/tests.py b/InvenTree/order/tests.py index ed6a4ebb6a..1f35e54fb5 100644 --- a/InvenTree/order/tests.py +++ b/InvenTree/order/tests.py @@ -36,7 +36,7 @@ class OrderTest(TestCase): self.assertEqual(order.get_absolute_url(), '/order/purchase-order/1/') self.assertEqual(str(order), 'PO0001 - ACME') - + line = PurchaseOrderLineItem.objects.get(pk=1) self.assertEqual(str(line), "100 x ACME0001 from ACME (for PO0001 - ACME)") @@ -113,7 +113,7 @@ class OrderTest(TestCase): # Try to order a supplier part from the wrong supplier sku = SupplierPart.objects.get(SKU='ZERG-WIDGET') - + with self.assertRaises(django_exceptions.ValidationError): order.add_line_item(sku, 99) @@ -153,7 +153,7 @@ class OrderTest(TestCase): with self.assertRaises(django_exceptions.ValidationError): order.receive_line_item(line, loc, 'not a number', user=None) - + # Receive the rest of the items order.receive_line_item(line, loc, 50, user=None) diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index c62a3816d5..154b5ebd9c 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -152,7 +152,7 @@ class SalesOrderAttachmentCreate(AjaxCreateView): """ Save the user that uploaded the attachment """ - + attachment = form.save(commit=False) attachment.user = self.request.user attachment.save() @@ -330,7 +330,7 @@ class PurchaseOrderCreate(AjaxCreateView): order = form.save(commit=False) order.created_by = self.request.user - + return super().save(form) @@ -365,7 +365,7 @@ class SalesOrderCreate(AjaxCreateView): order = form.save(commit=False) order.created_by = self.request.user - + return super().save(form) @@ -414,7 +414,7 @@ class PurchaseOrderCancel(AjaxUpdateView): form_class = order_forms.CancelPurchaseOrderForm def validate(self, order, form, **kwargs): - + confirm = str2bool(form.cleaned_data.get('confirm', False)) if not confirm: @@ -536,11 +536,11 @@ class SalesOrderShip(AjaxUpdateView): order = self.get_object() self.object = order - + form = self.get_form() confirm = str2bool(request.POST.get('confirm', False)) - + valid = False if not confirm: @@ -823,7 +823,7 @@ class OrderParts(AjaxView): for supplier in self.suppliers: supplier.order_items = [] - + suppliers[supplier.name] = supplier for part in self.parts: @@ -844,9 +844,9 @@ class OrderParts(AjaxView): supplier.selected_purchase_order = orders.first().id else: supplier.selected_purchase_order = None - + suppliers[supplier.name] = supplier - + suppliers[supplier.name].order_items.append(part) self.suppliers = [suppliers[key] for key in suppliers.keys()] @@ -864,7 +864,7 @@ class OrderParts(AjaxView): if 'stock[]' in self.request.GET: stock_id_list = self.request.GET.getlist('stock[]') - + """ Get a list of all the parts associated with the stock items. - Base part must be purchaseable. - Return a set of corresponding Part IDs @@ -907,7 +907,7 @@ class OrderParts(AjaxView): parts = build.required_parts for part in parts: - + # If ordering from a Build page, ignore parts that we have enough of if part.quantity_to_order <= 0: continue @@ -963,19 +963,19 @@ class OrderParts(AjaxView): # Extract part information from the form for item in self.request.POST: - + if item.startswith('part-supplier-'): - + pk = item.replace('part-supplier-', '') - + # Check that the part actually exists try: part = Part.objects.get(id=pk) except (Part.DoesNotExist, ValueError): continue - + supplier_part_id = self.request.POST[item] - + quantity = self.request.POST.get('part-quantity-' + str(pk), 0) # Ensure a valid supplier has been passed @@ -1377,7 +1377,7 @@ class SalesOrderAssignSerials(AjaxView, FormMixin): self.form.fields['line'].widget = HiddenInput() else: self.form.add_error('line', _('Select line item')) - + if self.part: self.form.fields['part'].widget = HiddenInput() else: @@ -1412,7 +1412,7 @@ class SalesOrderAssignSerials(AjaxView, FormMixin): continue # Now we have a valid stock item - but can it be added to the sales order? - + # If not in stock, cannot be added to the order if not stock_item.in_stock: self.form.add_error( @@ -1480,7 +1480,7 @@ class SalesOrderAllocationCreate(AjaxCreateView): model = SalesOrderAllocation form_class = order_forms.CreateSalesOrderAllocationForm ajax_form_title = _('Allocate Stock to Order') - + def get_initial(self): initials = super().get_initial().copy() @@ -1495,10 +1495,10 @@ class SalesOrderAllocationCreate(AjaxCreateView): items = StockItem.objects.filter(part=line.part) quantity = line.quantity - line.allocated_quantity() - + if quantity < 0: quantity = 0 - + if items.count() == 1: item = items.first() initials['item'] = item @@ -1514,7 +1514,7 @@ class SalesOrderAllocationCreate(AjaxCreateView): return initials def get_form(self): - + form = super().get_form() line_id = form['line'].value() @@ -1542,10 +1542,10 @@ class SalesOrderAllocationCreate(AjaxCreateView): # Hide the 'line' field form.fields['line'].widget = HiddenInput() - + except (ValueError, SalesOrderLineItem.DoesNotExist): pass - + return form @@ -1554,7 +1554,7 @@ class SalesOrderAllocationEdit(AjaxUpdateView): model = SalesOrderAllocation form_class = order_forms.EditSalesOrderAllocationForm ajax_form_title = _('Edit Allocation Quantity') - + def get_form(self): form = super().get_form() diff --git a/InvenTree/part/admin.py b/InvenTree/part/admin.py index af2f615803..3945b56d7c 100644 --- a/InvenTree/part/admin.py +++ b/InvenTree/part/admin.py @@ -25,13 +25,13 @@ class PartResource(ModelResource): # ForeignKey fields category = Field(attribute='category', widget=widgets.ForeignKeyWidget(PartCategory)) - + default_location = Field(attribute='default_location', widget=widgets.ForeignKeyWidget(StockLocation)) default_supplier = Field(attribute='default_supplier', widget=widgets.ForeignKeyWidget(SupplierPart)) category_name = Field(attribute='category__name', readonly=True) - + variant_of = Field(attribute='variant_of', widget=widgets.ForeignKeyWidget(Part)) suppliers = Field(attribute='supplier_count', readonly=True) @@ -73,7 +73,7 @@ class PartResource(ModelResource): class PartAdmin(ImportExportModelAdmin): - + resource_class = PartResource list_display = ('full_name', 'description', 'total_stock', 'category') diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index 6b26365b27..de6ac5f273 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -41,7 +41,7 @@ class PartCategoryTree(TreeSerializer): model = PartCategory queryset = PartCategory.objects.all() - + @property def root_url(self): return reverse('part-index') @@ -79,7 +79,7 @@ class CategoryList(generics.ListCreateAPIView): pass # Look for top-level categories elif isNull(cat_id): - + if not cascade: queryset = queryset.filter(parent=None) @@ -166,9 +166,9 @@ class CategoryParameters(generics.ListAPIView): parent_categories = category.get_ancestors() for parent in parent_categories: category_list.append(parent.pk) - + queryset = queryset.filter(category__in=category_list) - + return queryset @@ -264,7 +264,7 @@ class PartThumbs(generics.ListAPIView): # Get all Parts which have an associated image queryset = queryset.exclude(image='') - + return queryset def list(self, request, *args, **kwargs): @@ -301,7 +301,7 @@ class PartDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Part.objects.all() serializer_class = part_serializers.PartSerializer - + starred_parts = None def get_queryset(self, *args, **kwargs): @@ -482,7 +482,7 @@ class PartList(generics.ListCreateAPIView): def get_queryset(self, *args, **kwargs): queryset = super().get_queryset(*args, **kwargs) - + queryset = part_serializers.PartSerializer.prefetch_queryset(queryset) queryset = part_serializers.PartSerializer.annotate_queryset(queryset) @@ -576,7 +576,7 @@ class PartList(generics.ListCreateAPIView): if cat_id is None: # No category filtering if category is not specified pass - + else: # Category has been specified! if isNull(cat_id): @@ -780,10 +780,10 @@ class BomList(generics.ListCreateAPIView): kwargs['sub_part_detail'] = str2bool(self.request.GET.get('sub_part_detail', None)) except AttributeError: pass - + # Ensure the request context is passed through! kwargs['context'] = self.get_serializer_context() - + return self.serializer_class(*args, **kwargs) def get_queryset(self, *args, **kwargs): @@ -867,7 +867,7 @@ class BomList(generics.ListCreateAPIView): # Work out which lines have actually been validated pks = [] - + for bom_item in queryset.all(): if bom_item.is_line_valid: pks.append(bom_item.pk) @@ -915,7 +915,7 @@ class BomItemValidate(generics.UpdateAPIView): valid = request.data.get('valid', False) instance = self.get_object() - + serializer = self.get_serializer(instance, data=request.data, partial=partial) serializer.is_valid(raise_exception=True) @@ -949,7 +949,7 @@ part_api_urls = [ url(r'^sale-price/', include([ url(r'^.*$', PartSalePriceList.as_view(), name='api-part-sale-price-list'), ])), - + # Base URL for PartParameter API endpoints url(r'^parameter/', include([ url(r'^template/$', PartParameterTemplateList.as_view(), name='api-part-param-template-list'), diff --git a/InvenTree/part/apps.py b/InvenTree/part/apps.py index 531b74442a..1b233bccac 100644 --- a/InvenTree/part/apps.py +++ b/InvenTree/part/apps.py @@ -43,7 +43,7 @@ class PartConfig(AppConfig): if part.image: url = part.image.thumbnail.name loc = os.path.join(settings.MEDIA_ROOT, url) - + if not os.path.exists(loc): logger.info("InvenTree: Generating thumbnail for Part '{p}'".format(p=part.name)) try: diff --git a/InvenTree/part/bom.py b/InvenTree/part/bom.py index b0f53c55eb..42f49f9dde 100644 --- a/InvenTree/part/bom.py +++ b/InvenTree/part/bom.py @@ -69,7 +69,7 @@ def ExportBom(part, fmt='csv', cascade=False, max_levels=None, parameter_data=Fa for item in items: item.level = str(int(level)) - + # Avoid circular BOM references if item.pk in uids: continue @@ -79,7 +79,7 @@ def ExportBom(part, fmt='csv', cascade=False, max_levels=None, parameter_data=Fa if item.sub_part.assembly: if max_levels is None or level < max_levels: add_items(item.sub_part.bom_items.all().order_by('id'), level + 1) - + if cascade: # Cascading (multi-level) BOM @@ -124,7 +124,7 @@ def ExportBom(part, fmt='csv', cascade=False, max_levels=None, parameter_data=Fa parameter_cols[name].update({b_idx: value}) except KeyError: parameter_cols[name] = {b_idx: value} - + # Add parameter columns to dataset parameter_cols_ordered = OrderedDict(sorted(parameter_cols.items(), key=lambda x: x[0])) add_columns_to_dataset(parameter_cols_ordered, len(bom_items)) @@ -185,7 +185,7 @@ def ExportBom(part, fmt='csv', cascade=False, max_levels=None, parameter_data=Fa # Filter manufacturer parts manufacturer_parts = ManufacturerPart.objects.filter(part__pk=b_part.pk) manufacturer_parts = manufacturer_parts.prefetch_related('supplier_parts') - + # Process manufacturer part for manufacturer_idx, manufacturer_part in enumerate(manufacturer_parts): @@ -250,7 +250,7 @@ def ExportBom(part, fmt='csv', cascade=False, max_levels=None, parameter_data=Fa # Filter supplier parts manufacturer_parts = ManufacturerPart.objects.filter(part__pk=b_part.pk) - + for idx, manufacturer_part in enumerate(manufacturer_parts): if manufacturer_part: @@ -295,7 +295,7 @@ def ExportBom(part, fmt='csv', cascade=False, max_levels=None, parameter_data=Fa # Filter supplier parts supplier_parts = SupplierPart.objects.filter(part__pk=b_part.pk) - + for idx, supplier_part in enumerate(supplier_parts): if supplier_part.supplier: @@ -326,7 +326,7 @@ def ExportBom(part, fmt='csv', cascade=False, max_levels=None, parameter_data=Fa filename = '{n}_BOM.{fmt}'.format(n=part.full_name, fmt=fmt) return DownloadFile(data, filename) - + class BomUploadManager: """ Class for managing an uploaded BOM file """ @@ -342,7 +342,7 @@ class BomUploadManager: 'Part_IPN', 'Part_ID', ] - + # Fields which would be helpful but are not required OPTIONAL_HEADERS = [ 'Reference', @@ -360,7 +360,7 @@ class BomUploadManager: def __init__(self, bom_file): """ Initialize the BomUpload class with a user-uploaded file object """ - + self.process(bom_file) def process(self, bom_file): @@ -387,7 +387,7 @@ class BomUploadManager: def guess_header(self, header, threshold=80): """ Try to match a header (from the file) to a list of known headers - + Args: header - Header name to look for threshold - Match threshold for fuzzy search @@ -421,7 +421,7 @@ class BomUploadManager: return matches[0]['header'] return None - + def columns(self): """ Return a list of headers for the thingy """ headers = [] diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py index 131c6aeac7..8f6e3d8898 100644 --- a/InvenTree/part/forms.py +++ b/InvenTree/part/forms.py @@ -95,11 +95,11 @@ class BomExportForm(forms.Form): parameter_data = forms.BooleanField(label=_("Include Parameter Data"), required=False, initial=False, help_text=_("Include part parameters data in exported BOM")) stock_data = forms.BooleanField(label=_("Include Stock Data"), required=False, initial=False, help_text=_("Include part stock data in exported BOM")) - + manufacturer_data = forms.BooleanField(label=_("Include Manufacturer Data"), required=False, initial=True, help_text=_("Include part manufacturer data in exported BOM")) supplier_data = forms.BooleanField(label=_("Include Supplier Data"), required=False, initial=True, help_text=_("Include part supplier data in exported BOM")) - + def get_choices(self): """ BOM export format choices """ @@ -324,7 +324,7 @@ class EditCategoryParameterTemplateForm(HelperForm): add_to_all_categories = forms.BooleanField(required=False, initial=False, help_text=_('Add parameter template to all categories')) - + class Meta: model = PartCategoryParameterTemplate fields = [ diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 137781ba2b..b3955bed24 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -349,7 +349,7 @@ class Part(MPTTModel): context['available'] = self.available_stock context['on_order'] = self.on_order - + context['required'] = context['required_build_order_quantity'] + context['required_sales_order_quantity'] context['allocated'] = context['allocated_build_order_quantity'] + context['allocated_sales_order_quantity'] @@ -434,7 +434,7 @@ class Part(MPTTModel): a) The parent part is the same as this one b) The parent part is used in the BOM for *this* part c) The parent part is used in the BOM for any child parts under this one - + Failing this check raises a ValidationError! """ @@ -506,7 +506,7 @@ class Part(MPTTModel): parts = Part.objects.filter(tree_id=self.tree_id) stock = StockModels.StockItem.objects.filter(part__in=parts).exclude(serial=None) - + # There are no matchin StockItem objects (skip further tests) if not stock.exists(): return None @@ -578,7 +578,7 @@ class Part(MPTTModel): if self.IPN: elements.append(self.IPN) - + elements.append(self.name) if self.revision: @@ -663,7 +663,7 @@ class Part(MPTTModel): def clean(self): """ Perform cleaning operations for the Part model - + Update trackable status: If this part is trackable, and it is used in the BOM for a parent part which is *not* trackable, @@ -946,7 +946,7 @@ class Part(MPTTModel): quantity = 0 for build in builds: - + bom_item = None # List the bom lines required to make the build (including inherited ones!) @@ -958,7 +958,7 @@ class Part(MPTTModel): build_quantity = build.quantity * bom_item.quantity quantity += build_quantity - + return quantity def requiring_sales_orders(self): @@ -1008,7 +1008,7 @@ class Part(MPTTModel): def quantity_to_order(self): """ Return the quantity needing to be ordered for this part. - + Here, an "order" could be one of: - Build Order - Sales Order @@ -1019,7 +1019,7 @@ class Part(MPTTModel): Required for orders = self.required_order_quantity() Currently on order = self.on_order Currently building = self.quantity_being_built - + """ # Total requirement @@ -1114,7 +1114,7 @@ class Part(MPTTModel): if total is None: total = 0 - + return max(total, 0) @property @@ -1238,7 +1238,7 @@ class Part(MPTTModel): @property def total_stock(self): """ Return the total stock quantity for this part. - + - Part may be stored in multiple locations - If this part is a "template" (variants exist) then these are counted too """ @@ -1463,7 +1463,7 @@ class Part(MPTTModel): # Start with a list of all parts designated as 'sub components' parts = Part.objects.filter(component=True) - + # Exclude this part parts = parts.exclude(id=self.id) @@ -1496,7 +1496,7 @@ class Part(MPTTModel): def get_price_info(self, quantity=1, buy=True, bom=True): """ Return a simplified pricing string for this part - + Args: quantity: Number of units to calculate price for buy: Include supplier pricing (default = True) @@ -1519,7 +1519,7 @@ class Part(MPTTModel): return "{a} - {b}".format(a=min_price, b=max_price) def get_supplier_price_range(self, quantity=1): - + min_price = None max_price = None @@ -1586,7 +1586,7 @@ class Part(MPTTModel): return (min_price, max_price) def get_price_range(self, quantity=1, buy=True, bom=True): - + """ Return the price range for this part. This price can be either: - Supplier price (if purchased from suppliers) @@ -1645,7 +1645,7 @@ class Part(MPTTModel): @transaction.atomic def copy_parameters_from(self, other, **kwargs): - + clear = kwargs.get('clear', True) if clear: @@ -1692,7 +1692,7 @@ class Part(MPTTModel): # Copy the parameters data if kwargs.get('parameters', True): self.copy_parameters_from(other) - + # Copy the fields that aren't available in the duplicate form self.salable = other.salable self.assembly = other.assembly @@ -1722,7 +1722,7 @@ class Part(MPTTModel): tests = tests.filter(required=required) return tests - + def getRequiredTests(self): # Return the tests which are required by this part return self.getTestTemplates(required=True) @@ -1868,7 +1868,7 @@ class PartAttachment(InvenTreeAttachment): """ Model for storing file attachments against a Part object """ - + def getSubdir(self): return os.path.join("part_files", str(self.part.id)) @@ -2227,7 +2227,7 @@ class BomItem(models.Model): def validate_hash(self, valid=True): """ Mark this item as 'valid' (store the checksum hash). - + Args: valid: If true, validate the hash, otherwise invalidate it (default = True) """ @@ -2265,7 +2265,7 @@ class BomItem(models.Model): # Check for circular BOM references if self.sub_part: self.sub_part.checkAddToBOM(self.part) - + # If the sub_part is 'trackable' then the 'quantity' field must be an integer if self.sub_part.trackable: if not self.quantity == int(self.quantity): @@ -2301,7 +2301,7 @@ class BomItem(models.Model): """ query = self.sub_part.stock_items.all() - + query = query.prefetch_related([ 'sub_part__stock_items', ]) @@ -2358,7 +2358,7 @@ class BomItem(models.Model): def get_required_quantity(self, build_quantity): """ Calculate the required part quantity, based on the supplier build_quantity. Includes overage estimate in the returned value. - + Args: build_quantity: Number of parts to build diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 58df62283a..7ab385249c 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -134,7 +134,7 @@ class PartBriefSerializer(InvenTreeModelSerializer): """ Serializer for Part (brief detail) """ thumbnail = serializers.CharField(source='get_thumbnail_url', read_only=True) - + stock = serializers.FloatField(source='total_stock') class Meta: @@ -232,7 +232,7 @@ class PartSerializer(InvenTreeModelSerializer): output_field=models.DecimalField(), ) ) - + # Filter to limit orders to "open" order_filter = Q( order__status__in=PurchaseOrderStatus.OPEN @@ -259,7 +259,7 @@ class PartSerializer(InvenTreeModelSerializer): output_field=models.DecimalField(), ), ) - + return queryset def get_starred(self, part): @@ -358,7 +358,7 @@ class BomItemSerializer(InvenTreeModelSerializer): quantity = serializers.FloatField() part = serializers.PrimaryKeyRelatedField(queryset=Part.objects.filter(assembly=True)) - + part_detail = PartBriefSerializer(source='part', many=False, read_only=True) sub_part = serializers.PrimaryKeyRelatedField(queryset=Part.objects.filter(component=True)) diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index 536f25cb5b..cd2313e09c 100644 --- a/InvenTree/part/templatetags/inventree_extras.py +++ b/InvenTree/part/templatetags/inventree_extras.py @@ -47,7 +47,7 @@ def str2bool(x, *args, **kwargs): def inrange(n, *args, **kwargs): """ Return range(n) for iterating through a numeric quantity """ return range(n) - + @register.simple_tag() def multiply(x, y, *args, **kwargs): @@ -59,7 +59,7 @@ def multiply(x, y, *args, **kwargs): def add(x, y, *args, **kwargs): """ Add two numbers together """ return x + y - + @register.simple_tag() def part_allocation_count(build, part, *args, **kwargs): @@ -177,7 +177,7 @@ def authorized_owners(group): except TypeError: # group.get_users returns None pass - + return owners diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index 4389003544..0f5f59d3a3 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -41,12 +41,12 @@ class PartAPITest(InvenTreeAPITestCase): Test that we can retrieve list of part categories, with various filtering options. """ - + url = reverse('api-part-category-list') - + # Request *all* part categories response = self.client.get(url, format='json') - + self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(len(response.data), 8) @@ -95,7 +95,7 @@ class PartAPITest(InvenTreeAPITestCase): url = reverse('api-part-category-list') response = self.client.post(url, data, format='json') self.assertEqual(response.status_code, status.HTTP_201_CREATED) - + parent = response.data['pk'] # Add some sub-categories to the top-level 'Animals' category @@ -289,7 +289,7 @@ class PartAPITest(InvenTreeAPITestCase): self.assertIn('count', data) self.assertIn('results', data) - + self.assertEqual(len(data['results']), n) @@ -354,7 +354,7 @@ class PartAPIAggregationTest(InvenTreeAPITestCase): self.assertEqual(data['in_stock'], 600) self.assertEqual(data['stock_item_count'], 4) - + # Add some more stock items!! for i in range(100): StockItem.objects.create(part=self.part, quantity=5) @@ -463,7 +463,7 @@ class PartParameterTest(InvenTreeAPITestCase): response = self.client.patch(url, {'data': '15'}, format='json') self.assertEqual(response.status_code, 200) - + # Check that the data changed! response = self.client.get(url, format='json') diff --git a/InvenTree/part/test_bom_item.py b/InvenTree/part/test_bom_item.py index a518ca1ddc..7e553be73a 100644 --- a/InvenTree/part/test_bom_item.py +++ b/InvenTree/part/test_bom_item.py @@ -64,7 +64,7 @@ class BomItemTest(TestCase): """ Test that BOM line overages are calculated correctly """ item = BomItem.objects.get(part=100, sub_part=50) - + q = 300 item.quantity = q @@ -77,7 +77,7 @@ class BomItemTest(TestCase): item.overage = 'asf234?' n = item.get_overage_quantity(q) self.assertEqual(n, 0) - + # Test absolute overage item.overage = '3' n = item.get_overage_quantity(q) @@ -100,7 +100,7 @@ class BomItemTest(TestCase): """ Test BOM item hash encoding """ item = BomItem.objects.get(part=100, sub_part=50) - + h1 = item.get_item_hash() # Change data - the hash must change diff --git a/InvenTree/part/test_category.py b/InvenTree/part/test_category.py index b3aa7f1202..e616fc2054 100644 --- a/InvenTree/part/test_category.py +++ b/InvenTree/part/test_category.py @@ -59,7 +59,7 @@ class CategoryTest(TestCase): def test_unique_parents(self): """ Test the 'unique_parents' functionality """ - + parents = [item.pk for item in self.transceivers.getUniqueParents()] self.assertIn(self.electronics.id, parents) @@ -128,9 +128,9 @@ class CategoryTest(TestCase): with self.assertRaises(ValidationError) as err: cat.full_clean() cat.save() - + self.assertIn('Illegal character in name', str(err.exception.error_dict.get('name'))) - + cat.name = 'good name' cat.save() diff --git a/InvenTree/part/test_migrations.py b/InvenTree/part/test_migrations.py index 41fead4b30..9da287519e 100644 --- a/InvenTree/part/test_migrations.py +++ b/InvenTree/part/test_migrations.py @@ -34,7 +34,7 @@ class TestForwardMigrations(MigratorTestCase): # Initially some fields are not present with self.assertRaises(AttributeError): print(p.has_variants) - + with self.assertRaises(AttributeError): print(p.is_template) diff --git a/InvenTree/part/test_param.py b/InvenTree/part/test_param.py index 24eee44d89..4e6556e63d 100644 --- a/InvenTree/part/test_param.py +++ b/InvenTree/part/test_param.py @@ -32,7 +32,7 @@ class TestParams(TestCase): self.assertEqual(str(c1), 'Mechanical | Length | 2.8') def test_validate(self): - + n = PartParameterTemplate.objects.all().count() t1 = PartParameterTemplate(name='abcde', units='dd') diff --git a/InvenTree/part/test_part.py b/InvenTree/part/test_part.py index 030d7faf4e..cd8726ccf4 100644 --- a/InvenTree/part/test_part.py +++ b/InvenTree/part/test_part.py @@ -91,7 +91,7 @@ class PartTest(TestCase): def test_rename_img(self): img = rename_part_image(self.r1, 'hello.png') self.assertEqual(img, os.path.join('part_images', 'hello.png')) - + def test_stock(self): # No stock of any resistors res = Part.objects.filter(description__contains='resistor') @@ -178,7 +178,7 @@ class PartSettingsTest(TestCase): Some fields for the Part model can have default values specified by the user. """ - + def setUp(self): # Create a user for auth user = get_user_model() @@ -251,7 +251,7 @@ class PartSettingsTest(TestCase): self.assertEqual(part.trackable, val) self.assertEqual(part.assembly, val) self.assertEqual(part.is_template, val) - + Part.objects.filter(pk=part.pk).delete() def test_duplicate_ipn(self): diff --git a/InvenTree/part/test_views.py b/InvenTree/part/test_views.py index 45fd39ceb0..c32753cbbb 100644 --- a/InvenTree/part/test_views.py +++ b/InvenTree/part/test_views.py @@ -9,7 +9,7 @@ from .models import Part, PartRelated class PartViewTestCase(TestCase): - + fixtures = [ 'category', 'part', @@ -24,7 +24,7 @@ class PartViewTestCase(TestCase): # Create a user user = get_user_model() - + self.user = user.objects.create_user( username='username', email='user@email.com', @@ -52,12 +52,12 @@ class PartListTest(PartViewTestCase): def test_part_index(self): response = self.client.get(reverse('part-index')) self.assertEqual(response.status_code, 200) - + keys = response.context.keys() self.assertIn('csrf_token', keys) self.assertIn('parts', keys) self.assertIn('user', keys) - + def test_export(self): """ Export part data to CSV """ @@ -153,7 +153,7 @@ class PartDetailTest(PartViewTestCase): response = self.client.get(reverse('bom-download', args=(1,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertEqual(response.status_code, 200) self.assertIn('streaming_content', dir(response)) - + class PartTests(PartViewTestCase): """ Tests for Part forms """ @@ -226,7 +226,7 @@ class PartRelatedTests(PartViewTestCase): response = self.client.post(reverse('part-related-create'), {'part_1': 1, 'part_2': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertContains(response, '"form_valid": false', status_code=200) - + # Check final count n = PartRelated.objects.all().count() self.assertEqual(n, 1) @@ -266,7 +266,7 @@ class PartQRTest(PartViewTestCase): def test_valid_part(self): response = self.client.get(reverse('part-qr', args=(1,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertEqual(response.status_code, 200) - + data = str(response.content) self.assertIn('Part QR Code', data) diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index b90b11b568..6579af019e 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -30,11 +30,11 @@ sale_price_break_urls = [ ] part_parameter_urls = [ - + url(r'^template/new/', views.PartParameterTemplateCreate.as_view(), name='part-param-template-create'), url(r'^template/(?P\d+)/edit/', views.PartParameterTemplateEdit.as_view(), name='part-param-template-edit'), url(r'^template/(?P\d+)/delete/', views.PartParameterTemplateDelete.as_view(), name='part-param-template-edit'), - + url(r'^new/', views.PartParameterCreate.as_view(), name='part-param-create'), url(r'^(?P\d+)/edit/', views.PartParameterEdit.as_view(), name='part-param-edit'), url(r'^(?P\d+)/delete/', views.PartParameterDelete.as_view(), name='part-param-delete'), @@ -49,10 +49,10 @@ part_detail_urls = [ url(r'^duplicate/', views.PartDuplicate.as_view(), name='part-duplicate'), url(r'^make-variant/', views.MakePartVariant.as_view(), name='make-part-variant'), url(r'^pricing/', views.PartPricing.as_view(), name='part-pricing'), - + url(r'^bom-upload/?', views.BomUpload.as_view(), name='upload-bom'), url(r'^bom-duplicate/?', views.BomDuplicate.as_view(), name='duplicate-bom'), - + url(r'^params/', views.PartDetail.as_view(template_name='part/params.html'), name='part-params'), url(r'^variants/?', views.PartDetail.as_view(template_name='part/variants.html'), name='part-variants'), url(r'^stock/?', views.PartDetail.as_view(template_name='part/stock.html'), name='part-stock'), @@ -70,7 +70,7 @@ part_detail_urls = [ url(r'^related-parts/?', views.PartDetail.as_view(template_name='part/related.html'), name='part-related'), url(r'^attachments/?', views.PartDetail.as_view(template_name='part/attachments.html'), name='part-attachments'), url(r'^notes/?', views.PartNotes.as_view(), name='part-notes'), - + url(r'^qr_code/?', views.PartQRCode.as_view(), name='part-qr'), # Normal thumbnail with form @@ -104,7 +104,7 @@ category_urls = [ url(r'^subcategory/', views.CategoryDetail.as_view(template_name='part/subcategory.html'), name='category-subcategory'), url(r'^parametric/', views.CategoryParametric.as_view(), name='category-parametric'), - + # Anything else url(r'^.*$', views.CategoryDetail.as_view(), name='category-detail'), ])) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index d7c68dd6a3..001a258b0f 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -204,12 +204,12 @@ class PartAttachmentCreate(AjaxCreateView): class PartAttachmentEdit(AjaxUpdateView): """ View for editing a PartAttachment object """ - + model = PartAttachment form_class = part_forms.EditPartAttachmentForm ajax_template_name = 'modal_form.html' ajax_form_title = _('Edit attachment') - + def get_data(self): return { 'success': _('Part attachment updated') @@ -245,7 +245,7 @@ class PartTestTemplateCreate(AjaxCreateView): model = PartTestTemplate form_class = part_forms.EditPartTestTemplateForm ajax_form_title = _("Create Test Template") - + def get_initial(self): initials = super().get_initial() @@ -299,7 +299,7 @@ class PartSetCategory(AjaxUpdateView): category = None parts = [] - + def get(self, request, *args, **kwargs): """ Respond to a GET request to this view """ @@ -364,7 +364,7 @@ class PartSetCategory(AjaxUpdateView): ctx['category'] = self.category return ctx - + class MakePartVariant(AjaxCreateView): """ View for creating a new variant based on an existing template Part @@ -501,17 +501,17 @@ class PartDuplicate(AjaxCreateView): valid = form.is_valid() name = request.POST.get('name', None) - + if name: matches = match_part_names(name) if len(matches) > 0: # Display the first five closest matches context['matches'] = matches[:5] - + # Enforce display of the checkbox form.fields['confirm_creation'].widget = CheckboxInput() - + # Check if the user has checked the 'confirm_creation' input confirmed = str2bool(request.POST.get('confirm_creation', False)) @@ -565,7 +565,7 @@ class PartDuplicate(AjaxCreateView): initials = super(AjaxCreateView, self).get_initial() initials['bom_copy'] = str2bool(InvenTreeSetting.get_setting('PART_COPY_BOM', True)) - + initials['parameters_copy'] = str2bool(InvenTreeSetting.get_setting('PART_COPY_PARAMETERS', True)) return initials @@ -575,7 +575,7 @@ class PartCreate(AjaxCreateView): """ View for creating a new Part object. Options for providing initial conditions: - + - Provide a category object as initial data """ model = Part @@ -636,9 +636,9 @@ class PartCreate(AjaxCreateView): context = {} valid = form.is_valid() - + name = request.POST.get('name', None) - + if name: matches = match_part_names(name) @@ -646,17 +646,17 @@ class PartCreate(AjaxCreateView): # Limit to the top 5 matches (to prevent clutter) context['matches'] = matches[:5] - + # Enforce display of the checkbox form.fields['confirm_creation'].widget = CheckboxInput() - + # Check if the user has checked the 'confirm_creation' input confirmed = str2bool(request.POST.get('confirm_creation', False)) if not confirmed: msg = _('Possible matches exist - confirm creation of new part') form.add_error('confirm_creation', msg) - + form.pre_form_warning = msg valid = False @@ -705,7 +705,7 @@ class PartCreate(AjaxCreateView): initials['keywords'] = category.default_keywords except (PartCategory.DoesNotExist, ValueError): pass - + # Allow initial data to be passed through as arguments for label in ['name', 'IPN', 'description', 'revision', 'keywords']: if label in self.request.GET: @@ -734,7 +734,7 @@ class PartNotes(UpdateView): def get_success_url(self): """ Return the success URL for this form """ - + return reverse('part-notes', kwargs={'pk': self.get_object().id}) def get_context_data(self, **kwargs): @@ -767,7 +767,7 @@ class PartDetail(InvenTreeRoleMixin, DetailView): - If '?editing=True', set 'editing_enabled' context variable """ context = super().get_context_data(**kwargs) - + part = self.get_object() if str2bool(self.request.GET.get('edit', '')): @@ -806,7 +806,7 @@ class PartDetailFromIPN(PartDetail): pass except queryset.model.DoesNotExist: pass - + return None def get(self, request, *args, **kwargs): @@ -1017,7 +1017,7 @@ class BomDuplicate(AjaxUpdateView): ajax_form_title = _('Duplicate BOM') ajax_template_name = 'part/bom_duplicate.html' form_class = part_forms.BomDuplicateForm - + def get_form(self): form = super().get_form() @@ -1218,7 +1218,7 @@ class BomUpload(InvenTreeRoleMixin, FormView): def handleBomFileUpload(self): """ Process a BOM file upload form. - + This function validates that the uploaded file was valid, and contains tabulated data that can be extracted. If the file does not satisfy these requirements, @@ -1299,13 +1299,13 @@ class BomUpload(InvenTreeRoleMixin, FormView): - If using the Part_ID field, we can do an exact match against the PK field - If using the Part_IPN field, we can do an exact match against the IPN field - If using the Part_Name field, we can use fuzzy string matching to match "close" values - + We also extract other information from the row, for the other non-matched fields: - Quantity - Reference - Overage - Note - + """ # Initially use a quantity of zero @@ -1375,7 +1375,7 @@ class BomUpload(InvenTreeRoleMixin, FormView): # Check if there is a column corresponding to "Note" field if n_idx >= 0: row['note'] = row['data'][n_idx] - + # Supply list of part options for each row, sorted by how closely they match the part name row['part_options'] = part_options @@ -1390,7 +1390,7 @@ class BomUpload(InvenTreeRoleMixin, FormView): try: if row['part_ipn']: part_matches = [part for part in self.allowed_parts if part.IPN and row['part_ipn'].lower() == str(part.IPN.lower())] - + # Check for single match if len(part_matches) == 1: row['part_match'] = part_matches[0] @@ -1464,7 +1464,7 @@ class BomUpload(InvenTreeRoleMixin, FormView): col_id = int(s[3]) except ValueError: continue - + if row_id not in self.row_data: self.row_data[row_id] = {} @@ -1530,7 +1530,7 @@ class BomUpload(InvenTreeRoleMixin, FormView): if col in self.column_selections.values(): part_match_found = True break - + # If not, notify user if not part_match_found: for col in BomUploadManager.PART_MATCH_HEADERS: @@ -1546,7 +1546,7 @@ class BomUpload(InvenTreeRoleMixin, FormView): self.getTableDataFromPost() valid = len(self.missing_columns) == 0 and not self.duplicates - + if valid: # Try to extract meaningful data self.preFillSelections() @@ -1557,7 +1557,7 @@ class BomUpload(InvenTreeRoleMixin, FormView): return self.render_to_response(self.get_context_data(form=None)) def handlePartSelection(self): - + # Extract basic table data from POST request self.getTableDataFromPost() @@ -1595,7 +1595,7 @@ class BomUpload(InvenTreeRoleMixin, FormView): row['errors']['quantity'] = _('Enter a valid quantity') row['quantity'] = q - + except ValueError: continue @@ -1648,7 +1648,7 @@ class BomUpload(InvenTreeRoleMixin, FormView): if key.startswith(field + '_'): try: row_id = int(key.replace(field + '_', '')) - + row = self.getRowByIndex(row_id) if row: @@ -1714,7 +1714,7 @@ class BomUpload(InvenTreeRoleMixin, FormView): return self.render_to_response(ctx) def getRowByIndex(self, idx): - + for row in self.bom_rows: if row['index'] == idx: return row @@ -1732,7 +1732,7 @@ class BomUpload(InvenTreeRoleMixin, FormView): self.form = self.get_form(self.get_form_class()) # Did the user POST a file named bom_file? - + form_step = request.POST.get('form_step', None) if form_step == 'select_file': @@ -1753,7 +1753,7 @@ class PartExport(AjaxView): def get_parts(self, request): """ Extract part list from the POST parameters. Parts can be supplied as: - + - Part category - List of part PK values """ @@ -1956,10 +1956,10 @@ class PartPricing(AjaxView): form_class = part_forms.PartPriceForm role_required = ['sales_order.view', 'part.view'] - + def get_quantity(self): """ Return set quantity in decimal format """ - + return Decimal(self.request.POST.get('quantity', 1)) def get_part(self): @@ -1985,7 +1985,7 @@ class PartPricing(AjaxView): scaler = Decimal(1.0) part = self.get_part() - + ctx = { 'part': part, 'quantity': quantity, @@ -2039,7 +2039,7 @@ class PartPricing(AjaxView): if min_bom_price: ctx['min_total_bom_price'] = min_bom_price ctx['min_unit_bom_price'] = min_unit_bom_price - + if max_bom_price: ctx['max_total_bom_price'] = max_bom_price ctx['max_unit_bom_price'] = max_unit_bom_price @@ -2168,7 +2168,7 @@ class PartParameterDelete(AjaxDeleteView): model = PartParameter ajax_template_name = 'part/param_delete.html' ajax_form_title = _('Delete Part Parameter') - + class CategoryDetail(InvenTreeRoleMixin, DetailView): """ Detail view for PartCategory """ @@ -2223,7 +2223,7 @@ class CategoryEdit(AjaxUpdateView): """ Update view to edit a PartCategory """ - + model = PartCategory form_class = part_forms.EditCategoryForm ajax_template_name = 'modal_form.html' @@ -2244,9 +2244,9 @@ class CategoryEdit(AjaxUpdateView): Limit the choices for 'parent' field to those which make sense """ - + form = super(AjaxUpdateView, self).get_form() - + category = self.get_object() # Remove any invalid choices for the parent category part @@ -2262,7 +2262,7 @@ class CategoryDelete(AjaxDeleteView): """ Delete view to delete a PartCategory """ - + model = PartCategory ajax_template_name = 'part/category_delete.html' ajax_form_title = _('Delete Part Category') @@ -2346,7 +2346,7 @@ class CategoryParameterTemplateCreate(AjaxCreateView): """ form = super(AjaxCreateView, self).get_form() - + form.fields['category'].widget = HiddenInput() if form.is_valid(): @@ -2441,7 +2441,7 @@ class CategoryParameterTemplateEdit(AjaxUpdateView): """ form = super(AjaxUpdateView, self).get_form() - + form.fields['category'].widget = HiddenInput() form.fields['add_to_all_categories'].widget = HiddenInput() form.fields['add_to_same_level_categories'].widget = HiddenInput() @@ -2495,7 +2495,7 @@ class BomItemCreate(AjaxCreateView): """ Create view for making a new BomItem object """ - + model = BomItem form_class = part_forms.EditBomItemForm ajax_template_name = 'modal_form.html' @@ -2523,13 +2523,13 @@ class BomItemCreate(AjaxCreateView): try: part = Part.objects.get(id=part_id) - + # Hide the 'part' field form.fields['part'].widget = HiddenInput() # Exclude the part from its own BOM sub_part_query = sub_part_query.exclude(id=part.id) - + # Eliminate any options that are already in the BOM! sub_part_query = sub_part_query.exclude(id__in=[item.id for item in part.getRequiredParts()]) @@ -2634,7 +2634,7 @@ class PartSalePriceBreakCreate(AjaxCreateView): model = PartSellPriceBreak form_class = part_forms.EditPartSalePriceBreakForm ajax_form_title = _('Add Price Break') - + def get_data(self): return { 'success': _('Added new price break') @@ -2645,7 +2645,7 @@ class PartSalePriceBreakCreate(AjaxCreateView): part = Part.objects.get(id=self.request.GET.get('part')) except (ValueError, Part.DoesNotExist): part = None - + if part is None: try: part = Part.objects.get(id=self.request.POST.get('part')) @@ -2690,7 +2690,7 @@ class PartSalePriceBreakEdit(AjaxUpdateView): return form - + class PartSalePriceBreakDelete(AjaxDeleteView): """ View for deleting a sale price break """ diff --git a/InvenTree/plugins/action/action.py b/InvenTree/plugins/action/action.py index d61838f49b..8b9ed6aec9 100644 --- a/InvenTree/plugins/action/action.py +++ b/InvenTree/plugins/action/action.py @@ -23,10 +23,10 @@ class ActionPlugin(plugin.InvenTreePlugin): look at the PLUGIN_NAME instead. """ action = cls.ACTION_NAME - + if not action: action = cls.PLUGIN_NAME - + return action def __init__(self, user, data=None): diff --git a/InvenTree/report/api.py b/InvenTree/report/api.py index 0925cc5249..351a988601 100644 --- a/InvenTree/report/api.py +++ b/InvenTree/report/api.py @@ -62,7 +62,7 @@ class StockItemReportMixin: """ Return a list of requested stock items """ - + items = [] params = self.request.query_params @@ -101,7 +101,7 @@ class BuildReportMixin: params = self.request.query_params for key in ['build', 'build[]', 'builds', 'builds[]']: - + if key in params: builds = params.getlist(key, []) @@ -268,7 +268,7 @@ class StockItemTestReportList(ReportListView, StockItemReportMixin): serializer_class = TestReportSerializer def filter_queryset(self, queryset): - + queryset = super().filter_queryset(queryset) # List of StockItem objects to match against @@ -342,7 +342,7 @@ class StockItemTestReportPrint(generics.RetrieveAPIView, StockItemReportMixin, R items = self.get_items() return self.print(request, items) - + class BOMReportList(ReportListView, PartReportMixin): """ @@ -459,7 +459,7 @@ class BuildReportList(ReportListView, BuildReportMixin): We need to compare the 'filters' string of each report, and see if it matches against each of the specified parts - + # TODO: This code needs some refactoring! """ @@ -546,7 +546,7 @@ class POReportList(ReportListView, OrderReportMixin): valid_report_ids = set() for report in queryset.all(): - + matches = True # Filter string defined for the report object @@ -565,7 +565,7 @@ class POReportList(ReportListView, OrderReportMixin): except FieldError: matches = False break - + if matches: valid_report_ids.add(report.pk) else: @@ -629,7 +629,7 @@ class SOReportList(ReportListView, OrderReportMixin): valid_report_ids = set() for report in queryset.all(): - + matches = True # Filter string defined for the report object @@ -648,7 +648,7 @@ class SOReportList(ReportListView, OrderReportMixin): except FieldError: matches = False break - + if matches: valid_report_ids.add(report.pk) else: diff --git a/InvenTree/report/models.py b/InvenTree/report/models.py index 4e218a2c50..fa7ae2b271 100644 --- a/InvenTree/report/models.py +++ b/InvenTree/report/models.py @@ -52,7 +52,7 @@ class ReportFileUpload(FileSystemStorage): For example, a snippet or asset file is referenced in a template by filename, and we do not want that filename to change when we upload a new *version* of the snippet or asset file. - + This uploader class performs the following pseudo-code function: - If the model is *new*, proceed as normal @@ -408,7 +408,7 @@ class PurchaseOrderReport(ReportTemplateBase): @classmethod def getSubdir(cls): return 'purchaseorder' - + filters = models.CharField( blank=True, max_length=250, @@ -479,7 +479,7 @@ def rename_snippet(instance, filename): if str(filename) == str(instance.snippet): fullpath = os.path.join(settings.MEDIA_ROOT, path) fullpath = os.path.abspath(fullpath) - + if os.path.exists(fullpath): logger.info(f"Deleting existing snippet file: '{filename}'") os.remove(fullpath) diff --git a/InvenTree/report/templatetags/barcode.py b/InvenTree/report/templatetags/barcode.py index e38fab1f06..a47d45fdf0 100644 --- a/InvenTree/report/templatetags/barcode.py +++ b/InvenTree/report/templatetags/barcode.py @@ -22,7 +22,7 @@ def image_data(img, fmt='PNG'): buffered = BytesIO() img.save(buffered, format=fmt) - + img_str = base64.b64encode(buffered.getvalue()) return f"data:image/{fmt.lower()};charset=utf-8;base64," + img_str.decode() diff --git a/InvenTree/report/templatetags/report.py b/InvenTree/report/templatetags/report.py index 8ff15ccdee..45d11c1d2d 100644 --- a/InvenTree/report/templatetags/report.py +++ b/InvenTree/report/templatetags/report.py @@ -104,7 +104,7 @@ def company_image(company): path = os.path.abspath(path) return f"file://{path}" - + @register.simple_tag() def internal_link(link, text): diff --git a/InvenTree/script/translate.py b/InvenTree/script/translate.py index 3a08c0b410..b41bb96788 100644 --- a/InvenTree/script/translate.py +++ b/InvenTree/script/translate.py @@ -29,7 +29,7 @@ def manually_translate_file(filename, save=False): print("a) Directly enter a new tranlation in the target language") print("b) Leave empty to skip") print("c) Press Ctrl+C to exit") - + print("-------------------------") input("Press to start") print("") diff --git a/InvenTree/script/translation_stats.py b/InvenTree/script/translation_stats.py index 0ba969479b..f47a21f168 100644 --- a/InvenTree/script/translation_stats.py +++ b/InvenTree/script/translation_stats.py @@ -64,5 +64,5 @@ if __name__ == '__main__': percentage = 0 print(f"| {locale.ljust(4, ' ')} : {str(percentage).rjust(4, ' ')}% |") - + print("-" * 16) diff --git a/InvenTree/stock/admin.py b/InvenTree/stock/admin.py index 5f3c08839d..f59c44467e 100644 --- a/InvenTree/stock/admin.py +++ b/InvenTree/stock/admin.py @@ -87,7 +87,7 @@ class StockItemResource(ModelResource): # Date management updated = Field(attribute='updated', widget=widgets.DateWidget()) - + stocktake_date = Field(attribute='stocktake_date', widget=widgets.DateWidget()) def after_import(self, dataset, result, using_transactions, dry_run, **kwargs): @@ -127,7 +127,7 @@ class StockItemAdmin(ImportExportModelAdmin): class StockAttachmentAdmin(admin.ModelAdmin): list_display = ('stock_item', 'attachment', 'comment') - + class StockTrackingAdmin(ImportExportModelAdmin): list_display = ('item', 'date', 'title') diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 0e64cecdbd..b70b379e69 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -117,7 +117,7 @@ class StockAdjust(APIView): A generic class for handling stocktake actions. Subclasses exist for: - + - StockCount: count stock items - StockAdd: add stock items - StockRemove: remove stock items @@ -184,7 +184,7 @@ class StockCount(StockAdjust): """ Endpoint for counting stock (performing a stocktake). """ - + def post(self, request, *args, **kwargs): self.get_items(request) @@ -225,7 +225,7 @@ class StockRemove(StockAdjust): def post(self, request, *args, **kwargs): self.get_items(request) - + n = 0 for item in self.items: @@ -292,7 +292,7 @@ class StockLocationList(generics.ListCreateAPIView): params = self.request.query_params loc_id = params.get('parent', None) - + cascade = str2bool(params.get('cascade', False)) # Do not filter by location @@ -304,7 +304,7 @@ class StockLocationList(generics.ListCreateAPIView): # If we allow "cascade" at the top-level, this essentially means *all* locations if not cascade: queryset = queryset.filter(parent=None) - + else: try: @@ -321,7 +321,7 @@ class StockLocationList(generics.ListCreateAPIView): except (ValueError, StockLocation.DoesNotExist): pass - + return queryset filter_backends = [ @@ -379,14 +379,14 @@ class StockList(generics.ListCreateAPIView): # A location was *not* specified - try to infer it if 'location' not in request.data: location = item.part.get_default_location() - + if location is not None: item.location = location item.save() # An expiry date was *not* specified - try to infer it! if 'expiry_date' not in request.data: - + if item.part.default_expiry > 0: item.expiry_date = datetime.now().date() + timedelta(days=item.part.default_expiry) item.save() @@ -399,7 +399,7 @@ class StockList(generics.ListCreateAPIView): """ Override the 'list' method, as the StockLocation objects are very expensive to serialize. - + So, we fetch and serialize the required StockLocation objects only as required. """ @@ -601,7 +601,7 @@ class StockList(generics.ListCreateAPIView): if stale_days > 0: stale_date = datetime.now().date() + timedelta(days=stale_days) - + stale_filter = StockItem.IN_STOCK_FILTER & ~Q(expiry_date=None) & Q(expiry_date__lt=stale_date) if stale: @@ -652,7 +652,7 @@ class StockList(generics.ListCreateAPIView): if serial_number_gte is not None: queryset = queryset.filter(serial__gte=serial_number_gte) - + if serial_number_lte is not None: queryset = queryset.filter(serial__lte=serial_number_lte) @@ -681,7 +681,7 @@ class StockList(generics.ListCreateAPIView): else: # Filter StockItem without build allocations or sales order allocations queryset = queryset.filter(Q(sales_order_allocations__isnull=True) & Q(allocations__isnull=True)) - + # Do we wish to filter by "active parts" active = params.get('active', None) @@ -766,7 +766,7 @@ class StockList(generics.ListCreateAPIView): queryset = queryset.filter(location__in=location.getUniqueChildren()) else: queryset = queryset.filter(location=loc_id) - + except (ValueError, StockLocation.DoesNotExist): pass @@ -994,14 +994,14 @@ class StockTrackingList(generics.ListCreateAPIView): def create(self, request, *args, **kwargs): """ Create a new StockItemTracking object - + Here we override the default 'create' implementation, to save the user information associated with the request object. """ serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) - + # Record the user who created this Part object item = serializer.save() item.user = request.user diff --git a/InvenTree/stock/forms.py b/InvenTree/stock/forms.py index c784b08a69..3fb72ebe1e 100644 --- a/InvenTree/stock/forms.py +++ b/InvenTree/stock/forms.py @@ -118,7 +118,7 @@ class CreateStockItemForm(HelperForm): serial_numbers = forms.CharField(label=_('Serial Numbers'), required=False, help_text=_('Enter unique serial numbers (or leave blank)')) def __init__(self, *args, **kwargs): - + self.field_prefix = { 'serial_numbers': 'fa-hashtag', 'link': 'fa-link', @@ -147,17 +147,17 @@ class CreateStockItemForm(HelperForm): # Custom clean to prevent complex StockItem.clean() logic from running (yet) def full_clean(self): self._errors = ErrorDict() - + if not self.is_bound: # Stop further processing. return - + self.cleaned_data = {} # If the form is permitted to be empty, and none of the form data has # changed from the initial data, short circuit any validation. if self.empty_permitted and not self.has_changed(): return - + # Don't run _post_clean() as this will run StockItem.clean() self._clean_fields() self._clean_form() @@ -167,9 +167,9 @@ class SerializeStockForm(HelperForm): """ Form for serializing a StockItem. """ destination = TreeNodeChoiceField(queryset=StockLocation.objects.all(), label=_('Destination'), required=True, help_text=_('Destination for serialized stock (by default, will remain in current location)')) - + serial_numbers = forms.CharField(label=_('Serial numbers'), required=True, help_text=_('Unique serial numbers (must match quantity)')) - + note = forms.CharField(label=_('Notes'), required=False, help_text=_('Add transaction note (optional)')) quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5, label=_('Quantity')) @@ -240,7 +240,7 @@ class TestReportFormatForm(HelperForm): super().__init__(*args, **kwargs) self.fields['template'].choices = self.get_template_choices() - + def get_template_choices(self): """ Generate a list of of TestReport options for the StockItem @@ -337,7 +337,7 @@ class InstallStockForm(HelperForm): raise ValidationError({'quantity_to_install': _('Must not exceed available quantity')}) return data - + class UninstallStockForm(forms.ModelForm): """ @@ -373,11 +373,11 @@ class AdjustStockForm(forms.ModelForm): """ destination = TreeNodeChoiceField(queryset=StockLocation.objects.all(), label=_('Destination'), required=True, help_text=_('Destination stock location')) - + note = forms.CharField(label=_('Notes'), required=True, help_text=_('Add note (required)')) - + # transaction = forms.BooleanField(required=False, initial=False, label='Create Transaction', help_text='Create a stock transaction for these parts') - + confirm = forms.BooleanField(required=False, initial=False, label=_('Confirm stock adjustment'), help_text=_('Confirm movement of stock items')) set_loc = forms.BooleanField(required=False, initial=False, label=_('Set Default Location'), help_text=_('Set the destination as the default location for selected parts')) @@ -396,7 +396,7 @@ class AdjustStockForm(forms.ModelForm): class EditStockItemForm(HelperForm): """ Form for editing a StockItem object. Note that not all fields can be edited here (even if they can be specified during creation. - + location - Must be updated in a 'move' transaction quantity - Must be updated in a 'stocktake' transaction part - Cannot be edited after creation diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index 7d9520a544..125a534f08 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -131,7 +131,7 @@ def before_delete_stock_location(sender, instance, using, **kwargs): class StockItem(MPTTModel): """ A StockItem object represents a quantity of physical instances of a part. - + Attributes: parent: Link to another StockItem from which this StockItem was created uid: Field containing a unique-id which is mapped to a third-party identifier (e.g. a barcode) @@ -191,7 +191,7 @@ class StockItem(MPTTModel): add_note = False user = kwargs.pop('user', None) - + add_note = add_note and kwargs.pop('note', True) super(StockItem, self).save(*args, **kwargs) @@ -226,7 +226,7 @@ class StockItem(MPTTModel): """ super(StockItem, self).validate_unique(exclude) - + # If the serial number is set, make sure it is not a duplicate if self.serial is not None: # Query to look for duplicate serial numbers @@ -421,7 +421,7 @@ class StockItem(MPTTModel): max_length=100, blank=True, null=True, help_text=_('Serial number for this item') ) - + link = InvenTreeURLField( verbose_name=_('External Link'), max_length=125, blank=True, @@ -727,7 +727,7 @@ class StockItem(MPTTModel): items = StockItem.objects.filter(belongs_to=self) for item in items: - + # Prevent duplication or recursion if item == self or item in installed: continue @@ -906,7 +906,7 @@ class StockItem(MPTTModel): Brief automated note detailing a movement or quantity change. """ - + track = StockItemTracking.objects.create( item=self, title=title, @@ -970,7 +970,7 @@ class StockItem(MPTTModel): # Create a new stock item for each unique serial number for serial in serials: - + # Create a copy of this StockItem new_item = StockItem.objects.get(pk=self.pk) new_item.quantity = 1 @@ -1001,7 +1001,7 @@ class StockItem(MPTTModel): """ Copy stock history from another StockItem """ for item in other.tracking_info.all(): - + item.item = self item.pk = None item.save() @@ -1151,7 +1151,7 @@ class StockItem(MPTTModel): @transaction.atomic def updateQuantity(self, quantity): """ Update stock quantity for this item. - + If the quantity has reached zero, this StockItem will be deleted. Returns: @@ -1174,7 +1174,7 @@ class StockItem(MPTTModel): self.quantity = quantity if quantity == 0 and self.delete_on_deplete and self.can_delete(): - + # TODO - Do not actually "delete" stock at this point - instead give it a "DELETED" flag self.delete() return False @@ -1584,7 +1584,7 @@ class StockItemTestResult(models.Model): with automated testing setups. Multiple results can be recorded against any given test, allowing tests to be run many times. - + Attributes: stock_item: Link to StockItem test: Test name (simple string matching) @@ -1613,7 +1613,7 @@ class StockItemTestResult(models.Model): for template in templates: if key == template.key: - + if template.requires_value: if not self.value: raise ValidationError({ diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py index 5b00c1dd17..4991a44e6f 100644 --- a/InvenTree/stock/serializers.py +++ b/InvenTree/stock/serializers.py @@ -140,7 +140,7 @@ class StockItemSerializer(InvenTreeModelSerializer): return queryset status_text = serializers.CharField(source='get_status_display', read_only=True) - + supplier_part_detail = SupplierPartSerializer(source='supplier_part', many=False, read_only=True) part_detail = PartBriefSerializer(source='part', many=False, read_only=True) @@ -150,7 +150,7 @@ class StockItemSerializer(InvenTreeModelSerializer): tracking_items = serializers.IntegerField(source='tracking_info_count', read_only=True, required=False) quantity = serializers.FloatField() - + allocated = serializers.FloatField(source='allocation_count', required=False) expired = serializers.BooleanField(required=False, read_only=True) diff --git a/InvenTree/stock/test_api.py b/InvenTree/stock/test_api.py index ae0d6fd862..e1fb616335 100644 --- a/InvenTree/stock/test_api.py +++ b/InvenTree/stock/test_api.py @@ -38,7 +38,7 @@ class StockAPITestCase(InvenTreeAPITestCase): ] def setUp(self): - + super().setUp() @@ -105,7 +105,7 @@ class StockItemListTest(StockAPITestCase): """ response = self.get_stock(part=25) - + self.assertEqual(len(response), 8) response = self.get_stock(part=10004) @@ -339,7 +339,7 @@ class StockItemTest(StockAPITestCase): ) self.assertContains(response, 'This field is required', status_code=status.HTTP_400_BAD_REQUEST) - + # POST with an invalid part reference response = self.client.post( @@ -384,10 +384,10 @@ class StockItemTest(StockAPITestCase): - Otherwise, check if the referenced part has a default_expiry defined - If so, use that! - Otherwise, no expiry - + Notes: - Part <25> has a default_expiry of 10 days - + """ # First test - create a new StockItem without an expiry date @@ -460,7 +460,7 @@ class StocktakeTest(StockAPITestCase): data['items'] = [{ 'pk': 10 }] - + response = self.post(url, data) self.assertContains(response, 'must contain a valid pk', status_code=status.HTTP_400_BAD_REQUEST) @@ -478,12 +478,12 @@ class StocktakeTest(StockAPITestCase): response = self.post(url, data) self.assertContains(response, 'must contain a valid quantity', status_code=status.HTTP_400_BAD_REQUEST) - + data['items'] = [{ 'pk': 1234, 'quantity': "-1.234" }] - + response = self.post(url, data) self.assertContains(response, 'must not be less than zero', status_code=status.HTTP_400_BAD_REQUEST) diff --git a/InvenTree/stock/test_views.py b/InvenTree/stock/test_views.py index 261598ae22..c565532739 100644 --- a/InvenTree/stock/test_views.py +++ b/InvenTree/stock/test_views.py @@ -29,7 +29,7 @@ class StockViewTestCase(TestCase): # Create a user user = get_user_model() - + self.user = user.objects.create_user( username='username', email='user@email.com', @@ -91,7 +91,7 @@ class StockLocationTest(StockViewTestCase): # Create with an invalid parent response = self.client.get(reverse('stock-location-create'), {'location': 999}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertEqual(response.status_code, 200) - + class StockItemTest(StockViewTestCase): """" Tests for StockItem views """ @@ -211,7 +211,7 @@ class StockItemTest(StockViewTestCase): 'serial_numbers': 'dd-23-adf', 'destination': 'blorg' } - + # POST response = self.client.post(url, data_valid, HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertEqual(response.status_code, 200) @@ -247,7 +247,7 @@ class StockOwnershipTest(StockViewTestCase): # Create a new user user = get_user_model() - + self.new_user = user.objects.create_user( username='john', email='john@email.com', @@ -314,7 +314,7 @@ class StockOwnershipTest(StockViewTestCase): response = self.client.post(reverse('stock-location-edit', args=(test_location_id,)), {'name': 'Office', 'owner': new_user_group_owner.pk}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - + # Make sure the location's owner is unchanged location = StockLocation.objects.get(pk=test_location_id) self.assertEqual(location.owner, user_group_owner) @@ -366,7 +366,7 @@ class StockOwnershipTest(StockViewTestCase): response = self.client.post(reverse('stock-location-create'), new_location, HTTP_X_REQUESTED_WITH='XMLHttpRequest') self.assertContains(response, '"form_valid": true', status_code=200) - + # Retrieve created location location_created = StockLocation.objects.get(name=new_location['name']) diff --git a/InvenTree/stock/tests.py b/InvenTree/stock/tests.py index f3ca949bbf..08fa727547 100644 --- a/InvenTree/stock/tests.py +++ b/InvenTree/stock/tests.py @@ -144,7 +144,7 @@ class StockTest(TestCase): self.drawer3.save() self.assertNotEqual(self.drawer3.parent, self.office) - + self.assertEqual(self.drawer3.pathstring, 'Home/Drawer_3') def test_children(self): @@ -486,7 +486,7 @@ class VariantTest(StockTest): # Attempt to create the same serial number but for a variant (should fail!) item.pk = None item.part = Part.objects.get(pk=10004) - + with self.assertRaises(ValidationError): item.save() @@ -542,7 +542,7 @@ class TestResultTest(StockTest): test='sew cushion', result=True ) - + # Still should be failing at this point, # as the most recent "apply paint" test was False self.assertFalse(item.passedAllRequiredTests()) diff --git a/InvenTree/stock/urls.py b/InvenTree/stock/urls.py index 24e609fa4f..fe5472003f 100644 --- a/InvenTree/stock/urls.py +++ b/InvenTree/stock/urls.py @@ -14,7 +14,7 @@ location_urls = [ url(r'^edit/?', views.StockLocationEdit.as_view(), name='stock-location-edit'), url(r'^delete/?', views.StockLocationDelete.as_view(), name='stock-location-delete'), url(r'^qr_code/?', views.StockLocationQRCode.as_view(), name='stock-location-qr'), - + url(r'sublocation/', views.StockLocationDetail.as_view(template_name='stock/sublocation.html'), name='stock-location-sublocation'), # Anything else diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index 72395a54d0..0984405055 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -121,7 +121,7 @@ class StockLocationEdit(AjaxUpdateView): context_object_name = 'location' ajax_template_name = 'modal_form.html' ajax_form_title = _('Edit Stock Location') - + def get_form(self): """ Customize form data for StockLocation editing. @@ -182,7 +182,7 @@ class StockLocationEdit(AjaxUpdateView): """ self.object = form.save() - + # Is ownership control enabled? stock_ownership_control = InvenTreeSetting.get_setting('STOCK_OWNERSHIP_CONTROL') @@ -267,7 +267,7 @@ class StockItemAttachmentCreate(AjaxCreateView): def save(self, form, **kwargs): """ Record the user that uploaded the attachment """ - + attachment = form.save(commit=False) attachment.user = self.request.user attachment.save() @@ -297,7 +297,7 @@ class StockItemAttachmentCreate(AjaxCreateView): form = super().get_form() form.fields['stock_item'].widget = HiddenInput() - + return form @@ -309,7 +309,7 @@ class StockItemAttachmentEdit(AjaxUpdateView): model = StockItemAttachment form_class = StockForms.EditStockItemAttachmentForm ajax_form_title = _("Edit Stock Item Attachment") - + def get_form(self): form = super().get_form() @@ -327,7 +327,7 @@ class StockItemAttachmentDelete(AjaxDeleteView): ajax_form_title = _("Delete Stock Item Attachment") ajax_template_name = "attachment_delete.html" context_object_name = "attachment" - + def get_data(self): return { 'danger': _("Deleted attachment"), @@ -376,7 +376,7 @@ class StockItemReturnToStock(AjaxUpdateView): ajax_form_title = _("Return to Stock") context_object_name = "item" form_class = StockForms.ReturnStockItemForm - + def validate(self, item, form, **kwargs): location = form.cleaned_data.get('location', None) @@ -405,7 +405,7 @@ class StockItemDeleteTestData(AjaxUpdateView): model = StockItem form_class = ConfirmForm ajax_form_title = _("Delete All Test Data") - + role_required = ['stock.change', 'stock.delete'] def get_form(self): @@ -417,7 +417,7 @@ class StockItemDeleteTestData(AjaxUpdateView): stock_item = StockItem.objects.get(pk=self.kwargs['pk']) form = self.get_form() - + confirm = str2bool(request.POST.get('confirm', False)) if confirm is not True: @@ -488,7 +488,7 @@ class StockItemTestResultEdit(AjaxUpdateView): form = super().get_form() form.fields['stock_item'].widget = HiddenInput() - + return form @@ -545,11 +545,11 @@ class StockExport(AjaxView): def get(self, request, *args, **kwargs): export_format = request.GET.get('format', 'csv').lower() - + # Check if a particular location was specified loc_id = request.GET.get('location', None) location = None - + if loc_id: try: location = StockLocation.objects.get(pk=loc_id) @@ -646,9 +646,9 @@ class StockItemInstall(AjaxUpdateView): In contrast to the StockItemUninstall view, only a single stock item can be installed at once. - + The "part" to be installed must be provided in the GET query parameters. - + """ model = StockItem @@ -664,7 +664,7 @@ class StockItemInstall(AjaxUpdateView): Requirements: - Items must be in stock - + Filters: - Items can be filtered by Part reference """ @@ -702,7 +702,7 @@ class StockItemInstall(AjaxUpdateView): if self.part: initials['part'] = self.part - + return initials def get_form(self): @@ -875,13 +875,13 @@ class StockItemUninstall(AjaxView, FormMixin): class StockAdjust(AjaxView, FormMixin): """ View for enacting simple stock adjustments: - + - Take items from stock - Add items to stock - Count items - Move stock - Delete stock items - + """ ajax_template_name = 'stock/stock_adjust.html' @@ -942,7 +942,7 @@ class StockAdjust(AjaxView, FormMixin): for item in self.request.POST: if item.startswith('stock-id-'): - + pk = item.replace('stock-id-', '') q = self.request.POST[item] @@ -1022,9 +1022,9 @@ class StockAdjust(AjaxView, FormMixin): form = self.get_form() valid = form.is_valid() - + for item in self.stock_items: - + try: item.new_quantity = Decimal(item.new_quantity) except ValueError: @@ -1067,7 +1067,7 @@ class StockAdjust(AjaxView, FormMixin): # Was the entire stock taken? item = self.stock_items[0] - + if item.quantity == 0: # Instruct the form to redirect data['url'] = reverse('stock-index') @@ -1107,7 +1107,7 @@ class StockAdjust(AjaxView, FormMixin): return _('No action performed') def do_add(self): - + count = 0 note = self.request.POST['note'] @@ -1137,12 +1137,12 @@ class StockAdjust(AjaxView, FormMixin): return _('Removed stock from {n} items').format(n=count) def do_count(self): - + count = 0 note = self.request.POST['note'] for item in self.stock_items: - + item.stocktake(item.new_quantity, self.request.user, notes=note) count += 1 @@ -1165,7 +1165,7 @@ class StockAdjust(AjaxView, FormMixin): if set_loc: item.part.default_location = destination item.part.save() - + # Do not move to the same location (unless the quantity is different) if destination == item.location and item.new_quantity == item.quantity: continue @@ -1188,7 +1188,7 @@ class StockAdjust(AjaxView, FormMixin): if count == 0: return _('No items were moved') - + else: return _('Moved {n} items to {dest}').format( n=count, @@ -1201,7 +1201,7 @@ class StockAdjust(AjaxView, FormMixin): # note = self.request.POST['note'] for item in self.stock_items: - + # TODO - In the future, StockItems should not be 'deleted' # TODO - Instead, they should be marked as "inactive" @@ -1475,7 +1475,7 @@ class StockItemSerialize(AjaxUpdateView): return initials def get(self, request, *args, **kwargs): - + return super().get(request, *args, **kwargs) def post(self, request, *args, **kwargs): @@ -1503,13 +1503,13 @@ class StockItemSerialize(AjaxUpdateView): form.add_error('serial_numbers', e.messages) valid = False numbers = [] - + if valid: try: item.serializeStock(quantity, numbers, user, notes=notes, location=destination) except ValidationError as e: messages = e.message_dict - + for k in messages.keys(): if k in ['quantity', 'destination', 'serial_numbers']: form.add_error(k, messages[k]) @@ -1595,7 +1595,7 @@ class StockItemCreate(AjaxCreateView): if not part.purchaseable: form.fields.pop('purchase_price') - + # Hide the 'part' field (as a valid part is selected) # form.fields['part'].widget = HiddenInput() @@ -1658,7 +1658,7 @@ class StockItemCreate(AjaxCreateView): if type(location_owner.owner) is Group: user_as_owner = Owner.get_owner(self.request.user) queryset = location_owner.get_related_owners() - + if user_as_owner in queryset: form.fields['owner'].initial = user_as_owner @@ -1668,7 +1668,7 @@ class StockItemCreate(AjaxCreateView): # If location's owner is a user: automatically set owner field and disable it form.fields['owner'].disabled = True form.fields['owner'].initial = location_owner - + return form def get_initial(self): @@ -1746,7 +1746,7 @@ class StockItemCreate(AjaxCreateView): data = form.cleaned_data part = data.get('part', None) - + quantity = data.get('quantity', None) owner = data.get('owner', None) @@ -1831,7 +1831,7 @@ class StockItemCreate(AjaxCreateView): ) item.save(user=self.request.user) - + # Create a single StockItem of the specified quantity else: form._post_clean() @@ -1841,12 +1841,12 @@ class StockItemCreate(AjaxCreateView): item.save(user=self.request.user) return item - + # Non-trackable part else: form._post_clean() - + item = form.save(commit=False) item.user = self.request.user item.save(user=self.request.user) diff --git a/InvenTree/users/admin.py b/InvenTree/users/admin.py index d8406bfddd..91fed49830 100644 --- a/InvenTree/users/admin.py +++ b/InvenTree/users/admin.py @@ -127,7 +127,7 @@ class RoleGroupAdmin(admin.ModelAdmin): if rule_set.can_delete: permission_level = append_permission_level(permission_level, 'D') - + return permission_level def admin(self, obj): diff --git a/InvenTree/users/models.py b/InvenTree/users/models.py index cd222cb2a2..f26a7ee64b 100644 --- a/InvenTree/users/models.py +++ b/InvenTree/users/models.py @@ -185,7 +185,7 @@ class RuleSet(models.Model): can_change = models.BooleanField(verbose_name=_('Change'), default=False, help_text=_('Permissions to edit items')) can_delete = models.BooleanField(verbose_name=_('Delete'), default=False, help_text=_('Permission to delete items')) - + @classmethod def check_table_permission(cls, user, table, permission): """ @@ -373,7 +373,7 @@ def update_group_roles(group, debug=False): # Add any required permissions to the group for perm in permissions_to_add: - + # Ignore if permission is already in the group if perm in group_permissions: continue @@ -541,7 +541,7 @@ class Owner(models.Model): pass return owner - + return owner def get_related_owners(self, include_group=False): @@ -562,7 +562,7 @@ class Owner(models.Model): Q(owner_id=self.owner.id, owner_type=ContentType.objects.get_for_model(Group).id) else: query = Q(owner_id__in=users, owner_type=ContentType.objects.get_for_model(user_model).id) - + related_owners = Owner.objects.filter(query) elif type(self.owner) is user_model: diff --git a/InvenTree/users/test_migrations.py b/InvenTree/users/test_migrations.py index 7e4c24b2dc..7bb17d0070 100644 --- a/InvenTree/users/test_migrations.py +++ b/InvenTree/users/test_migrations.py @@ -24,7 +24,7 @@ class TestForwardMigrations(MigratorTestCase): email='fred@fred.com', password='password' ) - + User.objects.create( username='brad', email='brad@fred.com', diff --git a/InvenTree/users/tests.py b/InvenTree/users/tests.py index 895d0a84af..e8ec6b3c74 100644 --- a/InvenTree/users/tests.py +++ b/InvenTree/users/tests.py @@ -17,7 +17,7 @@ class RuleSetModelTest(TestCase): def test_ruleset_models(self): keys = RuleSet.RULESET_MODELS.keys() - + # Check if there are any rulesets which do not have models defined missing = [name for name in RuleSet.RULESET_NAMES if name not in keys] @@ -88,7 +88,7 @@ class RuleSetModelTest(TestCase): extra_models = set() defined_models = set() - + for model in assigned_models: defined_models.add(model) @@ -198,7 +198,7 @@ class OwnerModelTest(TestCase): self.user.delete() user_as_owner = Owner.get_owner(self.user) self.assertEqual(user_as_owner, None) - + # Delete group and verify owner was deleted too self.group.delete() group_as_owner = Owner.get_owner(self.group) diff --git a/tasks.py b/tasks.py index 37cbc71eab..88bd5e42e4 100644 --- a/tasks.py +++ b/tasks.py @@ -295,7 +295,7 @@ def export_records(c, filename='data.json'): for entry in data: if "model" in entry: - + # Clear out any permissions specified for a group if entry["model"] == "auth.group": entry["fields"]["permissions"] = [] @@ -335,7 +335,7 @@ def import_records(c, filename='data.json'): for entry in data: if "model" in entry: - + # Clear out any permissions specified for a group if entry["model"] == "auth.group": entry["fields"]["permissions"] = [] @@ -370,7 +370,7 @@ def import_fixtures(c): fixtures = [ # Build model 'build', - + # Common models 'settings', From 39d4129157e9af02ba36ece6b1ddc065a7fbe6cd Mon Sep 17 00:00:00 2001 From: Matthias Mair <66015116+matmair@users.noreply.github.com> Date: Thu, 6 May 2021 12:29:58 +0200 Subject: [PATCH 21/56] chery picked all fixed trans str from #1438 (#1554) --- InvenTree/InvenTree/validators.py | 6 ++--- InvenTree/company/views.py | 2 +- InvenTree/order/models.py | 2 +- InvenTree/order/views.py | 6 ++--- InvenTree/part/views.py | 2 +- InvenTree/stock/models.py | 38 ++++++++++++++----------------- 6 files changed, 26 insertions(+), 30 deletions(-) diff --git a/InvenTree/InvenTree/validators.py b/InvenTree/InvenTree/validators.py index f8199ef20b..d5fcb8822e 100644 --- a/InvenTree/InvenTree/validators.py +++ b/InvenTree/InvenTree/validators.py @@ -74,7 +74,7 @@ def validate_build_order_reference(value): match = re.search(pattern, value) if match is None: - raise ValidationError(_('Reference must match pattern') + f" '{pattern}'") + raise ValidationError(_('Reference must match pattern {pattern}').format(pattern=pattern)) def validate_purchase_order_reference(value): @@ -88,7 +88,7 @@ def validate_purchase_order_reference(value): match = re.search(pattern, value) if match is None: - raise ValidationError(_('Reference must match pattern') + f" '{pattern}'") + raise ValidationError(_('Reference must match pattern {pattern}').format(pattern=pattern)) def validate_sales_order_reference(value): @@ -102,7 +102,7 @@ def validate_sales_order_reference(value): match = re.search(pattern, value) if match is None: - raise ValidationError(_('Reference must match pattern') + f" '{pattern}'") + raise ValidationError(_('Reference must match pattern {pattern}').format(pattern=pattern)) def validate_tree_name(value): diff --git a/InvenTree/company/views.py b/InvenTree/company/views.py index be7d326c36..7ba8e5e6bf 100644 --- a/InvenTree/company/views.py +++ b/InvenTree/company/views.py @@ -202,7 +202,7 @@ class CompanyImageDownloadFromURL(AjaxUpdateView): # Check for valid response code if not response.status_code == 200: - form.add_error('url', f"{_('Invalid response')}: {response.status_code}") + form.add_error('url', _('Invalid response: {code}').format(code=response.status_code)) return response.raw.decode_content = True diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index d3b09dec1e..292a5ed492 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -367,7 +367,7 @@ class PurchaseOrder(Order): stock.save() text = _("Received items") - note = f"{_('Received')} {quantity} {_('items against order')} {str(self)}" + note = _('Received {n} items against order {name}').format(n=quantity, name=str(self)) # Add a new transaction note to the newly created stock item stock.addTransactionNote(text, user, note) diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index c62a3816d5..0ffff4e340 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -1407,7 +1407,7 @@ class SalesOrderAssignSerials(AjaxView, FormMixin): except StockItem.DoesNotExist: self.form.add_error( 'serials', - _('No matching item for serial') + f" '{serial}'" + _('No matching item for serial {serial}').format(serial=serial) ) continue @@ -1417,7 +1417,7 @@ class SalesOrderAssignSerials(AjaxView, FormMixin): if not stock_item.in_stock: self.form.add_error( 'serials', - f"'{serial}' " + _("is not in stock") + _('{serial} is not in stock').format(serial=serial) ) continue @@ -1425,7 +1425,7 @@ class SalesOrderAssignSerials(AjaxView, FormMixin): if stock_item.is_allocated(): self.form.add_error( 'serials', - f"'{serial}' " + _("already allocated to an order") + _('{serial} already allocated to an order').format(serial=serial) ) continue diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index d7c68dd6a3..2cf86945d3 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -884,7 +884,7 @@ class PartImageDownloadFromURL(AjaxUpdateView): # Check for valid response code if not response.status_code == 200: - form.add_error('url', f"{_('Invalid response')}: {response.status_code}") + form.add_error('url', _('Invalid response: {code}').format(code=response.status_code)) return response.raw.decode_content = True diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index 7d9520a544..7f22b7a4ef 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -198,7 +198,7 @@ class StockItem(MPTTModel): if add_note: - note = f"{_('Created new stock item for')} {str(self.part)}" + note = _('Created new stock item for {part}').format(part=str(self.part)) # This StockItem is being saved for the first time self.addTransactionNote( @@ -613,7 +613,7 @@ class StockItem(MPTTModel): item.addTransactionNote( _("Assigned to Customer"), user, - notes=_("Manually assigned to customer") + " " + customer.name, + notes=_("Manually assigned to customer {name}").format(name=customer.name), system=True ) @@ -626,9 +626,9 @@ class StockItem(MPTTModel): """ self.addTransactionNote( - _("Returned from customer") + f" {self.customer.name}", + _("Returned from customer {name}").format(name=self.customer.name), user, - notes=_("Returned to location") + f" {location.name}", + notes=_("Returned to location {loc}").format(loc=location.name), system=True ) @@ -789,7 +789,7 @@ class StockItem(MPTTModel): # Add a transaction note to the other item stock_item.addTransactionNote( - _('Installed into stock item') + ' ' + str(self.pk), + _('Installed into stock item {pk}').format(str(self.pk)), user, notes=notes, url=self.get_absolute_url() @@ -797,7 +797,7 @@ class StockItem(MPTTModel): # Add a transaction note to this item self.addTransactionNote( - _('Installed stock item') + ' ' + str(stock_item.pk), + _('Installed stock item {pk}').format(str(stock_item.pk)), user, notes=notes, url=stock_item.get_absolute_url() ) @@ -821,7 +821,7 @@ class StockItem(MPTTModel): # Add a transaction note to the parent item self.belongs_to.addTransactionNote( - _("Uninstalled stock item") + ' ' + str(self.pk), + _("Uninstalled stock item {pk}").format(pk=str(self.pk)), user, notes=notes, url=self.get_absolute_url(), @@ -840,7 +840,7 @@ class StockItem(MPTTModel): # Add a transaction note! self.addTransactionNote( - _('Uninstalled into location') + ' ' + str(location), + _('Uninstalled into location {loc}').formaT(loc=str(location)), user, notes=notes, url=url @@ -966,7 +966,7 @@ class StockItem(MPTTModel): if len(existing) > 0: exists = ','.join([str(x) for x in existing]) - raise ValidationError({"serial_numbers": _("Serial numbers already exist") + ': ' + exists}) + raise ValidationError({"serial_numbers": _("Serial numbers already exist: {exists}").format(exists=exists)}) # Create a new stock item for each unique serial number for serial in serials: @@ -1074,7 +1074,7 @@ class StockItem(MPTTModel): new_stock.addTransactionNote( _("Split from existing stock"), user, - f"{_('Split')} {helpers.normalize(quantity)} {_('items')}" + _('Split {n} items').format(n=helpers.normalize(quantity)) ) # Remove the specified quantity from THIS stock item @@ -1131,10 +1131,10 @@ class StockItem(MPTTModel): return True - msg = f"{_('Moved to')} {str(location)}" - if self.location: - msg += f" ({_('from')} {str(self.location)})" + msg = _("Moved to {loc_new} (from {loc_old})").format(loc_new=str(location), loc_old=str(self.location)) + else: + msg = _('Moved to {loc_new}').format(loc_new=str(location)) self.location = location @@ -1202,9 +1202,7 @@ class StockItem(MPTTModel): if self.updateQuantity(count): - n = helpers.normalize(count) - - text = f"{_('Counted')} {n} {_('items')}" + text = _('Counted {n} items').format(n=helpers.normalize(count)) self.addTransactionNote( text, @@ -1236,9 +1234,8 @@ class StockItem(MPTTModel): return False if self.updateQuantity(self.quantity + quantity): - - n = helpers.normalize(quantity) - text = f"{_('Added')} {n} {_('items')}" + + text = _('Added {n} items').format(n=helpers.normalize(quantity)) self.addTransactionNote( text, @@ -1268,8 +1265,7 @@ class StockItem(MPTTModel): if self.updateQuantity(self.quantity - quantity): - q = helpers.normalize(quantity) - text = f"{_('Removed')} {q} {_('items')}" + text = _('Removed {n1} items').format(n1=helpers.normalize(quantity)) self.addTransactionNote(text, user, From a77d9d9de76ec4d689f9f4acab35b666b07cfc7b Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 6 May 2021 14:33:03 +0200 Subject: [PATCH 22/56] same treatment for html --- InvenTree/build/templates/build/allocate.html | 4 ++-- .../build/templates/build/build_base.html | 2 +- InvenTree/build/templates/build/index.html | 12 +++++----- InvenTree/build/templates/build/navbar.html | 2 +- InvenTree/build/templates/build/notes.html | 4 ++-- .../company/templates/company/detail.html | 2 +- .../company/manufacturer_part_delete.html | 4 ++-- .../company/manufacturer_part_detail.html | 2 +- .../company/manufacturer_part_suppliers.html | 2 +- .../company/templates/company/navbar.html | 2 +- .../company/templates/company/notes.html | 6 ++--- .../company/supplier_part_delete.html | 2 +- .../company/supplier_part_detail.html | 2 +- .../company/supplier_part_orders.html | 2 +- .../company/supplier_part_pricing.html | 2 +- .../order/templates/order/po_attachments.html | 2 +- .../order/purchase_order_detail.html | 4 ++-- .../templates/order/purchase_orders.html | 6 ++--- .../templates/order/sales_order_detail.html | 22 +++++++++---------- .../order/templates/order/sales_orders.html | 4 ++-- InvenTree/part/templates/part/build.html | 2 +- InvenTree/part/templates/part/category.html | 2 +- InvenTree/part/templates/part/detail.html | 2 +- .../part/templates/part/manufacturer.html | 2 +- InvenTree/part/templates/part/notes.html | 4 ++-- InvenTree/part/templates/part/params.html | 2 +- InvenTree/part/templates/part/part_base.html | 12 +++++----- .../part/templates/part/select_image.html | 2 +- .../part/templates/part/set_category.html | 8 +++---- .../part/templates/part/subcategory.html | 2 +- InvenTree/part/templates/part/supplier.html | 2 +- .../report/inventree_build_order_base.html | 2 +- .../report/inventree_report_base.html | 4 ++-- InvenTree/stock/templates/stock/item.html | 2 +- .../stock/templates/stock/item_base.html | 2 +- .../stock/templates/stock/item_tests.html | 2 +- InvenTree/stock/templates/stock/location.html | 10 ++++----- InvenTree/stock/templates/stock/navbar.html | 2 +- .../stock/templates/stock/stock_adjust.html | 4 ++-- .../stock/templates/stock/sublocation.html | 2 +- InvenTree/templates/InvenTree/index.html | 2 +- InvenTree/templates/InvenTree/search.html | 6 ++--- .../InvenTree/settings/category.html | 4 ++-- .../templates/InvenTree/settings/part.html | 2 +- .../InvenTree/settings/settings.html | 2 +- InvenTree/templates/base.html | 12 +++++----- InvenTree/templates/modal_form.html | 4 ++-- InvenTree/templates/modals.html | 2 +- InvenTree/templates/registration/login.html | 10 ++++----- .../registration/password_reset_done.html | 2 +- InvenTree/templates/two_column.html | 2 +- 51 files changed, 103 insertions(+), 103 deletions(-) diff --git a/InvenTree/build/templates/build/allocate.html b/InvenTree/build/templates/build/allocate.html index dee90a26a0..de07614c8e 100644 --- a/InvenTree/build/templates/build/allocate.html +++ b/InvenTree/build/templates/build/allocate.html @@ -86,7 +86,7 @@ } ); }); - + $("#btn-order-parts").click(function() { launchModalForm("/order/purchase-order/order-parts/", { data: { @@ -94,7 +94,7 @@ }, }); }); - + {% endif %} {% endblock %} diff --git a/InvenTree/build/templates/build/build_base.html b/InvenTree/build/templates/build/build_base.html index c0f6e400b6..177fad8d6c 100644 --- a/InvenTree/build/templates/build/build_base.html +++ b/InvenTree/build/templates/build/build_base.html @@ -230,5 +230,5 @@ src="{% static 'img/blank_image.png' %}" } ); }); - + {% endblock %} \ No newline at end of file diff --git a/InvenTree/build/templates/build/index.html b/InvenTree/build/templates/build/index.html index fbed17bfa3..c336ab9fc1 100644 --- a/InvenTree/build/templates/build/index.html +++ b/InvenTree/build/templates/build/index.html @@ -17,9 +17,9 @@
    - +
    - +
    @@ -66,7 +66,7 @@ + + + diff --git a/InvenTree/templates/clipboard.html b/InvenTree/templates/clipboard.html new file mode 100644 index 0000000000..e40c57a370 --- /dev/null +++ b/InvenTree/templates/clipboard.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 9f6f69a8154176d519ef29bf0644aae108274176 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 9 May 2021 14:29:35 +0200 Subject: [PATCH 48/56] rename for shorter inclusion str --- InvenTree/templates/{clipboard.html => clip.html} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename InvenTree/templates/{clipboard.html => clip.html} (100%) diff --git a/InvenTree/templates/clipboard.html b/InvenTree/templates/clip.html similarity index 100% rename from InvenTree/templates/clipboard.html rename to InvenTree/templates/clip.html From d38c1f6c0b6c651ab6591cee5c130e24067f2747 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 9 May 2021 14:30:39 +0200 Subject: [PATCH 49/56] sample implementation --- InvenTree/part/templates/part/detail.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/InvenTree/part/templates/part/detail.html b/InvenTree/part/templates/part/detail.html index 589e4f2533..9df2f9d542 100644 --- a/InvenTree/part/templates/part/detail.html +++ b/InvenTree/part/templates/part/detail.html @@ -20,20 +20,20 @@
    - + {% if part.IPN %} - + {% endif %} {% if part.revision %} - + {% endif %} {% if part.trackable %} @@ -42,7 +42,7 @@ - + {% if part.variant_of %} @@ -96,7 +96,7 @@ {% endif %} From c148ab9f8e9b0ba8636556d382189c3f5796c452 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 9 May 2021 14:34:52 +0200 Subject: [PATCH 50/56] fixed css-comments --- InvenTree/InvenTree/static/css/inventree.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/InvenTree/InvenTree/static/css/inventree.css b/InvenTree/InvenTree/static/css/inventree.css index e7b8aeb71e..99fff46447 100644 --- a/InvenTree/InvenTree/static/css/inventree.css +++ b/InvenTree/InvenTree/static/css/inventree.css @@ -568,7 +568,7 @@ } .media { - //padding-top: 15px; + /* padding-top: 15px; */ overflow: visible; } @@ -594,8 +594,8 @@ width: 160px; position: fixed; z-index: 1; - //top: 0; - //left: 0; + /* top: 0; + left: 0; */ overflow-x: hidden; padding-top: 20px; padding-right: 25px; @@ -826,7 +826,7 @@ input[type="submit"] { width: 100%; padding: 20px; z-index: 5000; - pointer-events: none; // Prevent this div from blocking links underneath + pointer-events: none; /* Prevent this div from blocking links underneath */ } .alert { From b0a8477a541a70c6e50640afdc19e4b287345503 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 9 May 2021 14:35:33 +0200 Subject: [PATCH 51/56] removes unallowed char --- InvenTree/InvenTree/static/css/inventree.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/InvenTree/static/css/inventree.css b/InvenTree/InvenTree/static/css/inventree.css index 99fff46447..544952e830 100644 --- a/InvenTree/InvenTree/static/css/inventree.css +++ b/InvenTree/InvenTree/static/css/inventree.css @@ -507,7 +507,7 @@ padding-right: 6px; padding-top: 3px; padding-bottom: 2px; -}; +} .panel-heading .badge { float: right; From d9f621c9226d1a087774362501e9ceced2098581 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 10 May 2021 12:29:51 +1000 Subject: [PATCH 52/56] Login redirect fix --- InvenTree/InvenTree/middleware.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/InvenTree/InvenTree/middleware.py b/InvenTree/InvenTree/middleware.py index f30d77ad3b..1f9aa23513 100644 --- a/InvenTree/InvenTree/middleware.py +++ b/InvenTree/InvenTree/middleware.py @@ -78,8 +78,16 @@ class AuthRequiredMiddleware(object): return HttpResponseRedirect(reverse_lazy('login')) login = reverse_lazy('login') + logout = reverse_lazy('logout') - if not request.path_info == login and not request.path_info.startswith('/api/'): + path = request.path_info + + urls = [ + login, + logout, + ] + + if path not in urls and not path.startswith('/api/') and '/admin/logout/' not in path: # Save the 'next' parameter to pass through to the login view return redirect('%s?next=%s' % (login, request.path)) From be31154a444d92496bb5c9b7502aaf53c4513959 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 10 May 2021 12:33:49 +1000 Subject: [PATCH 53/56] Cleaner implementation --- InvenTree/InvenTree/middleware.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/InvenTree/InvenTree/middleware.py b/InvenTree/InvenTree/middleware.py index 1f9aa23513..32ecd33b86 100644 --- a/InvenTree/InvenTree/middleware.py +++ b/InvenTree/InvenTree/middleware.py @@ -77,17 +77,17 @@ class AuthRequiredMiddleware(object): if request.path_info == reverse_lazy('logout'): return HttpResponseRedirect(reverse_lazy('login')) - login = reverse_lazy('login') - logout = reverse_lazy('logout') - path = request.path_info + # List of URL endpoints we *do not* want to redirect to urls = [ - login, - logout, + reverse_lazy('login'), + reverse_lazy('logout'), + reverse_lazy('admin:login'), + reverse_lazy('admin:logout'), ] - if path not in urls and not path.startswith('/api/') and '/admin/logout/' not in path: + if path not in urls and not path.startswith('/api/'): # Save the 'next' parameter to pass through to the login view return redirect('%s?next=%s' % (login, request.path)) From 7e55e343e2cb0d90fb392abaa6e837984b357d4a Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 10 May 2021 12:35:19 +1000 Subject: [PATCH 54/56] PEP fix --- InvenTree/InvenTree/middleware.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/InvenTree/middleware.py b/InvenTree/InvenTree/middleware.py index 32ecd33b86..b905e86795 100644 --- a/InvenTree/InvenTree/middleware.py +++ b/InvenTree/InvenTree/middleware.py @@ -90,7 +90,7 @@ class AuthRequiredMiddleware(object): if path not in urls and not path.startswith('/api/'): # Save the 'next' parameter to pass through to the login view - return redirect('%s?next=%s' % (login, request.path)) + return redirect('%s?next=%s' % (reverse_lazy('login'), request.path)) # Code to be executed for each request/response after # the view is called. From fc83458bdb192fafa0d758cbb82acedd3d974d33 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 10 May 2021 07:53:58 +0200 Subject: [PATCH 55/56] changes as suggested by @SchrodingersGat --- InvenTree/InvenTree/static/css/inventree.css | 1 - InvenTree/templates/clip.html | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/InvenTree/InvenTree/static/css/inventree.css b/InvenTree/InvenTree/static/css/inventree.css index d90b29afc2..26720f360f 100644 --- a/InvenTree/InvenTree/static/css/inventree.css +++ b/InvenTree/InvenTree/static/css/inventree.css @@ -946,6 +946,5 @@ input[type="date"].form-control, input[type="time"].form-control, input[type="da } .clip-btn:hover { - padding: 6px 6px; background: var(--label-grey); } diff --git a/InvenTree/templates/clip.html b/InvenTree/templates/clip.html index e40c57a370..a56ece838c 100644 --- a/InvenTree/templates/clip.html +++ b/InvenTree/templates/clip.html @@ -1,3 +1,5 @@ +{% load i18n %} + - + \ No newline at end of file From 6aab704144bba00ffc5dd759b3e17265c5998c14 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 10 May 2021 19:40:54 +1000 Subject: [PATCH 56/56] Trim content when copying to clipboard --- .../static/script/inventree/inventree.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/InvenTree/InvenTree/static/script/inventree/inventree.js b/InvenTree/InvenTree/static/script/inventree/inventree.js index 0c5cd2426c..b3209ca267 100644 --- a/InvenTree/InvenTree/static/script/inventree/inventree.js +++ b/InvenTree/InvenTree/static/script/inventree/inventree.js @@ -1,3 +1,14 @@ +function attachClipboard(selector) { + + new ClipboardJS(selector, { + text: function(trigger) { + var content = trigger.parentElement.parentElement.textContent; + + return content.trim(); + } + }); +} + function inventreeDocReady() { /* Run this function when the HTML document is loaded. * This will be called for every page that extends "base.html" @@ -50,11 +61,8 @@ function inventreeDocReady() { }); // Initialize clipboard-buttons - new ClipboardJS('.clip-btn', { - text: function(trigger) { - return trigger.parentElement.parentElement.textContent; - } - }); + attachClipboard('.clip-btn'); + } function isFileTransfer(transfer) {
    {% trans 'Part' %}
    {% trans "Part name" %}{{ part.name }}{{ part.name }}{% include "clip.html"%}
    {% trans "IPN" %}{{ part.IPN }}{{ part.IPN }}{% include "clip.html"%}
    {% trans "Revision" %}{{ part.revision }}{{ part.revision }}{% include "clip.html"%}
    {% trans "Latest Serial Number" %} {% if part.getLatestSerialNumber %} - {{ part.getLatestSerialNumber }} + {{ part.getLatestSerialNumber }}{% include "clip.html"%} {% else %} {% trans "No serial numbers recorded" %} {% endif %} @@ -52,7 +52,7 @@
    {% trans "Description" %}{{ part.description }}{{ part.description }}{% include "clip.html"%}
    {% trans "Default Supplier" %} - {{ part.default_supplier.supplier.name }} | {{ part.default_supplier.SKU }} + {{ part.default_supplier.supplier.name }} | {{ part.default_supplier.SKU }}{% include "clip.html"%}