2222
2323from guardian .admin import GuardedModelAdminMixin
2424from guardian .shortcuts import get_perms as guardian_get_perms
25+ from packageurl .contrib .django .utils import purl_to_lookups
2526
2627from component_catalog .admin import AwesompleteAdminMixin
2728from component_catalog .admin import BaseStatusAdmin
4445from dje .list_display import AsURL
4546from dje .permissions import assign_all_object_permissions
4647from dje .permissions import get_limited_perms_for_model
48+ from dje .utils import is_purl_fragment
4749from product_portfolio .filters import ComponentCompletenessListFilter
4850from product_portfolio .forms import ProductAdminForm
4951from product_portfolio .forms import ProductComponentAdminForm
@@ -842,7 +844,18 @@ class ProductDependencyAdmin(ProductRelatedAdminMixin):
842844 "resolved_to_package" ,
843845 ]
844846 autocomplete_lookup_fields = {"fk" : raw_id_fields }
845- search_fields = ("path" ,)
847+ search_fields = (
848+ "dependency_uid" ,
849+ "for_package__type" ,
850+ "for_package__namespace" ,
851+ "for_package__name" ,
852+ "for_package__version" ,
853+ "resolved_to_package__type" ,
854+ "resolved_to_package__namespace" ,
855+ "resolved_to_package__name" ,
856+ "resolved_to_package__version" ,
857+ "declared_dependency" ,
858+ )
846859 list_filter = (
847860 ("product" , RelatedLookupListFilter ),
848861 "is_runtime" ,
@@ -865,3 +878,24 @@ def get_queryset(self, request):
865878 "resolved_to_package__dataspace" ,
866879 )
867880 )
881+
882+ def get_search_results (self , request , queryset , search_term ):
883+ """Add searching on provided PackageURL identifier."""
884+ use_distinct = False
885+
886+ if is_purl_fragment (search_term ):
887+ if lookups := purl_to_lookups (search_term , encode = True ):
888+ purl_fields = ["for_package" , "resolved_to_package" ]
889+
890+ query = models .Q ()
891+ for field in purl_fields :
892+ field_purl_lookup = models .Q ()
893+ for key , value in lookups .items ():
894+ field_purl_lookup &= models .Q (** {f"{ field } __{ key } " : value })
895+ # Combine the AND conditions for each field with OR
896+ query |= field_purl_lookup
897+
898+ if results := queryset .filter (query ):
899+ return results , use_distinct
900+
901+ return super ().get_search_results (request , queryset , search_term )
0 commit comments