From 0d5592cdb65c197c795ae31accc8c1da9af8bc74 Mon Sep 17 00:00:00 2001 From: tdruez Date: Thu, 25 Jul 2024 18:52:25 +0400 Subject: [PATCH] Add some navigation counts in Dependencies UI #138 Signed-off-by: tdruez --- .../includes/hierarchy_instance_box.html | 7 +++++-- product_portfolio/models.py | 11 ++++++++++- .../includes/productrelation_element.html | 7 +++++-- .../product_portfolio/tabs/tab_dependencies.html | 8 +++++++- product_portfolio/views.py | 14 +++++++++++++- 5 files changed, 40 insertions(+), 7 deletions(-) diff --git a/component_catalog/templates/component_catalog/includes/hierarchy_instance_box.html b/component_catalog/templates/component_catalog/includes/hierarchy_instance_box.html index 19620ab9..3fe1b5a8 100644 --- a/component_catalog/templates/component_catalog/includes/hierarchy_instance_box.html +++ b/component_catalog/templates/component_catalog/includes/hierarchy_instance_box.html @@ -28,8 +28,11 @@ {% endif %} - {% if relation.package_id and relation.package.declared_dependencies.exists %} - + {% if relation.package_id and relation.package.declared_dependencies.all %} + + {{ relation.package.declared_dependencies.all|length }} + {% endif %} {% elif instance.is_active or is_product %} {{ instance }} diff --git a/product_portfolio/models.py b/product_portfolio/models.py index afe43e23..abb8409b 100644 --- a/product_portfolio/models.py +++ b/product_portfolio/models.py @@ -1318,6 +1318,15 @@ def notify(self, verb, description): ) +class ProductDependencyQuerySet(ProductSecuredQuerySet): + def with_resolved_to_dependencies_count(self): + return self.annotate( + resolved_to_dependencies_count=models.Count( + "resolved_to_package__declared_dependencies" + ) + ) + + class ProductDependency(HistoryFieldsMixin, DataspacedModel): product = models.ForeignKey( to="product_portfolio.Product", @@ -1384,7 +1393,7 @@ class ProductDependency(HistoryFieldsMixin, DataspacedModel): help_text=_("True if this is a direct, first-level dependency relationship for a package."), ) - objects = DataspacedManager.from_queryset(ProductSecuredQuerySet)() + objects = DataspacedManager.from_queryset(ProductDependencyQuerySet)() class Meta: unique_together = (("product", "dependency_uid"), ("dataspace", "uuid")) diff --git a/product_portfolio/templates/product_portfolio/includes/productrelation_element.html b/product_portfolio/templates/product_portfolio/includes/productrelation_element.html index f77f8837..d4da4180 100644 --- a/product_portfolio/templates/product_portfolio/includes/productrelation_element.html +++ b/product_portfolio/templates/product_portfolio/includes/productrelation_element.html @@ -51,7 +51,10 @@ {% endif %} -{% if relation.package_id and relation.package.declared_dependencies.exists %} - +{% if relation.package_id and relation.package.declared_dependencies.all %} + + {{ relation.package.declared_dependencies.all|length }} + {% endif %} {% endspaceless %} \ No newline at end of file diff --git a/product_portfolio/templates/product_portfolio/tabs/tab_dependencies.html b/product_portfolio/templates/product_portfolio/tabs/tab_dependencies.html index 5431aa23..4a4988f8 100644 --- a/product_portfolio/templates/product_portfolio/tabs/tab_dependencies.html +++ b/product_portfolio/templates/product_portfolio/tabs/tab_dependencies.html @@ -93,7 +93,7 @@ {% for dependency in page_obj.object_list %} - + {% if dependency.for_package %} @@ -110,6 +110,12 @@ {% if dependency.resolved_to_package %} {{ dependency.resolved_to_package }} + {% if dependency.resolved_to_dependencies_count %} + + {{ dependency.resolved_to_dependencies_count }} + + {% endif %}
{{ dependency.resolved_to_package.license_expression_html|default_if_none:"" }} diff --git a/product_portfolio/views.py b/product_portfolio/views.py index cf415d18..cc26f640 100644 --- a/product_portfolio/views.py +++ b/product_portfolio/views.py @@ -409,12 +409,17 @@ def tab_hierarchy(self): ) ) + declared_dependencies_prefetch = models.Prefetch( + "package__declared_dependencies", ProductDependency.objects.all() + ) + productpackage_qs = ( self.object.productpackages.select_related( "package", ) .prefetch_related( "package__licenses", + declared_dependencies_prefetch, ) .order_by( "feature", @@ -642,6 +647,9 @@ def get_context_data(self, **kwargs): licenses_prefetch = models.Prefetch( "licenses", License.objects.select_related("usage_policy") ) + declared_dependencies_prefetch = models.Prefetch( + "package__declared_dependencies", ProductDependency.objects.all() + ) productpackage_qs = ( self.object.productpackages.select_related( @@ -652,6 +660,7 @@ def get_context_data(self, **kwargs): ) .prefetch_related( licenses_prefetch, + declared_dependencies_prefetch, ) .order_by( "feature", @@ -967,7 +976,10 @@ def get_context_data(self, **kwargs): prefix="dependencies", ) - paginator = Paginator(filter_dependency.qs, self.paginate_by) + # Annotate the filtered queryset with the count of declared_dependencies + filtered_and_annotated_qs = filter_dependency.qs.with_resolved_to_dependencies_count() + + paginator = Paginator(filtered_and_annotated_qs, self.paginate_by) page_number = self.request.GET.get(self.query_dict_page_param) page_obj = paginator.get_page(page_number)