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)) + +