From 6d3f4ce288601ffc9224b312df2e0f33b1559336 Mon Sep 17 00:00:00 2001 From: tdruez Date: Thu, 25 Jul 2024 18:04:34 +0400 Subject: [PATCH] Add full purl search for the Dependencies tab UI #138 Signed-off-by: tdruez --- product_portfolio/filters.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/product_portfolio/filters.py b/product_portfolio/filters.py index 4ca68fb4..59d54e69 100644 --- a/product_portfolio/filters.py +++ b/product_portfolio/filters.py @@ -8,9 +8,11 @@ from django import forms from django.contrib import admin +from django.db.models import Q from django.utils.translation import gettext_lazy as _ import django_filters +from packageurl.contrib.django.utils import purl_to_lookups from component_catalog.models import ComponentKeyword from component_catalog.programming_languages import PROGRAMMING_LANGUAGES @@ -317,8 +319,27 @@ class Meta: ] +class PackageURLSearchFilter(SearchFilter): + def filter(self, qs, value): + if value and value.startswith("pkg:"): + base_lookups = purl_to_lookups(value) + packages_fk_fields = ["for_package", "resolved_to_package"] + + combined_q = Q() + for package_fk in packages_fk_fields: + fk_lookups = { + f"{package_fk}__{field}": value for field, value in base_lookups.items() + } + combined_q |= Q(**fk_lookups) + + if combined_q: + return qs.filter(combined_q) + + return super().filter(qs, value) + + class DependencyFilterSet(DataspacedFilterSet): - q = SearchFilter( + q = PackageURLSearchFilter( label=_("Search"), search_fields=[ "dependency_uid",