2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-30 04:26:44 +00:00

Merge pull request #642 from SchrodingersGat/rounding-fixes

Rounding fixes
This commit is contained in:
Oliver 2020-02-12 10:31:41 +11:00 committed by GitHub
commit 34c3320cd5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 1342 additions and 488 deletions

View File

@ -1,5 +1,6 @@
function updateAllocationTotal(id, count, required) { function updateAllocationTotal(id, count, required) {
count = parseFloat(count);
$('#allocation-total-'+id).html(count); $('#allocation-total-'+id).html(count);
@ -27,21 +28,24 @@ function loadAllocationTable(table, part_id, part, url, required, button) {
field: 'stock_item_detail', field: 'stock_item_detail',
title: 'Stock Item', title: 'Stock Item',
formatter: function(value, row, index, field) { formatter: function(value, row, index, field) {
return '' + value.quantity + ' x ' + value.part_name + ' @ ' + value.location_name; return '' + parseFloat(value.quantity) + ' x ' + value.part_name + ' @ ' + value.location_name;
} }
}, },
{ {
field: 'stock_item_detail.quantity', field: 'stock_item_detail.quantity',
title: 'Available', title: 'Available',
formatter: function(value, row, index, field) {
return parseFloat(value);
}
}, },
{ {
field: 'quantity', field: 'quantity',
title: 'Allocated', title: 'Allocated',
formatter: function(value, row, index, field) { formatter: function(value, row, index, field) {
var html = value; var html = parseFloat(value);
var bEdit = "<button class='btn btn-primary item-edit-button btn-sm' type='button' title='Edit stock allocation' url='/build/item/" + row.pk + "/edit/'><span class='glyphicon glyphicon-small glyphicon-edit'></span></button>"; var bEdit = "<button class='btn item-edit-button btn-sm' type='button' title='Edit stock allocation' url='/build/item/" + row.pk + "/edit/'><span class='glyphicon glyphicon-small glyphicon-edit'></span></button>";
var bDel = "<button class='btn btn-danger item-del-button btn-sm' type='button' title='Delete stock allocation' url='/build/item/" + row.pk + "/delete/'><span class='glyphicon glyphicon-small glyphicon-trash'></span></button>"; var bDel = "<button class='btn item-del-button btn-sm' type='button' title='Delete stock allocation' url='/build/item/" + row.pk + "/delete/'><span class='glyphicon glyphicon-small glyphicon-trash'></span></button>";
html += "<div class='btn-group' style='float: right;'>" + bEdit + bDel + "</div>"; html += "<div class='btn-group' style='float: right;'>" + bEdit + bDel + "</div>";

View File

@ -385,6 +385,9 @@ function loadStockTrackingTable(table, options) {
cols.push({ cols.push({
field: 'quantity', field: 'quantity',
title: 'Quantity', title: 'Quantity',
formatter: function(value, row, index, field) {
return parseFloat(value);
},
}); });
cols.push({ cols.push({

View File

@ -20,6 +20,7 @@ from markdownx.models import MarkdownxField
from InvenTree.status_codes import BuildStatus from InvenTree.status_codes import BuildStatus
from InvenTree.fields import InvenTreeURLField from InvenTree.fields import InvenTreeURLField
from InvenTree.helpers import decimal2string
from stock.models import StockItem from stock.models import StockItem
from part.models import Part, BomItem from part.models import Part, BomItem
@ -42,7 +43,7 @@ class Build(models.Model):
""" """
def __str__(self): def __str__(self):
return "Build {q} x {part}".format(q=self.quantity, part=str(self.part)) return "Build {q} x {part}".format(q=decimal2string(self.quantity), part=str(self.part))
def get_absolute_url(self): def get_absolute_url(self):
return reverse('build-detail', kwargs={'pk': self.id}) return reverse('build-detail', kwargs={'pk': self.id})

View File

@ -15,7 +15,7 @@
{% block collapse_heading %} {% block collapse_heading %}
<div class='col-sm-2'> <div class='col-sm-2'>
<b>{{ item.sub_part.total_stock }}</b> <b>{% decimal item.sub_part.total_stock %}</b>
</div> </div>
<div class='col-sm-2'> <div class='col-sm-2'>
<b>{% multiply build.quantity item.quantity %}</b> <b>{% multiply build.quantity item.quantity %}</b>

View File

@ -1,7 +1,9 @@
{% extends "modal_delete_form.html" %} {% extends "modal_delete_form.html" %}
{% load i18n %}
{% load inventree_extras %}
{% block pre_form_content %} {% block pre_form_content %}
Are you sure you want to unallocate these parts? {% trans "Are you sure you want to unallocate these parts?" %}
<br> <br>
This will remove {{ item.quantity }} parts from build '{{ item.build.title }}'. This will remove {% decimal item.quantity %} parts from build '{{ item.build.title }}'.
{% endblock %} {% endblock %}

View File

@ -1,9 +1,10 @@
{% extends "modal_form.html" %} {% extends "modal_form.html" %}
{% load i18n %}
{% load inventree_extras %}
{% block pre_form_content %} {% block pre_form_content %}
{{ block.super }} {{ block.super }}
Are you sure you wish to unallocate all stock for this build? {% trans "Are you sure you wish to unallocate all stock for this build?" %}
{% endblock %} {% endblock %}

View File

@ -53,7 +53,7 @@ class BuildCancel(AjaxUpdateView):
model = Build model = Build
ajax_template_name = 'build/cancel.html' ajax_template_name = 'build/cancel.html'
ajax_form_title = 'Cancel Build' ajax_form_title = _('Cancel Build')
context_object_name = 'build' context_object_name = 'build'
form_class = forms.CancelBuildForm form_class = forms.CancelBuildForm
@ -71,12 +71,12 @@ class BuildCancel(AjaxUpdateView):
if confirm: if confirm:
build.cancelBuild(request.user) build.cancelBuild(request.user)
else: else:
form.errors['confirm_cancel'] = ['Confirm build cancellation'] form.errors['confirm_cancel'] = [_('Confirm build cancellation')]
valid = False valid = False
data = { data = {
'form_valid': valid, 'form_valid': valid,
'danger': 'Build was cancelled' 'danger': _('Build was cancelled')
} }
return self.renderJsonResponse(request, form, data=data) return self.renderJsonResponse(request, form, data=data)
@ -92,7 +92,7 @@ class BuildAutoAllocate(AjaxUpdateView):
model = Build model = Build
form_class = forms.ConfirmBuildForm form_class = forms.ConfirmBuildForm
context_object_name = 'build' context_object_name = 'build'
ajax_form_title = 'Allocate Stock' ajax_form_title = _('Allocate Stock')
ajax_template_name = 'build/auto_allocate.html' ajax_template_name = 'build/auto_allocate.html'
def get_context_data(self, *args, **kwargs): def get_context_data(self, *args, **kwargs):
@ -105,7 +105,7 @@ class BuildAutoAllocate(AjaxUpdateView):
context['build'] = build context['build'] = build
context['allocations'] = build.getAutoAllocations() context['allocations'] = build.getAutoAllocations()
except Build.DoesNotExist: except Build.DoesNotExist:
context['error'] = 'No matching build found' context['error'] = _('No matching build found')
return context return context
@ -124,8 +124,8 @@ class BuildAutoAllocate(AjaxUpdateView):
valid = False valid = False
if confirm is False: if confirm is False:
form.errors['confirm'] = ['Confirm stock allocation'] form.errors['confirm'] = [_('Confirm stock allocation')]
form.non_field_errors = 'Check the confirmation box at the bottom of the list' form.non_field_errors = _('Check the confirmation box at the bottom of the list')
else: else:
build.autoAllocate() build.autoAllocate()
valid = True valid = True
@ -145,7 +145,7 @@ class BuildUnallocate(AjaxUpdateView):
model = Build model = Build
form_class = forms.ConfirmBuildForm form_class = forms.ConfirmBuildForm
ajax_form_title = "Unallocate Stock" ajax_form_title = _("Unallocate Stock")
ajax_template_name = "build/unallocate.html" ajax_template_name = "build/unallocate.html"
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
@ -158,8 +158,8 @@ class BuildUnallocate(AjaxUpdateView):
valid = False valid = False
if confirm is False: if confirm is False:
form.errors['confirm'] = ['Confirm unallocation of build stock'] form.errors['confirm'] = [_('Confirm unallocation of build stock')]
form.non_field_errors = 'Check the confirmation box' form.non_field_errors = _('Check the confirmation box')
else: else:
build.unallocateStock() build.unallocateStock()
valid = True valid = True
@ -182,7 +182,7 @@ class BuildComplete(AjaxUpdateView):
model = Build model = Build
form_class = forms.CompleteBuildForm form_class = forms.CompleteBuildForm
context_object_name = "build" context_object_name = "build"
ajax_form_title = "Complete Build" ajax_form_title = _("Complete Build")
ajax_template_name = "build/complete.html" ajax_template_name = "build/complete.html"
def get_form(self): def get_form(self):
@ -255,14 +255,14 @@ class BuildComplete(AjaxUpdateView):
if confirm is False: if confirm is False:
form.errors['confirm'] = [ form.errors['confirm'] = [
'Confirm completion of build', _('Confirm completion of build'),
] ]
else: else:
try: try:
location = StockLocation.objects.get(id=loc_id) location = StockLocation.objects.get(id=loc_id)
valid = True valid = True
except StockLocation.DoesNotExist: except StockLocation.DoesNotExist:
form.errors['location'] = ['Invalid location selected'] form.errors['location'] = [_('Invalid location selected')]
serials = [] serials = []
@ -306,7 +306,7 @@ class BuildComplete(AjaxUpdateView):
def get_data(self): def get_data(self):
""" Provide feedback data back to the form """ """ Provide feedback data back to the form """
return { return {
'info': 'Build marked as COMPLETE' 'info': _('Build marked as COMPLETE')
} }
@ -382,7 +382,7 @@ class BuildCreate(AjaxCreateView):
model = Build model = Build
context_object_name = 'build' context_object_name = 'build'
form_class = forms.EditBuildForm form_class = forms.EditBuildForm
ajax_form_title = 'Start new Build' ajax_form_title = _('Start new Build')
ajax_template_name = 'modal_form.html' ajax_template_name = 'modal_form.html'
def get_initial(self): def get_initial(self):
@ -405,7 +405,7 @@ class BuildCreate(AjaxCreateView):
def get_data(self): def get_data(self):
return { return {
'success': 'Created new build', 'success': _('Created new build'),
} }
@ -415,12 +415,12 @@ class BuildUpdate(AjaxUpdateView):
model = Build model = Build
form_class = forms.EditBuildForm form_class = forms.EditBuildForm
context_object_name = 'build' context_object_name = 'build'
ajax_form_title = 'Edit Build Details' ajax_form_title = _('Edit Build Details')
ajax_template_name = 'modal_form.html' ajax_template_name = 'modal_form.html'
def get_data(self): def get_data(self):
return { return {
'info': 'Edited build', 'info': _('Edited build'),
} }
@ -429,7 +429,7 @@ class BuildDelete(AjaxDeleteView):
model = Build model = Build
ajax_template_name = 'build/delete_build.html' ajax_template_name = 'build/delete_build.html'
ajax_form_title = 'Delete Build' ajax_form_title = _('Delete Build')
class BuildItemDelete(AjaxDeleteView): class BuildItemDelete(AjaxDeleteView):
@ -439,12 +439,12 @@ class BuildItemDelete(AjaxDeleteView):
model = BuildItem model = BuildItem
ajax_template_name = 'build/delete_build_item.html' ajax_template_name = 'build/delete_build_item.html'
ajax_form_title = 'Unallocate Stock' ajax_form_title = _('Unallocate Stock')
context_object_name = 'item' context_object_name = 'item'
def get_data(self): def get_data(self):
return { return {
'danger': 'Removed parts from build allocation' 'danger': _('Removed parts from build allocation')
} }
@ -454,7 +454,7 @@ class BuildItemCreate(AjaxCreateView):
model = BuildItem model = BuildItem
form_class = forms.EditBuildItemForm form_class = forms.EditBuildItemForm
ajax_template_name = 'build/create_build_item.html' ajax_template_name = 'build/create_build_item.html'
ajax_form_title = 'Allocate new Part' ajax_form_title = _('Allocate new Part')
part = None part = None
available_stock = None available_stock = None
@ -570,11 +570,11 @@ class BuildItemEdit(AjaxUpdateView):
model = BuildItem model = BuildItem
ajax_template_name = 'modal_form.html' ajax_template_name = 'modal_form.html'
form_class = forms.EditBuildItemForm form_class = forms.EditBuildItemForm
ajax_form_title = 'Edit Stock Allocation' ajax_form_title = _('Edit Stock Allocation')
def get_data(self): def get_data(self):
return { return {
'info': 'Updated Build Item', 'info': _('Updated Build Item'),
} }
def get_form(self): def get_form(self):

View File

@ -5,6 +5,8 @@ Django views for interacting with common models
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.utils.translation import ugettext as _
from InvenTree.views import AjaxCreateView, AjaxUpdateView, AjaxDeleteView from InvenTree.views import AjaxCreateView, AjaxUpdateView, AjaxDeleteView
from . import models from . import models
@ -16,7 +18,7 @@ class CurrencyCreate(AjaxCreateView):
model = models.Currency model = models.Currency
form_class = forms.CurrencyEditForm form_class = forms.CurrencyEditForm
ajax_form_title = 'Create new Currency' ajax_form_title = _('Create new Currency')
class CurrencyEdit(AjaxUpdateView): class CurrencyEdit(AjaxUpdateView):
@ -24,12 +26,12 @@ class CurrencyEdit(AjaxUpdateView):
model = models.Currency model = models.Currency
form_class = forms.CurrencyEditForm form_class = forms.CurrencyEditForm
ajax_form_title = 'Edit Currency' ajax_form_title = _('Edit Currency')
class CurrencyDelete(AjaxDeleteView): class CurrencyDelete(AjaxDeleteView):
""" View for deleting an existing Currency object """ """ View for deleting an existing Currency object """
model = models.Currency model = models.Currency
ajax_form_title = 'Delete Currency' ajax_form_title = _('Delete Currency')
ajax_template_name = "common/delete_currency.html" ajax_template_name = "common/delete_currency.html"

View File

@ -6,6 +6,7 @@ Django views for interacting with Company app
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.utils.translation import ugettext as _
from django.views.generic import DetailView, ListView, UpdateView from django.views.generic import DetailView, ListView, UpdateView
from django.urls import reverse from django.urls import reverse
@ -93,12 +94,12 @@ class CompanyImage(AjaxUpdateView):
""" View for uploading an image for the Company """ """ View for uploading an image for the Company """
model = Company model = Company
ajax_template_name = 'modal_form.html' ajax_template_name = 'modal_form.html'
ajax_form_title = 'Update Company Image' ajax_form_title = _('Update Company Image')
form_class = CompanyImageForm form_class = CompanyImageForm
def get_data(self): def get_data(self):
return { return {
'success': 'Updated company image', 'success': _('Updated company image'),
} }
@ -108,11 +109,11 @@ class CompanyEdit(AjaxUpdateView):
form_class = EditCompanyForm form_class = EditCompanyForm
context_object_name = 'company' context_object_name = 'company'
ajax_template_name = 'modal_form.html' ajax_template_name = 'modal_form.html'
ajax_form_title = 'Edit Company' ajax_form_title = _('Edit Company')
def get_data(self): def get_data(self):
return { return {
'info': 'Edited company information', 'info': _('Edited company information'),
} }
@ -122,11 +123,11 @@ class CompanyCreate(AjaxCreateView):
context_object_name = 'company' context_object_name = 'company'
form_class = EditCompanyForm form_class = EditCompanyForm
ajax_template_name = 'modal_form.html' ajax_template_name = 'modal_form.html'
ajax_form_title = "Create new Company" ajax_form_title = _("Create new Company")
def get_data(self): def get_data(self):
return { return {
'success': "Created new company", 'success': _("Created new company"),
} }
@ -136,12 +137,12 @@ class CompanyDelete(AjaxDeleteView):
model = Company model = Company
success_url = '/company/' success_url = '/company/'
ajax_template_name = 'company/delete.html' ajax_template_name = 'company/delete.html'
ajax_form_title = 'Delete Company' ajax_form_title = _('Delete Company')
context_object_name = 'company' context_object_name = 'company'
def get_data(self): def get_data(self):
return { return {
'danger': 'Company was deleted', 'danger': _('Company was deleted'),
} }
@ -166,7 +167,7 @@ class SupplierPartEdit(AjaxUpdateView):
context_object_name = 'part' context_object_name = 'part'
form_class = EditSupplierPartForm form_class = EditSupplierPartForm
ajax_template_name = 'modal_form.html' ajax_template_name = 'modal_form.html'
ajax_form_title = 'Edit Supplier Part' ajax_form_title = _('Edit Supplier Part')
class SupplierPartCreate(AjaxCreateView): class SupplierPartCreate(AjaxCreateView):
@ -175,7 +176,7 @@ class SupplierPartCreate(AjaxCreateView):
model = SupplierPart model = SupplierPart
form_class = EditSupplierPartForm form_class = EditSupplierPartForm
ajax_template_name = 'modal_form.html' ajax_template_name = 'modal_form.html'
ajax_form_title = 'Create new Supplier Part' ajax_form_title = _('Create new Supplier Part')
context_object_name = 'part' context_object_name = 'part'
def get_form(self): def get_form(self):
@ -232,7 +233,7 @@ class SupplierPartDelete(AjaxDeleteView):
success_url = '/supplier/' success_url = '/supplier/'
ajax_template_name = 'company/partdelete.html' ajax_template_name = 'company/partdelete.html'
ajax_form_title = 'Delete Supplier Part' ajax_form_title = _('Delete Supplier Part')
parts = [] parts = []
@ -302,7 +303,7 @@ class PriceBreakCreate(AjaxCreateView):
model = SupplierPriceBreak model = SupplierPriceBreak
form_class = EditPriceBreakForm form_class = EditPriceBreakForm
ajax_form_title = 'Add Price Break' ajax_form_title = _('Add Price Break')
ajax_template_name = 'modal_form.html' ajax_template_name = 'modal_form.html'
def get_data(self): def get_data(self):
@ -337,7 +338,7 @@ class PriceBreakEdit(AjaxUpdateView):
model = SupplierPriceBreak model = SupplierPriceBreak
form_class = EditPriceBreakForm form_class = EditPriceBreakForm
ajax_form_title = 'Edit Price Break' ajax_form_title = _('Edit Price Break')
ajax_template_name = 'modal_form.html' ajax_template_name = 'modal_form.html'
def get_form(self): def get_form(self):
@ -352,5 +353,5 @@ class PriceBreakDelete(AjaxDeleteView):
""" View for deleting a supplier price break """ """ View for deleting a supplier price break """
model = SupplierPriceBreak model = SupplierPriceBreak
ajax_form_title = "Delete Price Break" ajax_form_title = _("Delete Price Break")
ajax_template_name = 'modal_delete_form.html' ajax_template_name = 'modal_delete_form.html'

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-02-10 11:09+0000\n" "POT-Creation-Date: 2020-02-11 23:25+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -104,7 +104,7 @@ msgstr ""
#: InvenTree/status_codes.py:92 build/templates/build/allocate_edit.html:28 #: InvenTree/status_codes.py:92 build/templates/build/allocate_edit.html:28
#: build/templates/build/allocate_view.html:21 #: build/templates/build/allocate_view.html:21
#: part/templates/part/part_base.html:116 part/templates/part/tabs.html:21 #: part/templates/part/part_base.html:106 part/templates/part/tabs.html:21
msgid "Allocated" msgid "Allocated"
msgstr "" msgstr ""
@ -149,59 +149,59 @@ msgstr ""
msgid "Confirm build completion" msgid "Confirm build completion"
msgstr "" msgstr ""
#: build/models.py:53 #: build/models.py:54
msgid "Brief description of the build" msgid "Brief description of the build"
msgstr "" msgstr ""
#: build/models.py:62 #: build/models.py:63
msgid "Select part to build" msgid "Select part to build"
msgstr "" msgstr ""
#: build/models.py:68 #: build/models.py:69
msgid "" msgid ""
"Select location to take stock from for this build (leave blank to take from " "Select location to take stock from for this build (leave blank to take from "
"any stock location)" "any stock location)"
msgstr "" msgstr ""
#: build/models.py:74 #: build/models.py:75
msgid "Number of parts to build" msgid "Number of parts to build"
msgstr "" msgstr ""
#: build/models.py:80 #: build/models.py:81
msgid "Build status" msgid "Build status"
msgstr "" msgstr ""
#: build/models.py:83 #: build/models.py:84
msgid "Batch code for this build output" msgid "Batch code for this build output"
msgstr "" msgstr ""
#: build/models.py:95 #: build/models.py:96
msgid "Link to external URL" msgid "Link to external URL"
msgstr "" msgstr ""
#: build/models.py:97 #: build/models.py:98
msgid "Extra build notes" msgid "Extra build notes"
msgstr "" msgstr ""
#: build/models.py:382 #: build/models.py:383
#, python-brace-format #, python-brace-format
msgid "Selected stock item not found in BOM for part '{p}'" msgid "Selected stock item not found in BOM for part '{p}'"
msgstr "" msgstr ""
#: build/models.py:385 #: build/models.py:386
#, python-brace-format #, python-brace-format
msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
msgstr "" msgstr ""
#: build/models.py:403 #: build/models.py:404
msgid "Build to allocate parts" msgid "Build to allocate parts"
msgstr "" msgstr ""
#: build/models.py:410 #: build/models.py:411
msgid "Stock Item to allocate to build" msgid "Stock Item to allocate to build"
msgstr "" msgstr ""
#: build/models.py:418 #: build/models.py:419
msgid "Stock quantity to allocate to build" msgid "Stock quantity to allocate to build"
msgstr "" msgstr ""
@ -244,7 +244,7 @@ msgid "Allocate"
msgstr "" msgstr ""
#: build/templates/build/allocate_view.html:10 #: build/templates/build/allocate_view.html:10
#: company/templates/company/detail_part.html:18 #: company/templates/company/detail_part.html:18 order/views.py:448
msgid "Order Parts" msgid "Order Parts"
msgstr "" msgstr ""
@ -257,10 +257,14 @@ msgid "Description"
msgstr "" msgstr ""
#: build/templates/build/allocate_view.html:22 #: build/templates/build/allocate_view.html:22
#: part/templates/part/part_base.html:122 #: part/templates/part/part_base.html:112
msgid "On Order" msgid "On Order"
msgstr "" msgstr ""
#: build/templates/build/delete_build_item.html:6
msgid "Are you sure you want to unallocate these parts?"
msgstr ""
#: build/templates/build/detail.html:8 #: build/templates/build/detail.html:8
msgid "Build Details" msgid "Build Details"
msgstr "" msgstr ""
@ -298,7 +302,7 @@ msgstr ""
#: build/templates/build/detail.html:42 #: build/templates/build/detail.html:42
#: company/templates/company/detail_part.html:90 #: company/templates/company/detail_part.html:90
#: company/templates/company/partdetail.html:54 #: company/templates/company/partdetail.html:54
#: part/templates/part/detail.html:50 part/templates/part/part_base.html:91 #: part/templates/part/detail.html:50 part/templates/part/part_base.html:81
#: stock/templates/stock/item_base.html:120 #: stock/templates/stock/item_base.html:120
msgid "URL" msgid "URL"
msgstr "" msgstr ""
@ -355,11 +359,107 @@ msgstr ""
msgid "Assign Parts" msgid "Assign Parts"
msgstr "" msgstr ""
#: build/templates/build/unallocate.html:8
msgid "Are you sure you wish to unallocate all stock for this build?"
msgstr ""
#: build/views.py:56
msgid "Cancel Build"
msgstr ""
#: build/views.py:74
msgid "Confirm build cancellation"
msgstr ""
#: build/views.py:79
msgid "Build was cancelled"
msgstr ""
#: build/views.py:95
msgid "Allocate Stock"
msgstr ""
#: build/views.py:108
msgid "No matching build found"
msgstr ""
#: build/views.py:127
msgid "Confirm stock allocation"
msgstr ""
#: build/views.py:128
msgid "Check the confirmation box at the bottom of the list"
msgstr ""
#: build/views.py:148 build/views.py:442
msgid "Unallocate Stock"
msgstr ""
#: build/views.py:161
msgid "Confirm unallocation of build stock"
msgstr ""
#: build/views.py:162
msgid "Check the confirmation box"
msgstr ""
#: build/views.py:185
msgid "Complete Build"
msgstr ""
#: build/views.py:258
msgid "Confirm completion of build"
msgstr ""
#: build/views.py:265
msgid "Invalid location selected"
msgstr ""
#: build/views.py:290 stock/views.py:884 #: build/views.py:290 stock/views.py:884
#, python-brace-format #, python-brace-format
msgid "The following serial numbers already exist: ({sn})" msgid "The following serial numbers already exist: ({sn})"
msgstr "" msgstr ""
#: build/views.py:309
msgid "Build marked as COMPLETE"
msgstr ""
#: build/views.py:385
msgid "Start new Build"
msgstr ""
#: build/views.py:408
msgid "Created new build"
msgstr ""
#: build/views.py:418
msgid "Edit Build Details"
msgstr ""
#: build/views.py:423
msgid "Edited build"
msgstr ""
#: build/views.py:432
msgid "Delete Build"
msgstr ""
#: build/views.py:447
msgid "Removed parts from build allocation"
msgstr ""
#: build/views.py:457
msgid "Allocate new Part"
msgstr ""
#: build/views.py:573
msgid "Edit Stock Allocation"
msgstr ""
#: build/views.py:577
msgid "Updated Build Item"
msgstr ""
#: common/models.py:69 #: common/models.py:69
msgid "Settings key (must be unique - case insensitive" msgid "Settings key (must be unique - case insensitive"
msgstr "" msgstr ""
@ -396,6 +496,18 @@ msgstr ""
msgid "Use this currency as the base currency" msgid "Use this currency as the base currency"
msgstr "" msgstr ""
#: common/views.py:21
msgid "Create new Currency"
msgstr ""
#: common/views.py:29
msgid "Edit Currency"
msgstr ""
#: common/views.py:36
msgid "Delete Currency"
msgstr ""
#: company/models.py:74 #: company/models.py:74
msgid "Company name" msgid "Company name"
msgstr "" msgstr ""
@ -643,6 +755,62 @@ msgstr ""
msgid "Sales Orders" msgid "Sales Orders"
msgstr "" msgstr ""
#: company/views.py:97
msgid "Update Company Image"
msgstr ""
#: company/views.py:102
msgid "Updated company image"
msgstr ""
#: company/views.py:112
msgid "Edit Company"
msgstr ""
#: company/views.py:116
msgid "Edited company information"
msgstr ""
#: company/views.py:126
msgid "Create new Company"
msgstr ""
#: company/views.py:130
msgid "Created new company"
msgstr ""
#: company/views.py:140
msgid "Delete Company"
msgstr ""
#: company/views.py:145
msgid "Company was deleted"
msgstr ""
#: company/views.py:170
msgid "Edit Supplier Part"
msgstr ""
#: company/views.py:179
msgid "Create new Supplier Part"
msgstr ""
#: company/views.py:236
msgid "Delete Supplier Part"
msgstr ""
#: company/views.py:306
msgid "Add Price Break"
msgstr ""
#: company/views.py:341
msgid "Edit Price Break"
msgstr ""
#: company/views.py:356
msgid "Delete Price Break"
msgstr ""
#: order/forms.py:21 #: order/forms.py:21
msgid "Place order" msgid "Place order"
msgstr "" msgstr ""
@ -675,7 +843,7 @@ msgstr ""
msgid "Order notes" msgid "Order notes"
msgstr "" msgstr ""
#: order/models.py:159 order/models.py:210 part/views.py:1080 #: order/models.py:159 order/models.py:210 part/views.py:1109
#: stock/models.py:440 #: stock/models.py:440
msgid "Quantity must be greater than zero" msgid "Quantity must be greater than zero"
msgstr "" msgstr ""
@ -730,7 +898,7 @@ msgstr ""
msgid "Order Notes" msgid "Order Notes"
msgstr "" msgstr ""
#: order/templates/order/purchase_order_detail.html:15 #: order/templates/order/purchase_order_detail.html:15 order/views.py:747
msgid "Add Line Item" msgid "Add Line Item"
msgstr "" msgstr ""
@ -754,14 +922,38 @@ msgstr ""
msgid "Items" msgid "Items"
msgstr "" msgstr ""
#: order/views.py:99
msgid "Create Purchase Order"
msgstr ""
#: order/views.py:129
msgid "Edit Purchase Order"
msgstr ""
#: order/views.py:149
msgid "Cancel Order"
msgstr ""
#: order/views.py:164 #: order/views.py:164
msgid "Confirm order cancellation" msgid "Confirm order cancellation"
msgstr "" msgstr ""
#: order/views.py:182
msgid "Issue Order"
msgstr ""
#: order/views.py:197 #: order/views.py:197
msgid "Confirm order placement" msgid "Confirm order placement"
msgstr "" msgstr ""
#: order/views.py:218
msgid "Complete Order"
msgstr ""
#: order/views.py:284
msgid "Receive Parts"
msgstr ""
#: order/views.py:351 #: order/views.py:351
msgid "Items received" msgid "Items received"
msgstr "" msgstr ""
@ -794,220 +986,248 @@ msgstr ""
msgid "Invalid SupplierPart selection" msgid "Invalid SupplierPart selection"
msgstr "" msgstr ""
#: part/bom.py:107 #: order/views.py:862
msgid "Edit Line Item"
msgstr ""
#: order/views.py:878
msgid "Delete Line Item"
msgstr ""
#: order/views.py:883
msgid "Deleted line item"
msgstr ""
#: part/bom.py:140
#, python-brace-format #, python-brace-format
msgid "Unsupported file format: {f}" msgid "Unsupported file format: {f}"
msgstr "" msgstr ""
#: part/bom.py:112 #: part/bom.py:145
msgid "Error reading BOM file (invalid data)" msgid "Error reading BOM file (invalid data)"
msgstr "" msgstr ""
#: part/bom.py:114 #: part/bom.py:147
msgid "Error reading BOM file (incorrect row size)" msgid "Error reading BOM file (incorrect row size)"
msgstr "" msgstr ""
#: part/forms.py:37 #: part/forms.py:37 stock/forms.py:91
msgid "File Format"
msgstr ""
#: part/forms.py:37 stock/forms.py:91
msgid "Select output file format"
msgstr ""
#: part/forms.py:39
msgid "Cascading"
msgstr ""
#: part/forms.py:39
msgid "Download cascading / multi-level BOM"
msgstr ""
#: part/forms.py:58
msgid "Confirm that the BOM is correct" msgid "Confirm that the BOM is correct"
msgstr "" msgstr ""
#: part/forms.py:49 #: part/forms.py:70
msgid "Select BOM file to upload" msgid "Select BOM file to upload"
msgstr "" msgstr ""
#: part/forms.py:73 #: part/forms.py:94
msgid "Select part category" msgid "Select part category"
msgstr "" msgstr ""
#: part/forms.py:81 #: part/forms.py:102
msgid "Perform 'deep copy' which will duplicate all BOM data for this part" msgid "Perform 'deep copy' which will duplicate all BOM data for this part"
msgstr "" msgstr ""
#: part/forms.py:86 #: part/forms.py:107
msgid "Confirm part creation" msgid "Confirm part creation"
msgstr "" msgstr ""
#: part/forms.py:172 #: part/forms.py:193
msgid "Input quantity for price calculation" msgid "Input quantity for price calculation"
msgstr "" msgstr ""
#: part/forms.py:175 #: part/forms.py:196
msgid "Select currency for price calculation" msgid "Select currency for price calculation"
msgstr "" msgstr ""
#: part/models.py:57 #: part/models.py:59
msgid "Default location for parts in this category" msgid "Default location for parts in this category"
msgstr "" msgstr ""
#: part/models.py:60 #: part/models.py:62
msgid "Default keywords for parts in this category" msgid "Default keywords for parts in this category"
msgstr "" msgstr ""
#: part/models.py:309 #: part/models.py:323
msgid "Part must be unique for name, IPN and revision" msgid "Part must be unique for name, IPN and revision"
msgstr "" msgstr ""
#: part/models.py:323 #: part/models.py:337
msgid "Part cannot be a template part if it is a variant of another part" msgid "Part cannot be a template part if it is a variant of another part"
msgstr "" msgstr ""
#: part/models.py:324 #: part/models.py:338
msgid "Part cannot be a variant of another part if it is already a template" msgid "Part cannot be a variant of another part if it is already a template"
msgstr "" msgstr ""
#: part/models.py:328 part/templates/part/detail.html:17 #: part/models.py:342 part/templates/part/detail.html:17
msgid "Part name" msgid "Part name"
msgstr "" msgstr ""
#: part/models.py:332 #: part/models.py:346
msgid "Is this part a template part?" msgid "Is this part a template part?"
msgstr "" msgstr ""
#: part/models.py:341 #: part/models.py:355
msgid "Is this part a variant of another part?" msgid "Is this part a variant of another part?"
msgstr "" msgstr ""
#: part/models.py:343 #: part/models.py:357
msgid "Part description" msgid "Part description"
msgstr "" msgstr ""
#: part/models.py:345 #: part/models.py:359
msgid "Part keywords to improve visibility in search results" msgid "Part keywords to improve visibility in search results"
msgstr "" msgstr ""
#: part/models.py:350 #: part/models.py:364
msgid "Part category" msgid "Part category"
msgstr "" msgstr ""
#: part/models.py:352 #: part/models.py:366
msgid "Internal Part Number" msgid "Internal Part Number"
msgstr "" msgstr ""
#: part/models.py:354 #: part/models.py:368
msgid "Part revision or version number" msgid "Part revision or version number"
msgstr "" msgstr ""
#: part/models.py:356 #: part/models.py:370
msgid "Link to extenal URL" msgid "Link to extenal URL"
msgstr "" msgstr ""
#: part/models.py:362 #: part/models.py:376
msgid "Where is this item normally stored?" msgid "Where is this item normally stored?"
msgstr "" msgstr ""
#: part/models.py:406 #: part/models.py:420
msgid "Default supplier part" msgid "Default supplier part"
msgstr "" msgstr ""
#: part/models.py:409 #: part/models.py:423
msgid "Minimum allowed stock level" msgid "Minimum allowed stock level"
msgstr "" msgstr ""
#: part/models.py:411 #: part/models.py:425
msgid "Stock keeping units for this part" msgid "Stock keeping units for this part"
msgstr "" msgstr ""
#: part/models.py:413 #: part/models.py:427
msgid "Can this part be built from other parts?" msgid "Can this part be built from other parts?"
msgstr "" msgstr ""
#: part/models.py:415 #: part/models.py:429
msgid "Can this part be used to build other parts?" msgid "Can this part be used to build other parts?"
msgstr "" msgstr ""
#: part/models.py:417 #: part/models.py:431
msgid "Does this part have tracking for unique items?" msgid "Does this part have tracking for unique items?"
msgstr "" msgstr ""
#: part/models.py:419 #: part/models.py:433
msgid "Can this part be purchased from external suppliers?" msgid "Can this part be purchased from external suppliers?"
msgstr "" msgstr ""
#: part/models.py:421 #: part/models.py:435
msgid "Can this part be sold to customers?" msgid "Can this part be sold to customers?"
msgstr "" msgstr ""
#: part/models.py:423 #: part/models.py:437
msgid "Is this part active?" msgid "Is this part active?"
msgstr "" msgstr ""
#: part/models.py:425 #: part/models.py:439
msgid "Is this a virtual part, such as a software product or license?" msgid "Is this a virtual part, such as a software product or license?"
msgstr "" msgstr ""
#: part/models.py:427 #: part/models.py:441
msgid "Part notes - supports Markdown formatting" msgid "Part notes - supports Markdown formatting"
msgstr "" msgstr ""
#: part/models.py:429 #: part/models.py:443
msgid "Stored BOM checksum" msgid "Stored BOM checksum"
msgstr "" msgstr ""
#: part/models.py:936 #: part/models.py:948
msgid "Select file to attach" msgid "Select file to attach"
msgstr "" msgstr ""
#: part/models.py:938 #: part/models.py:950
msgid "File comment" msgid "File comment"
msgstr "" msgstr ""
#: part/models.py:993 #: part/models.py:1005
msgid "Parameter template name must be unique" msgid "Parameter template name must be unique"
msgstr "" msgstr ""
#: part/models.py:998 #: part/models.py:1010
msgid "Parameter Name" msgid "Parameter Name"
msgstr "" msgstr ""
#: part/models.py:1000 #: part/models.py:1012
msgid "Parameter Units" msgid "Parameter Units"
msgstr "" msgstr ""
#: part/models.py:1026 #: part/models.py:1038
msgid "Parent Part" msgid "Parent Part"
msgstr "" msgstr ""
#: part/models.py:1028 #: part/models.py:1040
msgid "Parameter Template" msgid "Parameter Template"
msgstr "" msgstr ""
#: part/models.py:1030 #: part/models.py:1042
msgid "Parameter Value" msgid "Parameter Value"
msgstr "" msgstr ""
#: part/models.py:1054 #: part/models.py:1066
msgid "Select parent part" msgid "Select parent part"
msgstr "" msgstr ""
#: part/models.py:1062 #: part/models.py:1074
msgid "Select part to be used in BOM" msgid "Select part to be used in BOM"
msgstr "" msgstr ""
#: part/models.py:1068 #: part/models.py:1080
msgid "BOM quantity for this BOM item" msgid "BOM quantity for this BOM item"
msgstr "" msgstr ""
#: part/models.py:1071 #: part/models.py:1083
msgid "Estimated build wastage quantity (absolute or percentage)" msgid "Estimated build wastage quantity (absolute or percentage)"
msgstr "" msgstr ""
#: part/models.py:1074 #: part/models.py:1086
msgid "BOM item reference" msgid "BOM item reference"
msgstr "" msgstr ""
#: part/models.py:1077 #: part/models.py:1089
msgid "BOM item notes" msgid "BOM item notes"
msgstr "" msgstr ""
#: part/models.py:1079 #: part/models.py:1091
msgid "BOM line checksum" msgid "BOM line checksum"
msgstr "" msgstr ""
#: part/models.py:1142 #: part/models.py:1154
msgid "Part cannot be added to its own Bill of Materials" msgid "Part cannot be added to its own Bill of Materials"
msgstr "" msgstr ""
#: part/models.py:1149 #: part/models.py:1161
#, python-brace-format #, python-brace-format
msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)"
msgstr "" msgstr ""
@ -1028,7 +1248,7 @@ msgstr ""
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: part/templates/part/attachments.html:34 #: part/templates/part/attachments.html:34 part/views.py:118
msgid "Edit attachment" msgid "Edit attachment"
msgstr "" msgstr ""
@ -1077,7 +1297,7 @@ msgstr ""
msgid "Part Details" msgid "Part Details"
msgstr "" msgstr ""
#: part/templates/part/detail.html:22 part/templates/part/part_base.html:85 #: part/templates/part/detail.html:22 part/templates/part/part_base.html:75
msgid "IPN" msgid "IPN"
msgstr "" msgstr ""
@ -1181,34 +1401,42 @@ msgstr ""
msgid "This part is not active" msgid "This part is not active"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:47 #: part/templates/part/part_base.html:37
msgid "Star this part" msgid "Star this part"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:53 #: part/templates/part/part_base.html:43
msgid "Show pricing information" msgid "Show pricing information"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:105 #: part/templates/part/part_base.html:95
msgid "Available Stock" msgid "Available Stock"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:110 #: part/templates/part/part_base.html:100
msgid "In Stock" msgid "In Stock"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:131 #: part/templates/part/part_base.html:121
msgid "Build Status" msgid "Build Status"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:135 #: part/templates/part/part_base.html:125
msgid "Can Build" msgid "Can Build"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:140 #: part/templates/part/part_base.html:130
msgid "Underway" msgid "Underway"
msgstr "" msgstr ""
#: part/templates/part/part_thumb.html:16
msgid "Select from existing images"
msgstr ""
#: part/templates/part/part_thumb.html:17
msgid "Upload new image"
msgstr ""
#: part/templates/part/tabs.html:9 #: part/templates/part/tabs.html:9
msgid "Parameters" msgid "Parameters"
msgstr "" msgstr ""
@ -1242,151 +1470,175 @@ msgstr ""
msgid "Attachments" msgid "Attachments"
msgstr "" msgstr ""
#: part/views.py:77 #: part/views.py:75
msgid "Add part attachment"
msgstr ""
#: part/views.py:80
msgid "Added attachment" msgid "Added attachment"
msgstr "" msgstr ""
#: part/views.py:119 #: part/views.py:122
msgid "Part attachment updated" msgid "Part attachment updated"
msgstr "" msgstr ""
#: part/views.py:196 #: part/views.py:137
msgid "Delete Part Attachment"
msgstr ""
#: part/views.py:143
msgid "Deleted part attachment"
msgstr ""
#: part/views.py:151
msgid "Set Part Category"
msgstr ""
#: part/views.py:199
#, python-brace-format #, python-brace-format
msgid "Set category for {n} parts" msgid "Set category for {n} parts"
msgstr "" msgstr ""
#: part/views.py:306 #: part/views.py:234
msgid "Create Variant"
msgstr ""
#: part/views.py:304
msgid "Duplicate Part"
msgstr ""
#: part/views.py:309
msgid "Copied part" msgid "Copied part"
msgstr "" msgstr ""
#: part/views.py:414 #: part/views.py:417
msgid "Create new part" msgid "Create new part"
msgstr "" msgstr ""
#: part/views.py:419 #: part/views.py:422
msgid "Created new part" msgid "Created new part"
msgstr "" msgstr ""
#: part/views.py:609 #: part/views.py:595
msgid "Part QR Code"
msgstr ""
#: part/views.py:612
msgid "Upload Part Image" msgid "Upload Part Image"
msgstr "" msgstr ""
#: part/views.py:614 #: part/views.py:617 part/views.py:652
msgid "Updated part image" msgid "Updated part image"
msgstr "" msgstr ""
#: part/views.py:623 #: part/views.py:626
msgid "Select Part Image" msgid "Select Part Image"
msgstr "" msgstr ""
#: part/views.py:627 #: part/views.py:655
msgid "Selected part image" msgid "Part image not found"
msgstr "" msgstr ""
#: part/views.py:637 #: part/views.py:666
msgid "Edit Part Properties" msgid "Edit Part Properties"
msgstr "" msgstr ""
#: part/views.py:659 #: part/views.py:688
msgid "Validate BOM" msgid "Validate BOM"
msgstr "" msgstr ""
#: part/views.py:821 #: part/views.py:850
msgid "No BOM file provided" msgid "No BOM file provided"
msgstr "" msgstr ""
#: part/views.py:1082 #: part/views.py:1111
msgid "Enter a valid quantity" msgid "Enter a valid quantity"
msgstr "" msgstr ""
#: part/views.py:1106 part/views.py:1109 #: part/views.py:1135 part/views.py:1138
msgid "Select valid part" msgid "Select valid part"
msgstr "" msgstr ""
#: part/views.py:1115 #: part/views.py:1144
msgid "Duplicate part selected" msgid "Duplicate part selected"
msgstr "" msgstr ""
#: part/views.py:1143 #: part/views.py:1172
msgid "Select a part" msgid "Select a part"
msgstr "" msgstr ""
#: part/views.py:1147 #: part/views.py:1176
msgid "Specify quantity" msgid "Specify quantity"
msgstr "" msgstr ""
#: part/views.py:1324 #: part/views.py:1356
msgid "Export Bill of Materials"
msgstr ""
#: part/views.py:1396
msgid "Confirm Part Deletion" msgid "Confirm Part Deletion"
msgstr "" msgstr ""
#: part/views.py:1331 #: part/views.py:1403
msgid "Part was deleted" msgid "Part was deleted"
msgstr "" msgstr ""
#: part/views.py:1340 #: part/views.py:1412
msgid "Part Pricing" msgid "Part Pricing"
msgstr "" msgstr ""
#: part/views.py:1462 #: part/views.py:1534
msgid "Create Part Parameter Template" msgid "Create Part Parameter Template"
msgstr "" msgstr ""
#: part/views.py:1470 #: part/views.py:1542
msgid "Edit Part Parameter Template" msgid "Edit Part Parameter Template"
msgstr "" msgstr ""
#: part/views.py:1477 #: part/views.py:1549
msgid "Delete Part Parameter Template" msgid "Delete Part Parameter Template"
msgstr "" msgstr ""
#: part/views.py:1485 #: part/views.py:1557
msgid "Create Part Parameter" msgid "Create Part Parameter"
msgstr "" msgstr ""
#: part/views.py:1535 #: part/views.py:1607
msgid "Edit Part Parameter" msgid "Edit Part Parameter"
msgstr "" msgstr ""
#: part/views.py:1549 #: part/views.py:1621
msgid "Delete Part Parameter" msgid "Delete Part Parameter"
msgstr "" msgstr ""
#: part/views.py:1565 #: part/views.py:1637
msgid "Edit Part Category" msgid "Edit Part Category"
msgstr "" msgstr ""
#: part/views.py:1600 #: part/views.py:1672
msgid "Delete Part Category" msgid "Delete Part Category"
msgstr "" msgstr ""
#: part/views.py:1606 #: part/views.py:1678
msgid "Part category was deleted" msgid "Part category was deleted"
msgstr "" msgstr ""
#: part/views.py:1614 #: part/views.py:1686
msgid "Create new part category" msgid "Create new part category"
msgstr "" msgstr ""
#: part/views.py:1665 #: part/views.py:1737
msgid "Create BOM item" msgid "Create BOM item"
msgstr "" msgstr ""
#: part/views.py:1731 #: part/views.py:1803
msgid "Edit BOM item" msgid "Edit BOM item"
msgstr "" msgstr ""
#: part/views.py:1779 #: part/views.py:1851
msgid "Confim BOM item deletion" msgid "Confim BOM item deletion"
msgstr "" msgstr ""
#: stock/forms.py:91
msgid "File Format"
msgstr ""
#: stock/forms.py:91
msgid "Select output file format"
msgstr ""
#: stock/forms.py:93 #: stock/forms.py:93
msgid "Include stock items in sub locations" msgid "Include stock items in sub locations"
msgstr "" msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-02-10 11:09+0000\n" "POT-Creation-Date: 2020-02-11 23:25+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -104,7 +104,7 @@ msgstr ""
#: InvenTree/status_codes.py:92 build/templates/build/allocate_edit.html:28 #: InvenTree/status_codes.py:92 build/templates/build/allocate_edit.html:28
#: build/templates/build/allocate_view.html:21 #: build/templates/build/allocate_view.html:21
#: part/templates/part/part_base.html:116 part/templates/part/tabs.html:21 #: part/templates/part/part_base.html:106 part/templates/part/tabs.html:21
msgid "Allocated" msgid "Allocated"
msgstr "" msgstr ""
@ -149,59 +149,59 @@ msgstr ""
msgid "Confirm build completion" msgid "Confirm build completion"
msgstr "" msgstr ""
#: build/models.py:53 #: build/models.py:54
msgid "Brief description of the build" msgid "Brief description of the build"
msgstr "" msgstr ""
#: build/models.py:62 #: build/models.py:63
msgid "Select part to build" msgid "Select part to build"
msgstr "" msgstr ""
#: build/models.py:68 #: build/models.py:69
msgid "" msgid ""
"Select location to take stock from for this build (leave blank to take from " "Select location to take stock from for this build (leave blank to take from "
"any stock location)" "any stock location)"
msgstr "" msgstr ""
#: build/models.py:74 #: build/models.py:75
msgid "Number of parts to build" msgid "Number of parts to build"
msgstr "" msgstr ""
#: build/models.py:80 #: build/models.py:81
msgid "Build status" msgid "Build status"
msgstr "" msgstr ""
#: build/models.py:83 #: build/models.py:84
msgid "Batch code for this build output" msgid "Batch code for this build output"
msgstr "" msgstr ""
#: build/models.py:95 #: build/models.py:96
msgid "Link to external URL" msgid "Link to external URL"
msgstr "" msgstr ""
#: build/models.py:97 #: build/models.py:98
msgid "Extra build notes" msgid "Extra build notes"
msgstr "" msgstr ""
#: build/models.py:382 #: build/models.py:383
#, python-brace-format #, python-brace-format
msgid "Selected stock item not found in BOM for part '{p}'" msgid "Selected stock item not found in BOM for part '{p}'"
msgstr "" msgstr ""
#: build/models.py:385 #: build/models.py:386
#, python-brace-format #, python-brace-format
msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
msgstr "" msgstr ""
#: build/models.py:403 #: build/models.py:404
msgid "Build to allocate parts" msgid "Build to allocate parts"
msgstr "" msgstr ""
#: build/models.py:410 #: build/models.py:411
msgid "Stock Item to allocate to build" msgid "Stock Item to allocate to build"
msgstr "" msgstr ""
#: build/models.py:418 #: build/models.py:419
msgid "Stock quantity to allocate to build" msgid "Stock quantity to allocate to build"
msgstr "" msgstr ""
@ -244,7 +244,7 @@ msgid "Allocate"
msgstr "" msgstr ""
#: build/templates/build/allocate_view.html:10 #: build/templates/build/allocate_view.html:10
#: company/templates/company/detail_part.html:18 #: company/templates/company/detail_part.html:18 order/views.py:448
msgid "Order Parts" msgid "Order Parts"
msgstr "" msgstr ""
@ -257,10 +257,14 @@ msgid "Description"
msgstr "" msgstr ""
#: build/templates/build/allocate_view.html:22 #: build/templates/build/allocate_view.html:22
#: part/templates/part/part_base.html:122 #: part/templates/part/part_base.html:112
msgid "On Order" msgid "On Order"
msgstr "" msgstr ""
#: build/templates/build/delete_build_item.html:6
msgid "Are you sure you want to unallocate these parts?"
msgstr ""
#: build/templates/build/detail.html:8 #: build/templates/build/detail.html:8
msgid "Build Details" msgid "Build Details"
msgstr "" msgstr ""
@ -298,7 +302,7 @@ msgstr ""
#: build/templates/build/detail.html:42 #: build/templates/build/detail.html:42
#: company/templates/company/detail_part.html:90 #: company/templates/company/detail_part.html:90
#: company/templates/company/partdetail.html:54 #: company/templates/company/partdetail.html:54
#: part/templates/part/detail.html:50 part/templates/part/part_base.html:91 #: part/templates/part/detail.html:50 part/templates/part/part_base.html:81
#: stock/templates/stock/item_base.html:120 #: stock/templates/stock/item_base.html:120
msgid "URL" msgid "URL"
msgstr "" msgstr ""
@ -355,11 +359,107 @@ msgstr ""
msgid "Assign Parts" msgid "Assign Parts"
msgstr "" msgstr ""
#: build/templates/build/unallocate.html:8
msgid "Are you sure you wish to unallocate all stock for this build?"
msgstr ""
#: build/views.py:56
msgid "Cancel Build"
msgstr ""
#: build/views.py:74
msgid "Confirm build cancellation"
msgstr ""
#: build/views.py:79
msgid "Build was cancelled"
msgstr ""
#: build/views.py:95
msgid "Allocate Stock"
msgstr ""
#: build/views.py:108
msgid "No matching build found"
msgstr ""
#: build/views.py:127
msgid "Confirm stock allocation"
msgstr ""
#: build/views.py:128
msgid "Check the confirmation box at the bottom of the list"
msgstr ""
#: build/views.py:148 build/views.py:442
msgid "Unallocate Stock"
msgstr ""
#: build/views.py:161
msgid "Confirm unallocation of build stock"
msgstr ""
#: build/views.py:162
msgid "Check the confirmation box"
msgstr ""
#: build/views.py:185
msgid "Complete Build"
msgstr ""
#: build/views.py:258
msgid "Confirm completion of build"
msgstr ""
#: build/views.py:265
msgid "Invalid location selected"
msgstr ""
#: build/views.py:290 stock/views.py:884 #: build/views.py:290 stock/views.py:884
#, python-brace-format #, python-brace-format
msgid "The following serial numbers already exist: ({sn})" msgid "The following serial numbers already exist: ({sn})"
msgstr "" msgstr ""
#: build/views.py:309
msgid "Build marked as COMPLETE"
msgstr ""
#: build/views.py:385
msgid "Start new Build"
msgstr ""
#: build/views.py:408
msgid "Created new build"
msgstr ""
#: build/views.py:418
msgid "Edit Build Details"
msgstr ""
#: build/views.py:423
msgid "Edited build"
msgstr ""
#: build/views.py:432
msgid "Delete Build"
msgstr ""
#: build/views.py:447
msgid "Removed parts from build allocation"
msgstr ""
#: build/views.py:457
msgid "Allocate new Part"
msgstr ""
#: build/views.py:573
msgid "Edit Stock Allocation"
msgstr ""
#: build/views.py:577
msgid "Updated Build Item"
msgstr ""
#: common/models.py:69 #: common/models.py:69
msgid "Settings key (must be unique - case insensitive" msgid "Settings key (must be unique - case insensitive"
msgstr "" msgstr ""
@ -396,6 +496,18 @@ msgstr ""
msgid "Use this currency as the base currency" msgid "Use this currency as the base currency"
msgstr "" msgstr ""
#: common/views.py:21
msgid "Create new Currency"
msgstr ""
#: common/views.py:29
msgid "Edit Currency"
msgstr ""
#: common/views.py:36
msgid "Delete Currency"
msgstr ""
#: company/models.py:74 #: company/models.py:74
msgid "Company name" msgid "Company name"
msgstr "" msgstr ""
@ -643,6 +755,62 @@ msgstr ""
msgid "Sales Orders" msgid "Sales Orders"
msgstr "" msgstr ""
#: company/views.py:97
msgid "Update Company Image"
msgstr ""
#: company/views.py:102
msgid "Updated company image"
msgstr ""
#: company/views.py:112
msgid "Edit Company"
msgstr ""
#: company/views.py:116
msgid "Edited company information"
msgstr ""
#: company/views.py:126
msgid "Create new Company"
msgstr ""
#: company/views.py:130
msgid "Created new company"
msgstr ""
#: company/views.py:140
msgid "Delete Company"
msgstr ""
#: company/views.py:145
msgid "Company was deleted"
msgstr ""
#: company/views.py:170
msgid "Edit Supplier Part"
msgstr ""
#: company/views.py:179
msgid "Create new Supplier Part"
msgstr ""
#: company/views.py:236
msgid "Delete Supplier Part"
msgstr ""
#: company/views.py:306
msgid "Add Price Break"
msgstr ""
#: company/views.py:341
msgid "Edit Price Break"
msgstr ""
#: company/views.py:356
msgid "Delete Price Break"
msgstr ""
#: order/forms.py:21 #: order/forms.py:21
msgid "Place order" msgid "Place order"
msgstr "" msgstr ""
@ -675,7 +843,7 @@ msgstr ""
msgid "Order notes" msgid "Order notes"
msgstr "" msgstr ""
#: order/models.py:159 order/models.py:210 part/views.py:1080 #: order/models.py:159 order/models.py:210 part/views.py:1109
#: stock/models.py:440 #: stock/models.py:440
msgid "Quantity must be greater than zero" msgid "Quantity must be greater than zero"
msgstr "" msgstr ""
@ -730,7 +898,7 @@ msgstr ""
msgid "Order Notes" msgid "Order Notes"
msgstr "" msgstr ""
#: order/templates/order/purchase_order_detail.html:15 #: order/templates/order/purchase_order_detail.html:15 order/views.py:747
msgid "Add Line Item" msgid "Add Line Item"
msgstr "" msgstr ""
@ -754,14 +922,38 @@ msgstr ""
msgid "Items" msgid "Items"
msgstr "" msgstr ""
#: order/views.py:99
msgid "Create Purchase Order"
msgstr ""
#: order/views.py:129
msgid "Edit Purchase Order"
msgstr ""
#: order/views.py:149
msgid "Cancel Order"
msgstr ""
#: order/views.py:164 #: order/views.py:164
msgid "Confirm order cancellation" msgid "Confirm order cancellation"
msgstr "" msgstr ""
#: order/views.py:182
msgid "Issue Order"
msgstr ""
#: order/views.py:197 #: order/views.py:197
msgid "Confirm order placement" msgid "Confirm order placement"
msgstr "" msgstr ""
#: order/views.py:218
msgid "Complete Order"
msgstr ""
#: order/views.py:284
msgid "Receive Parts"
msgstr ""
#: order/views.py:351 #: order/views.py:351
msgid "Items received" msgid "Items received"
msgstr "" msgstr ""
@ -794,220 +986,248 @@ msgstr ""
msgid "Invalid SupplierPart selection" msgid "Invalid SupplierPart selection"
msgstr "" msgstr ""
#: part/bom.py:107 #: order/views.py:862
msgid "Edit Line Item"
msgstr ""
#: order/views.py:878
msgid "Delete Line Item"
msgstr ""
#: order/views.py:883
msgid "Deleted line item"
msgstr ""
#: part/bom.py:140
#, python-brace-format #, python-brace-format
msgid "Unsupported file format: {f}" msgid "Unsupported file format: {f}"
msgstr "" msgstr ""
#: part/bom.py:112 #: part/bom.py:145
msgid "Error reading BOM file (invalid data)" msgid "Error reading BOM file (invalid data)"
msgstr "" msgstr ""
#: part/bom.py:114 #: part/bom.py:147
msgid "Error reading BOM file (incorrect row size)" msgid "Error reading BOM file (incorrect row size)"
msgstr "" msgstr ""
#: part/forms.py:37 #: part/forms.py:37 stock/forms.py:91
msgid "File Format"
msgstr ""
#: part/forms.py:37 stock/forms.py:91
msgid "Select output file format"
msgstr ""
#: part/forms.py:39
msgid "Cascading"
msgstr ""
#: part/forms.py:39
msgid "Download cascading / multi-level BOM"
msgstr ""
#: part/forms.py:58
msgid "Confirm that the BOM is correct" msgid "Confirm that the BOM is correct"
msgstr "" msgstr ""
#: part/forms.py:49 #: part/forms.py:70
msgid "Select BOM file to upload" msgid "Select BOM file to upload"
msgstr "" msgstr ""
#: part/forms.py:73 #: part/forms.py:94
msgid "Select part category" msgid "Select part category"
msgstr "" msgstr ""
#: part/forms.py:81 #: part/forms.py:102
msgid "Perform 'deep copy' which will duplicate all BOM data for this part" msgid "Perform 'deep copy' which will duplicate all BOM data for this part"
msgstr "" msgstr ""
#: part/forms.py:86 #: part/forms.py:107
msgid "Confirm part creation" msgid "Confirm part creation"
msgstr "" msgstr ""
#: part/forms.py:172 #: part/forms.py:193
msgid "Input quantity for price calculation" msgid "Input quantity for price calculation"
msgstr "" msgstr ""
#: part/forms.py:175 #: part/forms.py:196
msgid "Select currency for price calculation" msgid "Select currency for price calculation"
msgstr "" msgstr ""
#: part/models.py:57 #: part/models.py:59
msgid "Default location for parts in this category" msgid "Default location for parts in this category"
msgstr "" msgstr ""
#: part/models.py:60 #: part/models.py:62
msgid "Default keywords for parts in this category" msgid "Default keywords for parts in this category"
msgstr "" msgstr ""
#: part/models.py:309 #: part/models.py:323
msgid "Part must be unique for name, IPN and revision" msgid "Part must be unique for name, IPN and revision"
msgstr "" msgstr ""
#: part/models.py:323 #: part/models.py:337
msgid "Part cannot be a template part if it is a variant of another part" msgid "Part cannot be a template part if it is a variant of another part"
msgstr "" msgstr ""
#: part/models.py:324 #: part/models.py:338
msgid "Part cannot be a variant of another part if it is already a template" msgid "Part cannot be a variant of another part if it is already a template"
msgstr "" msgstr ""
#: part/models.py:328 part/templates/part/detail.html:17 #: part/models.py:342 part/templates/part/detail.html:17
msgid "Part name" msgid "Part name"
msgstr "" msgstr ""
#: part/models.py:332 #: part/models.py:346
msgid "Is this part a template part?" msgid "Is this part a template part?"
msgstr "" msgstr ""
#: part/models.py:341 #: part/models.py:355
msgid "Is this part a variant of another part?" msgid "Is this part a variant of another part?"
msgstr "" msgstr ""
#: part/models.py:343 #: part/models.py:357
msgid "Part description" msgid "Part description"
msgstr "" msgstr ""
#: part/models.py:345 #: part/models.py:359
msgid "Part keywords to improve visibility in search results" msgid "Part keywords to improve visibility in search results"
msgstr "" msgstr ""
#: part/models.py:350 #: part/models.py:364
msgid "Part category" msgid "Part category"
msgstr "" msgstr ""
#: part/models.py:352 #: part/models.py:366
msgid "Internal Part Number" msgid "Internal Part Number"
msgstr "" msgstr ""
#: part/models.py:354 #: part/models.py:368
msgid "Part revision or version number" msgid "Part revision or version number"
msgstr "" msgstr ""
#: part/models.py:356 #: part/models.py:370
msgid "Link to extenal URL" msgid "Link to extenal URL"
msgstr "" msgstr ""
#: part/models.py:362 #: part/models.py:376
msgid "Where is this item normally stored?" msgid "Where is this item normally stored?"
msgstr "" msgstr ""
#: part/models.py:406 #: part/models.py:420
msgid "Default supplier part" msgid "Default supplier part"
msgstr "" msgstr ""
#: part/models.py:409 #: part/models.py:423
msgid "Minimum allowed stock level" msgid "Minimum allowed stock level"
msgstr "" msgstr ""
#: part/models.py:411 #: part/models.py:425
msgid "Stock keeping units for this part" msgid "Stock keeping units for this part"
msgstr "" msgstr ""
#: part/models.py:413 #: part/models.py:427
msgid "Can this part be built from other parts?" msgid "Can this part be built from other parts?"
msgstr "" msgstr ""
#: part/models.py:415 #: part/models.py:429
msgid "Can this part be used to build other parts?" msgid "Can this part be used to build other parts?"
msgstr "" msgstr ""
#: part/models.py:417 #: part/models.py:431
msgid "Does this part have tracking for unique items?" msgid "Does this part have tracking for unique items?"
msgstr "" msgstr ""
#: part/models.py:419 #: part/models.py:433
msgid "Can this part be purchased from external suppliers?" msgid "Can this part be purchased from external suppliers?"
msgstr "" msgstr ""
#: part/models.py:421 #: part/models.py:435
msgid "Can this part be sold to customers?" msgid "Can this part be sold to customers?"
msgstr "" msgstr ""
#: part/models.py:423 #: part/models.py:437
msgid "Is this part active?" msgid "Is this part active?"
msgstr "" msgstr ""
#: part/models.py:425 #: part/models.py:439
msgid "Is this a virtual part, such as a software product or license?" msgid "Is this a virtual part, such as a software product or license?"
msgstr "" msgstr ""
#: part/models.py:427 #: part/models.py:441
msgid "Part notes - supports Markdown formatting" msgid "Part notes - supports Markdown formatting"
msgstr "" msgstr ""
#: part/models.py:429 #: part/models.py:443
msgid "Stored BOM checksum" msgid "Stored BOM checksum"
msgstr "" msgstr ""
#: part/models.py:936 #: part/models.py:948
msgid "Select file to attach" msgid "Select file to attach"
msgstr "" msgstr ""
#: part/models.py:938 #: part/models.py:950
msgid "File comment" msgid "File comment"
msgstr "" msgstr ""
#: part/models.py:993 #: part/models.py:1005
msgid "Parameter template name must be unique" msgid "Parameter template name must be unique"
msgstr "" msgstr ""
#: part/models.py:998 #: part/models.py:1010
msgid "Parameter Name" msgid "Parameter Name"
msgstr "" msgstr ""
#: part/models.py:1000 #: part/models.py:1012
msgid "Parameter Units" msgid "Parameter Units"
msgstr "" msgstr ""
#: part/models.py:1026 #: part/models.py:1038
msgid "Parent Part" msgid "Parent Part"
msgstr "" msgstr ""
#: part/models.py:1028 #: part/models.py:1040
msgid "Parameter Template" msgid "Parameter Template"
msgstr "" msgstr ""
#: part/models.py:1030 #: part/models.py:1042
msgid "Parameter Value" msgid "Parameter Value"
msgstr "" msgstr ""
#: part/models.py:1054 #: part/models.py:1066
msgid "Select parent part" msgid "Select parent part"
msgstr "" msgstr ""
#: part/models.py:1062 #: part/models.py:1074
msgid "Select part to be used in BOM" msgid "Select part to be used in BOM"
msgstr "" msgstr ""
#: part/models.py:1068 #: part/models.py:1080
msgid "BOM quantity for this BOM item" msgid "BOM quantity for this BOM item"
msgstr "" msgstr ""
#: part/models.py:1071 #: part/models.py:1083
msgid "Estimated build wastage quantity (absolute or percentage)" msgid "Estimated build wastage quantity (absolute or percentage)"
msgstr "" msgstr ""
#: part/models.py:1074 #: part/models.py:1086
msgid "BOM item reference" msgid "BOM item reference"
msgstr "" msgstr ""
#: part/models.py:1077 #: part/models.py:1089
msgid "BOM item notes" msgid "BOM item notes"
msgstr "" msgstr ""
#: part/models.py:1079 #: part/models.py:1091
msgid "BOM line checksum" msgid "BOM line checksum"
msgstr "" msgstr ""
#: part/models.py:1142 #: part/models.py:1154
msgid "Part cannot be added to its own Bill of Materials" msgid "Part cannot be added to its own Bill of Materials"
msgstr "" msgstr ""
#: part/models.py:1149 #: part/models.py:1161
#, python-brace-format #, python-brace-format
msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)"
msgstr "" msgstr ""
@ -1028,7 +1248,7 @@ msgstr ""
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: part/templates/part/attachments.html:34 #: part/templates/part/attachments.html:34 part/views.py:118
msgid "Edit attachment" msgid "Edit attachment"
msgstr "" msgstr ""
@ -1077,7 +1297,7 @@ msgstr ""
msgid "Part Details" msgid "Part Details"
msgstr "" msgstr ""
#: part/templates/part/detail.html:22 part/templates/part/part_base.html:85 #: part/templates/part/detail.html:22 part/templates/part/part_base.html:75
msgid "IPN" msgid "IPN"
msgstr "" msgstr ""
@ -1181,34 +1401,42 @@ msgstr ""
msgid "This part is not active" msgid "This part is not active"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:47 #: part/templates/part/part_base.html:37
msgid "Star this part" msgid "Star this part"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:53 #: part/templates/part/part_base.html:43
msgid "Show pricing information" msgid "Show pricing information"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:105 #: part/templates/part/part_base.html:95
msgid "Available Stock" msgid "Available Stock"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:110 #: part/templates/part/part_base.html:100
msgid "In Stock" msgid "In Stock"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:131 #: part/templates/part/part_base.html:121
msgid "Build Status" msgid "Build Status"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:135 #: part/templates/part/part_base.html:125
msgid "Can Build" msgid "Can Build"
msgstr "" msgstr ""
#: part/templates/part/part_base.html:140 #: part/templates/part/part_base.html:130
msgid "Underway" msgid "Underway"
msgstr "" msgstr ""
#: part/templates/part/part_thumb.html:16
msgid "Select from existing images"
msgstr ""
#: part/templates/part/part_thumb.html:17
msgid "Upload new image"
msgstr ""
#: part/templates/part/tabs.html:9 #: part/templates/part/tabs.html:9
msgid "Parameters" msgid "Parameters"
msgstr "" msgstr ""
@ -1242,151 +1470,175 @@ msgstr ""
msgid "Attachments" msgid "Attachments"
msgstr "" msgstr ""
#: part/views.py:77 #: part/views.py:75
msgid "Add part attachment"
msgstr ""
#: part/views.py:80
msgid "Added attachment" msgid "Added attachment"
msgstr "" msgstr ""
#: part/views.py:119 #: part/views.py:122
msgid "Part attachment updated" msgid "Part attachment updated"
msgstr "" msgstr ""
#: part/views.py:196 #: part/views.py:137
msgid "Delete Part Attachment"
msgstr ""
#: part/views.py:143
msgid "Deleted part attachment"
msgstr ""
#: part/views.py:151
msgid "Set Part Category"
msgstr ""
#: part/views.py:199
#, python-brace-format #, python-brace-format
msgid "Set category for {n} parts" msgid "Set category for {n} parts"
msgstr "" msgstr ""
#: part/views.py:306 #: part/views.py:234
msgid "Create Variant"
msgstr ""
#: part/views.py:304
msgid "Duplicate Part"
msgstr ""
#: part/views.py:309
msgid "Copied part" msgid "Copied part"
msgstr "" msgstr ""
#: part/views.py:414 #: part/views.py:417
msgid "Create new part" msgid "Create new part"
msgstr "" msgstr ""
#: part/views.py:419 #: part/views.py:422
msgid "Created new part" msgid "Created new part"
msgstr "" msgstr ""
#: part/views.py:609 #: part/views.py:595
msgid "Part QR Code"
msgstr ""
#: part/views.py:612
msgid "Upload Part Image" msgid "Upload Part Image"
msgstr "" msgstr ""
#: part/views.py:614 #: part/views.py:617 part/views.py:652
msgid "Updated part image" msgid "Updated part image"
msgstr "" msgstr ""
#: part/views.py:623 #: part/views.py:626
msgid "Select Part Image" msgid "Select Part Image"
msgstr "" msgstr ""
#: part/views.py:627 #: part/views.py:655
msgid "Selected part image" msgid "Part image not found"
msgstr "" msgstr ""
#: part/views.py:637 #: part/views.py:666
msgid "Edit Part Properties" msgid "Edit Part Properties"
msgstr "" msgstr ""
#: part/views.py:659 #: part/views.py:688
msgid "Validate BOM" msgid "Validate BOM"
msgstr "" msgstr ""
#: part/views.py:821 #: part/views.py:850
msgid "No BOM file provided" msgid "No BOM file provided"
msgstr "" msgstr ""
#: part/views.py:1082 #: part/views.py:1111
msgid "Enter a valid quantity" msgid "Enter a valid quantity"
msgstr "" msgstr ""
#: part/views.py:1106 part/views.py:1109 #: part/views.py:1135 part/views.py:1138
msgid "Select valid part" msgid "Select valid part"
msgstr "" msgstr ""
#: part/views.py:1115 #: part/views.py:1144
msgid "Duplicate part selected" msgid "Duplicate part selected"
msgstr "" msgstr ""
#: part/views.py:1143 #: part/views.py:1172
msgid "Select a part" msgid "Select a part"
msgstr "" msgstr ""
#: part/views.py:1147 #: part/views.py:1176
msgid "Specify quantity" msgid "Specify quantity"
msgstr "" msgstr ""
#: part/views.py:1324 #: part/views.py:1356
msgid "Export Bill of Materials"
msgstr ""
#: part/views.py:1396
msgid "Confirm Part Deletion" msgid "Confirm Part Deletion"
msgstr "" msgstr ""
#: part/views.py:1331 #: part/views.py:1403
msgid "Part was deleted" msgid "Part was deleted"
msgstr "" msgstr ""
#: part/views.py:1340 #: part/views.py:1412
msgid "Part Pricing" msgid "Part Pricing"
msgstr "" msgstr ""
#: part/views.py:1462 #: part/views.py:1534
msgid "Create Part Parameter Template" msgid "Create Part Parameter Template"
msgstr "" msgstr ""
#: part/views.py:1470 #: part/views.py:1542
msgid "Edit Part Parameter Template" msgid "Edit Part Parameter Template"
msgstr "" msgstr ""
#: part/views.py:1477 #: part/views.py:1549
msgid "Delete Part Parameter Template" msgid "Delete Part Parameter Template"
msgstr "" msgstr ""
#: part/views.py:1485 #: part/views.py:1557
msgid "Create Part Parameter" msgid "Create Part Parameter"
msgstr "" msgstr ""
#: part/views.py:1535 #: part/views.py:1607
msgid "Edit Part Parameter" msgid "Edit Part Parameter"
msgstr "" msgstr ""
#: part/views.py:1549 #: part/views.py:1621
msgid "Delete Part Parameter" msgid "Delete Part Parameter"
msgstr "" msgstr ""
#: part/views.py:1565 #: part/views.py:1637
msgid "Edit Part Category" msgid "Edit Part Category"
msgstr "" msgstr ""
#: part/views.py:1600 #: part/views.py:1672
msgid "Delete Part Category" msgid "Delete Part Category"
msgstr "" msgstr ""
#: part/views.py:1606 #: part/views.py:1678
msgid "Part category was deleted" msgid "Part category was deleted"
msgstr "" msgstr ""
#: part/views.py:1614 #: part/views.py:1686
msgid "Create new part category" msgid "Create new part category"
msgstr "" msgstr ""
#: part/views.py:1665 #: part/views.py:1737
msgid "Create BOM item" msgid "Create BOM item"
msgstr "" msgstr ""
#: part/views.py:1731 #: part/views.py:1803
msgid "Edit BOM item" msgid "Edit BOM item"
msgstr "" msgstr ""
#: part/views.py:1779 #: part/views.py:1851
msgid "Confim BOM item deletion" msgid "Confim BOM item deletion"
msgstr "" msgstr ""
#: stock/forms.py:91
msgid "File Format"
msgstr ""
#: stock/forms.py:91
msgid "Select output file format"
msgstr ""
#: stock/forms.py:93 #: stock/forms.py:93
msgid "Include stock items in sub locations" msgid "Include stock items in sub locations"
msgstr "" msgstr ""

View File

@ -96,7 +96,7 @@ class PurchaseOrderCreate(AjaxCreateView):
""" View for creating a new PurchaseOrder object using a modal form """ """ View for creating a new PurchaseOrder object using a modal form """
model = PurchaseOrder model = PurchaseOrder
ajax_form_title = "Create Purchase Order" ajax_form_title = _("Create Purchase Order")
form_class = order_forms.EditPurchaseOrderForm form_class = order_forms.EditPurchaseOrderForm
def get_initial(self): def get_initial(self):
@ -126,7 +126,7 @@ class PurchaseOrderEdit(AjaxUpdateView):
""" View for editing a PurchaseOrder using a modal form """ """ View for editing a PurchaseOrder using a modal form """
model = PurchaseOrder model = PurchaseOrder
ajax_form_title = 'Edit Purchase Order' ajax_form_title = _('Edit Purchase Order')
form_class = order_forms.EditPurchaseOrderForm form_class = order_forms.EditPurchaseOrderForm
def get_form(self): def get_form(self):
@ -146,7 +146,7 @@ class PurchaseOrderCancel(AjaxUpdateView):
""" View for cancelling a purchase order """ """ View for cancelling a purchase order """
model = PurchaseOrder model = PurchaseOrder
ajax_form_title = 'Cancel Order' ajax_form_title = _('Cancel Order')
ajax_template_name = 'order/order_cancel.html' ajax_template_name = 'order/order_cancel.html'
form_class = order_forms.CancelPurchaseOrderForm form_class = order_forms.CancelPurchaseOrderForm
@ -179,7 +179,7 @@ class PurchaseOrderIssue(AjaxUpdateView):
""" View for changing a purchase order from 'PENDING' to 'ISSUED' """ """ View for changing a purchase order from 'PENDING' to 'ISSUED' """
model = PurchaseOrder model = PurchaseOrder
ajax_form_title = 'Issue Order' ajax_form_title = _('Issue Order')
ajax_template_name = "order/order_issue.html" ajax_template_name = "order/order_issue.html"
form_class = order_forms.IssuePurchaseOrderForm form_class = order_forms.IssuePurchaseOrderForm
@ -215,7 +215,7 @@ class PurchaseOrderComplete(AjaxUpdateView):
form_class = order_forms.CompletePurchaseOrderForm form_class = order_forms.CompletePurchaseOrderForm
model = PurchaseOrder model = PurchaseOrder
ajax_template_name = "order/order_complete.html" ajax_template_name = "order/order_complete.html"
ajax_form_title = "Complete Order" ajax_form_title = _("Complete Order")
context_object_name = 'order' context_object_name = 'order'
def get_context_data(self): def get_context_data(self):
@ -281,7 +281,7 @@ class PurchaseOrderReceive(AjaxUpdateView):
""" """
form_class = order_forms.ReceivePurchaseOrderForm form_class = order_forms.ReceivePurchaseOrderForm
ajax_form_title = "Receive Parts" ajax_form_title = _("Receive Parts")
ajax_template_name = "order/receive_parts.html" ajax_template_name = "order/receive_parts.html"
# Where the parts will be going (selected in POST request) # Where the parts will be going (selected in POST request)
@ -445,7 +445,7 @@ class OrderParts(AjaxView):
""" """
ajax_form_title = "Order Parts" ajax_form_title = _("Order Parts")
ajax_template_name = 'order/order_wizard/select_parts.html' ajax_template_name = 'order/order_wizard/select_parts.html'
# List of Parts we wish to order # List of Parts we wish to order
@ -744,7 +744,7 @@ class POLineItemCreate(AjaxCreateView):
model = PurchaseOrderLineItem model = PurchaseOrderLineItem
context_object_name = 'line' context_object_name = 'line'
form_class = order_forms.EditPurchaseOrderLineItemForm form_class = order_forms.EditPurchaseOrderLineItemForm
ajax_form_title = 'Add Line Item' ajax_form_title = _('Add Line Item')
def post(self, request, *arg, **kwargs): def post(self, request, *arg, **kwargs):
@ -859,7 +859,7 @@ class POLineItemEdit(AjaxUpdateView):
model = PurchaseOrderLineItem model = PurchaseOrderLineItem
form_class = order_forms.EditPurchaseOrderLineItemForm form_class = order_forms.EditPurchaseOrderLineItemForm
ajax_template_name = 'modal_form.html' ajax_template_name = 'modal_form.html'
ajax_form_title = 'Edit Line Item' ajax_form_title = _('Edit Line Item')
def get_form(self): def get_form(self):
form = super().get_form() form = super().get_form()
@ -875,10 +875,10 @@ class POLineItemDelete(AjaxDeleteView):
""" """
model = PurchaseOrderLineItem model = PurchaseOrderLineItem
ajax_form_title = 'Delete Line Item' ajax_form_title = _('Delete Line Item')
ajax_template_name = 'order/po_lineitem_delete.html' ajax_template_name = 'order/po_lineitem_delete.html'
def get_data(self): def get_data(self):
return { return {
'danger': 'Deleted line item', 'danger': _('Deleted line item'),
} }

View File

@ -131,11 +131,13 @@ class BomItemResource(ModelResource):
level = Field(attribute='level', readonly=True) level = Field(attribute='level', readonly=True)
part = Field(attribute='part', widget=widgets.ForeignKeyWidget(Part)) bom_id = Field(attribute='pk')
parent_part_id = Field(attribute='part', widget=widgets.ForeignKeyWidget(Part))
parent_part_name = Field(attribute='part__full_name', readonly=True) parent_part_name = Field(attribute='part__full_name', readonly=True)
id = Field(attribute='sub_part', widget=widgets.ForeignKeyWidget(Part)) sub_part_id = Field(attribute='sub_part', widget=widgets.ForeignKeyWidget(Part))
sub_part_name = Field(attribute='sub_part__full_name', readonly=True) sub_part_name = Field(attribute='sub_part__full_name', readonly=True)
@ -147,7 +149,12 @@ class BomItemResource(ModelResource):
report_skipped = False report_skipped = False
clean_model_instances = True clean_model_instances = True
exclude = ['checksum', ] exclude = [
'checksum',
'id',
'part',
'sub_part',
]
class BomItemAdmin(ImportExportModelAdmin): class BomItemAdmin(ImportExportModelAdmin):

View File

@ -53,12 +53,18 @@ def ExportBom(part, fmt='csv', cascade=False):
bom_items = [] bom_items = []
uids = []
def add_items(items, level): def add_items(items, level):
# Add items at a given layer # Add items at a given layer
for item in items: for item in items:
item.level = '-' * level item.level = '-' * level
# Avoid circular BOM references
if item.pk in uids:
continue
bom_items.append(item) bom_items.append(item)
if item.sub_part.assembly: if item.sub_part.assembly:

View File

@ -35,6 +35,7 @@ from InvenTree import helpers
from InvenTree import validators from InvenTree import validators
from InvenTree.models import InvenTreeTree from InvenTree.models import InvenTreeTree
from InvenTree.fields import InvenTreeURLField from InvenTree.fields import InvenTreeURLField
from InvenTree.helpers import decimal2string
from InvenTree.status_codes import BuildStatus, StockStatus, OrderStatus from InvenTree.status_codes import BuildStatus, StockStatus, OrderStatus
@ -1242,11 +1243,11 @@ class BomItem(models.Model):
pmin, pmax = prange pmin, pmax = prange
# remove trailing zeros
pmin = pmin.normalize()
pmax = pmax.normalize()
if pmin == pmax: if pmin == pmax:
return str(pmin) return decimal2string(pmin)
# Convert to better string representation
pmin = decimal2string(pmin)
pmax = decimal2string(pmax)
return "{pmin} to {pmax}".format(pmin=pmin, pmax=pmax) return "{pmin} to {pmax}".format(pmin=pmin, pmax=pmax)

View File

@ -39,6 +39,9 @@
{ {
title: 'Allocated', title: 'Allocated',
sortable: false, sortable: false,
formatter: function(value, row, index, field) {
return parseFloat(value);
},
}, },
{ {
title: 'Status', title: 'Status',

View File

@ -53,6 +53,9 @@
sortable: true, sortable: true,
field: 'quantity', field: 'quantity',
title: 'Uses', title: 'Uses',
formatter: function(value, row, index, field) {
return parseFloat(value);
},
} }
], ],

View File

@ -27,7 +27,7 @@ def inrange(n, *args, **kwargs):
@register.simple_tag() @register.simple_tag()
def multiply(x, y, *args, **kwargs): def multiply(x, y, *args, **kwargs):
""" Multiply two numbers together """ """ Multiply two numbers together """
return x * y return decimal2string(x * y)
@register.simple_tag() @register.simple_tag()
@ -40,7 +40,7 @@ def add(x, y, *args, **kwargs):
def part_allocation_count(build, part, *args, **kwargs): def part_allocation_count(build, part, *args, **kwargs):
""" Return the total number of <part> allocated to <build> """ """ Return the total number of <part> allocated to <build> """
return build.getAllocatedQuantity(part) return decimal2string(build.getAllocatedQuantity(part))
@register.simple_tag() @register.simple_tag()

View File

@ -1,6 +1,7 @@
# Tests for the Part model # Tests for the Part model
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.test import TestCase from django.test import TestCase
@ -16,7 +17,7 @@ class TemplateTagTest(TestCase):
""" Tests for the custom template tag code """ """ Tests for the custom template tag code """
def test_multiply(self): def test_multiply(self):
self.assertEqual(inventree_extras.multiply(3, 5), 15) self.assertEqual(int(inventree_extras.multiply(3, 5)), 15)
def test_version(self): def test_version(self):
self.assertEqual(type(inventree_extras.inventree_version()), str) self.assertEqual(type(inventree_extras.inventree_version()), str)

View File

@ -72,7 +72,7 @@ class PartAttachmentCreate(AjaxCreateView):
""" """
model = PartAttachment model = PartAttachment
form_class = part_forms.EditPartAttachmentForm form_class = part_forms.EditPartAttachmentForm
ajax_form_title = "Add part attachment" ajax_form_title = _("Add part attachment")
ajax_template_name = "modal_form.html" ajax_template_name = "modal_form.html"
def get_data(self): def get_data(self):
@ -115,7 +115,7 @@ class PartAttachmentEdit(AjaxUpdateView):
model = PartAttachment model = PartAttachment
form_class = part_forms.EditPartAttachmentForm form_class = part_forms.EditPartAttachmentForm
ajax_template_name = 'modal_form.html' ajax_template_name = 'modal_form.html'
ajax_form_title = 'Edit attachment' ajax_form_title = _('Edit attachment')
def get_data(self): def get_data(self):
return { return {
@ -134,13 +134,13 @@ class PartAttachmentDelete(AjaxDeleteView):
""" View for deleting a PartAttachment """ """ View for deleting a PartAttachment """
model = PartAttachment model = PartAttachment
ajax_form_title = "Delete Part Attachment" ajax_form_title = _("Delete Part Attachment")
ajax_template_name = "part/attachment_delete.html" ajax_template_name = "part/attachment_delete.html"
context_object_name = "attachment" context_object_name = "attachment"
def get_data(self): def get_data(self):
return { return {
'danger': 'Deleted part attachment' 'danger': _('Deleted part attachment')
} }
@ -148,7 +148,7 @@ class PartSetCategory(AjaxUpdateView):
""" View for settings the part category for multiple parts at once """ """ View for settings the part category for multiple parts at once """
ajax_template_name = 'part/set_category.html' ajax_template_name = 'part/set_category.html'
ajax_form_title = 'Set Part Category' ajax_form_title = _('Set Part Category')
form_class = part_forms.SetPartCategoryForm form_class = part_forms.SetPartCategoryForm
category = None category = None
@ -231,7 +231,7 @@ class MakePartVariant(AjaxCreateView):
model = Part model = Part
form_class = part_forms.EditPartForm form_class = part_forms.EditPartForm
ajax_form_title = 'Create Variant' ajax_form_title = _('Create Variant')
ajax_template_name = 'part/variant_part.html' ajax_template_name = 'part/variant_part.html'
def get_part_template(self): def get_part_template(self):
@ -301,7 +301,7 @@ class PartDuplicate(AjaxCreateView):
model = Part model = Part
form_class = part_forms.EditPartForm form_class = part_forms.EditPartForm
ajax_form_title = "Duplicate Part" ajax_form_title = _("Duplicate Part")
ajax_template_name = "part/copy_part.html" ajax_template_name = "part/copy_part.html"
def get_data(self): def get_data(self):
@ -592,7 +592,7 @@ class PartDetail(DetailView):
class PartQRCode(QRCodeView): class PartQRCode(QRCodeView):
""" View for displaying a QR code for a Part object """ """ View for displaying a QR code for a Part object """
ajax_form_title = "Part QR Code" ajax_form_title = _("Part QR Code")
def get_qr_data(self): def get_qr_data(self):
""" Generate QR code data for the Part """ """ Generate QR code data for the Part """

View File

@ -35,7 +35,9 @@
<hr> <hr>
<div class='panel panel-default'> <div class='panel panel-default'>
<div class='panel-content'> <div class='panel-content'>
{% if item.notes %}
{{ item.notes | markdownify }} {{ item.notes | markdownify }}
{% endif %}
</div> </div>
</div> </div>

View File

@ -1,26 +0,0 @@
{% extends "stock/stock_app_base.html" %}
{% load static %}
{% block content %}
<h3>Stock list here!</h3>
<table class='table table-striped table-condensed' data-toolbar='#button-toolbar' id='tracking-table'>
</table>
{% endblock %}
{% block js_ready %}
{{ block.super }}
loadStockTrackingTable($("#tracking-table"), {
params: function(p) {
return {
ordering: '-date',
};
},
partColumn: true,
url: "{% url 'api-stock-track' %}",
});
{% endblock %}