From 6b2281567834916a13e997e901cdfee532c8a27b Mon Sep 17 00:00:00 2001 From: tdruez Date: Wed, 17 Jul 2024 15:27:38 +0400 Subject: [PATCH] Proper pagination for Dependencies tab #138 Also improve QS performance for the inventory tab Signed-off-by: tdruez --- .../tabs/tab_dependencies.html | 14 +++- product_portfolio/views.py | 73 +++++++++++++------ 2 files changed, 64 insertions(+), 23 deletions(-) diff --git a/product_portfolio/templates/product_portfolio/tabs/tab_dependencies.html b/product_portfolio/templates/product_portfolio/tabs/tab_dependencies.html index 9c34e5f6..c904f269 100644 --- a/product_portfolio/templates/product_portfolio/tabs/tab_dependencies.html +++ b/product_portfolio/templates/product_portfolio/tabs/tab_dependencies.html @@ -12,7 +12,14 @@ @@ -52,7 +59,7 @@ - {% for dependency in filter_dependency.qs %} + {% for dependency in page_obj.object_list %} {% if dependency.for_package %} @@ -102,4 +109,7 @@ {% endfor %} +
+ {% include 'pagination/object_list_pagination.html' %} +
{% endspaceless %} \ No newline at end of file diff --git a/product_portfolio/views.py b/product_portfolio/views.py index 3d7fe7e9..89ee60f7 100644 --- a/product_portfolio/views.py +++ b/product_portfolio/views.py @@ -638,39 +638,70 @@ def get_context_data(self, **kwargs): context["inventory_count"] = self.object.productinventoryitem_set.count() + licenses_prefetch = models.Prefetch( + "licenses", License.objects.select_related("usage_policy") + ) + + productpackage_qs = ( + self.object.productpackages.select_related( + "package__dataspace", + "package__usage_policy", + "review_status", + "purpose", + ) + .prefetch_related( + licenses_prefetch, + ) + .order_by( + "feature", + "package__type", + "package__namespace", + "package__name", + "package__version", + "package__filename", + ) + ) + filter_productpackage = ProductPackageFilterSet( self.request.GET, - queryset=self.object.productpackages, + queryset=productpackage_qs, dataspace=self.object.dataspace, prefix="inventory", anchor="#inventory", ) + productcomponent_qs = ( + self.object.productcomponents.select_related( + "component__dataspace", + "component__owner__dataspace", + "component__usage_policy", + "review_status", + "purpose", + ) + .prefetch_related( + "component__packages", + "component__children", + licenses_prefetch, + ) + .order_by( + "feature", + "component__name", + "component__version", + "name", + "version", + ) + ) + filter_productcomponent = ProductComponentFilterSet( self.request.GET, - queryset=self.object.productcomponents, + queryset=productcomponent_qs, dataspace=self.object.dataspace, prefix="inventory", anchor="#inventory", ) - productcomponent_qs = filter_productcomponent.qs.order_by( - "feature", - "component__name", - "component__version", - "name", - "version", - ) - - productpackage_qs = filter_productpackage.qs.order_by( - "feature", - "package__type", - "package__namespace", - "package__name", - "package__version", - "package__filename", - ) - + productcomponent_qs = filter_productcomponent.qs + productpackage_qs = filter_productpackage.qs # 1. Combine components and packages into a single list of object filtered_inventory_items = list(productcomponent_qs) + list(productpackage_qs) @@ -924,8 +955,8 @@ def get_context_data(self, **kwargs): context_data = super().get_context_data(**kwargs) dependency_qs = self.object.dependencies.select_related( - "for_package", - "resolved_to_package", + "for_package__dataspace", + "resolved_to_package__dataspace", ) filter_dependency = DependencyFilterSet(