diff --git a/shimatta_kenkyusho/parts/models.py b/shimatta_kenkyusho/parts/models.py
index bb1280e..e1f9e8c 100644
--- a/shimatta_kenkyusho/parts/models.py
+++ b/shimatta_kenkyusho/parts/models.py
@@ -75,6 +75,9 @@ class Storage(models.Model):
null=True,
related_name='template_of')
+ # caching variable for subtrees
+ storage_list = None
+
def get_path_components(self):
chain = []
iterator = self
@@ -115,12 +118,18 @@ class Storage(models.Model):
else:
return self.storage_set.all()
- def get_tree(self):
- self.sub_storages = [self]
- for storage in self.storage_set.all():
- self.sub_storages += storage.get_tree()
+ @classmethod
+ def get_substorage_list(cls, sub_storages):
+ sub_sub_storages = cls.objects.filter(parent_storage__in=sub_storages)
- return self.sub_storages
+ final_sub_storages = sub_storages | sub_sub_storages
+ if sub_sub_storages:
+ final_sub_storages |= cls.get_substorage_list(sub_sub_storages)
+
+ return final_sub_storages
+
+ def get_storage_list(self):
+ return Storage.objects.filter(id=self.id) | self.get_substorage_list(self.storage_set.all())
def validate_unique(self, exclude=None):
if Storage.objects.exclude(id=self.id).filter(name=self.name, parent_storage__isnull=True).exists():
@@ -132,12 +141,18 @@ class Storage(models.Model):
raise
def get_total_stock_amount(self):
- stocks = Stock.objects.filter(storage=self)
+ stocks = Stock.objects.filter(storage__in=self.storage_list or self.get_storage_list())
sum = stocks.aggregate(Sum('amount'))['amount__sum']
if sum is None:
sum = 0
return sum
+ def get_total_stock_count(self):
+ return Stock.objects.filter(storage__in=self.storage_list or self.get_storage_list()).count()
+
+ def get_total_substorage_amount(self):
+ return len(self.storage_list or self.get_storage_list()) - 1 # -1 as thhe storage list counts the parent storage as well
+
@classmethod
def from_path(cls, path, root_storage=None):
'''
diff --git a/shimatta_kenkyusho/parts/views/storage_views.py b/shimatta_kenkyusho/parts/views/storage_views.py
index dc17ad4..e8b0614 100644
--- a/shimatta_kenkyusho/parts/views/storage_views.py
+++ b/shimatta_kenkyusho/parts/views/storage_views.py
@@ -76,7 +76,7 @@ class StockViewDetail(LoginRequiredMixin, BaseTemplateMixin, DetailView):
def search_stock_queryset(self, search):
if self.object.expand_sub_storage_stocks:
- stocks_in_storage = Stock.objects.filter(storage__in=self.object.get_tree())
+ stocks_in_storage = Stock.objects.filter(storage__in=self.object.get_storage_list())
else:
stocks_in_storage = Stock.objects.filter(storage=self.object)
diff --git a/shimatta_kenkyusho/templates/base.html b/shimatta_kenkyusho/templates/base.html
index ac6acad..ef28046 100644
--- a/shimatta_kenkyusho/templates/base.html
+++ b/shimatta_kenkyusho/templates/base.html
@@ -83,6 +83,13 @@
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))
+
+