diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 1a0aba0470..c69857fda3 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -59,7 +59,7 @@ class Build(models.Model): take_from = models.ForeignKey('stock.StockLocation', on_delete=models.SET_NULL, related_name='sourcing_builds', null=True, blank=True, - help_text='Select location to take stock from for this build (leave blank to take from any stock location' + help_text='Select location to take stock from for this build (leave blank to take from any stock location)' ) quantity = models.PositiveIntegerField( diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index e671b49e4f..0973138b21 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -12,7 +12,6 @@ from rest_framework.response import Response from rest_framework import filters from rest_framework import generics, permissions -from django.db.models import Q from django.conf.urls import url, include from django.urls import reverse @@ -109,20 +108,7 @@ class PartList(generics.ListCreateAPIView): if cat_id: try: category = PartCategory.objects.get(pk=cat_id) - - # Filter by the supplied category - flt = Q(category=cat_id) - - if self.request.query_params.get('include_child_categories', None): - childs = category.getUniqueChildren() - for child in childs: - # Ignore the top-level category (already filtered) - if str(child) == str(cat_id): - continue - flt |= Q(category=child) - - parts_list = parts_list.filter(flt) - + parts_list = parts_list.filter(category__in=category.getUniqueChildren()) except PartCategory.DoesNotExist: pass diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 2d9b12e255..f4673dc309 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -574,10 +574,11 @@ class Part(models.Model): # Copy the part image if kwargs.get('image', True): - image_file = ContentFile(other.image.read()) - image_file.name = rename_part_image(self, 'test.png') + if other.image: + image_file = ContentFile(other.image.read()) + image_file.name = rename_part_image(self, 'test.png') - self.image = image_file + self.image = image_file # Copy the BOM data if kwargs.get('bom', False): diff --git a/InvenTree/part/templates/part/category.html b/InvenTree/part/templates/part/category.html index e37062beb6..fd8f20d2aa 100644 --- a/InvenTree/part/templates/part/category.html +++ b/InvenTree/part/templates/part/category.html @@ -153,7 +153,6 @@ query: { {% if category %} category: {{ category.id }}, - include_child_categories: true, {% endif %} }, buttons: ['#part-options'], diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index b8d9b7ba6d..15c6f58dcd 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -105,13 +105,6 @@ class PartAPITest(APITestCase): url = reverse('api-part-list') data = {'category': 1} - response = self.client.get(url, data, format='json') - - # There should be 1 part in this category - self.assertEqual(len(response.data), 0) - - data['include_child_categories'] = 1 - # Now request to include child categories response = self.client.get(url, data, format='json') diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 9f305b657a..29b151ddbf 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -7,11 +7,12 @@ from django_filters import NumberFilter from django.conf.urls import url, include from django.urls import reverse -from django.db.models import Q from .models import StockLocation, StockItem from .models import StockItemTracking +from part.models import PartCategory + from .serializers import StockItemSerializer, StockQuantitySerializer from .serializers import LocationSerializer from .serializers import StockTrackingSerializer @@ -237,16 +238,19 @@ class StockList(generics.ListCreateAPIView): - GET: Return a list of all StockItem objects (with optional query filters) - POST: Create a new StockItem + + Additional query parameters are available: + - location: Filter stock by location + - category: Filter by parts belonging to a certain category """ def get_queryset(self): """ If the query includes a particular location, we may wish to also request stock items from all child locations. - This is set by the optional param 'include_child_categories' """ - # Does the client wish to filter by category? + # Does the client wish to filter by stock location? loc_id = self.request.query_params.get('location', None) # Start with all objects @@ -255,23 +259,22 @@ class StockList(generics.ListCreateAPIView): if loc_id: try: location = StockLocation.objects.get(pk=loc_id) - - # Filter by the supplied category - flt = Q(location=loc_id) - - if self.request.query_params.get('include_child_locations', None): - childs = location.getUniqueChildren() - for child in childs: - # Ignore the top-level category (already filtered!) - if str(child) == str(loc_id): - continue - flt |= Q(location=child) - - stock_list = stock_list.filter(flt) - + stock_list = stock_list.filter(location__in=location.getUniqueChildren()) + except StockLocation.DoesNotExist: pass + # Does the client wish to filter by part category? + cat_id = self.request.query_params.get('category', None) + + if cat_id: + try: + category = PartCategory.objects.get(pk=cat_id) + stock_list = stock_list.filter(part__category__in=category.getUniqueChildren()) + + except PartCategory.DoesNotExist: + pass + return stock_list serializer_class = StockItemSerializer diff --git a/InvenTree/stock/templates/stock/location.html b/InvenTree/stock/templates/stock/location.html index c6857d9b9f..9ea210a04e 100644 --- a/InvenTree/stock/templates/stock/location.html +++ b/InvenTree/stock/templates/stock/location.html @@ -196,7 +196,6 @@ params: { {% if location %} location: {{ location.id }}, - include_child_locations: true, {% endif %} }, url: "{% url 'api-stock-list' %}",