From cf5b8d024967e33df6c66f92331089f958749870 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 23 May 2019 22:36:19 +1000 Subject: [PATCH] Optional part_detail and sub_part_detail for BOM API - Significant speed boost on request - Request the relevent information at the right place --- InvenTree/part/api.py | 15 ++++++++++++- InvenTree/part/serializers.py | 15 +++++++++++++ InvenTree/part/templates/part/bom.html | 3 ++- InvenTree/part/templates/part/used_in.html | 3 ++- InvenTree/static/script/inventree/bom.js | 26 +++++++++++++++------- 5 files changed, 51 insertions(+), 11 deletions(-) diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index f3da5ccf40..f50dc0aef8 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -22,6 +22,7 @@ from .serializers import CategorySerializer from .serializers import PartStarSerializer from InvenTree.views import TreeSerializer +from InvenTree.helpers import str2bool class PartCategoryTree(TreeSerializer): @@ -203,8 +204,20 @@ class BomList(generics.ListCreateAPIView): - GET: Return list of BomItem objects - POST: Create a new BomItem object """ - + serializer_class = BomItemSerializer + + def get_serializer(self, *args, **kwargs): + + # Do we wish to include extra detail? + part_detail = str2bool(self.request.GET.get('part_detail', None)) + sub_part_detail = str2bool(self.request.GET.get('sub_part_detail', None)) + + kwargs['part_detail'] = part_detail + kwargs['sub_part_detail'] = sub_part_detail + + kwargs['context'] = self.get_serializer_context() + return self.serializer_class(*args, **kwargs) def get_queryset(self): queryset = BomItem.objects.all() diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index cb7cc8bda3..718f590162 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -124,6 +124,21 @@ class BomItemSerializer(InvenTreeModelSerializer): sub_part_detail = PartBriefSerializer(source='sub_part', many=False, read_only=True) price_range = serializers.CharField(read_only=True) + def __init__(self, *args, **kwargs): + # part_detail and sub_part_detail serializers are only included if requested. + # This saves a bunch of database requests + + part_detail = kwargs.pop('part_detail', False) + sub_part_detail = kwargs.pop('sub_part_detail', False) + + super(BomItemSerializer, self).__init__(*args, **kwargs) + + if part_detail is not True: + self.fields.pop('part_detail') + + if sub_part_detail is not True: + self.fields.pop('sub_part_detail') + @staticmethod def setup_eager_loading(queryset): queryset = queryset.prefetch_related('part') diff --git a/InvenTree/part/templates/part/bom.html b/InvenTree/part/templates/part/bom.html index 19b876d905..dee1b0f140 100644 --- a/InvenTree/part/templates/part/bom.html +++ b/InvenTree/part/templates/part/bom.html @@ -72,7 +72,8 @@ editable: {{ editing_enabled }}, bom_url: "{% url 'api-bom-list' %}", part_url: "{% url 'api-part-list' %}", - parent_id: {{ part.id }} + parent_id: {{ part.id }} , + sub_part_detail: true, }); {% if editing_enabled %} diff --git a/InvenTree/part/templates/part/used_in.html b/InvenTree/part/templates/part/used_in.html index 9210bc446c..135427e313 100644 --- a/InvenTree/part/templates/part/used_in.html +++ b/InvenTree/part/templates/part/used_in.html @@ -30,7 +30,8 @@ formatNoMatches: function() { return "{{ part.full_name }} is not used to make any other parts"; }, queryParams: function(p) { return { - sub_part: {{ part.id }} + sub_part: {{ part.id }}, + part_detail: true, } }, columns: [ diff --git a/InvenTree/static/script/inventree/bom.js b/InvenTree/static/script/inventree/bom.js index a995fe0ed8..375120b773 100644 --- a/InvenTree/static/script/inventree/bom.js +++ b/InvenTree/static/script/inventree/bom.js @@ -189,6 +189,19 @@ function loadBomTable(table, options) { } // Configure the table (bootstrap-table) + + var params = { + part: options.parent_id, + ordering: 'name', + } + + if (options.part_detail) { + params.part_detail = true; + } + + if (options.sub_part_detail) { + params.sub_part_detail = true; + } table.bootstrapTable({ sortable: true, @@ -196,14 +209,11 @@ function loadBomTable(table, options) { formatNoMatches: function() { return "No BOM items found"; }, clickToSelect: true, queryParams: function(p) { - return { - part: options.parent_id, - ordering: 'name', - } - }, - columns: cols, - url: options.bom_url -}); + return params; + }, + columns: cols, + url: options.bom_url + }); // In editing mode, attached editables to the appropriate table elements if (options.editable) {