From 037dc6a0d6aa4ecf8a45144cfa02704c2e89c218 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 17 Jun 2019 23:52:49 +1000 Subject: [PATCH] Reduced tree time with some better queries --- InvenTree/InvenTree/views.py | 10 ++++++---- InvenTree/part/api.py | 5 +++++ InvenTree/part/models.py | 13 ++++++++++--- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py index de9d64be1d..9179805ed8 100644 --- a/InvenTree/InvenTree/views.py +++ b/InvenTree/InvenTree/views.py @@ -52,8 +52,10 @@ class TreeSerializer(views.APIView): if item.has_children: nodes = [] + """ for child in item.children.all().order_by('name'): nodes.append(self.itemToJson(child)) + """ data['nodes'] = nodes @@ -63,10 +65,12 @@ class TreeSerializer(views.APIView): return self.model.objects.all() - def generate_tree(self, items): + def generate_tree(self): nodes = [] + items = self.get_items() + # Construct the top-level items top_items = [i for i in items if i.parent is None] @@ -87,9 +91,7 @@ class TreeSerializer(views.APIView): def get(self, request, *args, **kwargs): """ Respond to a GET request for the Tree """ - items = self.model.objects.all() - - self.generate_tree(items) + self.generate_tree() response = { 'tree': [self.tree] diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index d0beee54ce..7f3ad61e75 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -34,6 +34,11 @@ class PartCategoryTree(TreeSerializer): def root_url(self): return reverse('part-index') + def get_items(self): + + print("hello world") + return PartCategory.objects.all().prefetch_related('parts', 'children') + class CategoryList(generics.ListCreateAPIView): """ API endpoint for accessing a list of PartCategory objects. diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 38acae3360..9bf8a78845 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -69,13 +69,20 @@ class PartCategory(InvenTreeTree): return self.partcount @property - def partcount(self): + def partcount(self, cascade=True, active=True): """ Return the total part count under this category (including children of child categories) """ - return len(Part.objects.filter(category__in=self.getUniqueChildren(), - active=True)) + if cascade: + query = Part.objects.filter(category__in=self.getUniqueChildren()) + else: + query = Part.objects.filter(category=self) + + if active: + query = query.filter(active=True) + + return query.count() @property def has_parts(self):