diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py index 971373ed9b..339c8519fc 100644 --- a/InvenTree/part/forms.py +++ b/InvenTree/part/forms.py @@ -173,23 +173,7 @@ class PartPriceForm(forms.Form): help_text=_('Input quantity for price calculation') ) - currency = forms.ChoiceField(label='Currency', help_text=_('Select currency for price calculation')) - - def get_currency_choices(self): - """ Create options for Currency """ - - currencies = Currency.objects.all() - choices = [(None, '---------')] - - for c in currencies: - choices.append((c.pk, str(c))) - - return choices - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - self.fields['currency'].choices = self.get_currency_choices() + currency = forms.ModelChoiceField(queryset=Currency.objects.all(), label='Currency', help_text=_('Select currency for price calculation')) class Meta: model = Part diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 5040bdc2f0..a06d5ea718 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -1140,6 +1140,8 @@ class BomItem(models.Model): if self.part == self.sub_part: raise ValidationError({'sub_part': _('Part cannot be added to its own Bill of Materials')}) + # TODO - Make sure that there is no recusion + # Test for simple recursion for item in self.sub_part.bom_items.all(): if self.part == item.sub_part: diff --git a/InvenTree/part/templates/part/tabs.html b/InvenTree/part/templates/part/tabs.html index 86b7986b00..23b0f8070c 100644 --- a/InvenTree/part/templates/part/tabs.html +++ b/InvenTree/part/templates/part/tabs.html @@ -13,7 +13,7 @@ Stock {{ part.total_stock }} - {% if part.allocation_count > 0 %} + {% if part.component or part.used_in_count > 0 %} Allocated {{ part.allocation_count }} diff --git a/InvenTree/stock/forms.py b/InvenTree/stock/forms.py index 3a34e0416d..8145a17f89 100644 --- a/InvenTree/stock/forms.py +++ b/InvenTree/stock/forms.py @@ -9,6 +9,8 @@ from django import forms from django.forms.utils import ErrorDict from django.utils.translation import ugettext as _ +from mptt.fields import TreeNodeChoiceField + from InvenTree.helpers import GetExportFormats from InvenTree.forms import HelperForm from .models import StockLocation, StockItem, StockItemTracking @@ -67,25 +69,12 @@ class CreateStockItemForm(HelperForm): class SerializeStockForm(forms.ModelForm): """ Form for serializing a StockItem. """ - destination = forms.ChoiceField(label='Destination', required=True, help_text='Destination for serialized stock (by default, will remain in current location)') + 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)') - def get_location_choices(self): - locs = StockLocation.objects.all() - - choices = [(None, '---------')] - - for loc in locs: - choices.append((loc.pk, loc.pathstring + ' - ' + loc.description)) - - return choices - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - self.fields['destination'].choices = self.get_location_choices() - class Meta: model = StockItem @@ -135,28 +124,16 @@ class AdjustStockForm(forms.ModelForm): This form is used for managing stock adjuments for single or multiple stock items. """ - def get_location_choices(self): - locs = StockLocation.objects.all() - - choices = [(None, '---------')] - - for loc in locs: - choices.append((loc.pk, loc.pathstring + ' - ' + loc.description)) - - return choices - - destination = forms.ChoiceField(label='Destination', required=True, help_text=_('Destination stock location')) + 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')) - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - self.fields['destination'].choices = self.get_location_choices() - class Meta: model = StockItem