@@ -341,28 +341,32 @@ class Meta:
341341 ordering = ["vulnerability" , "reference" ]
342342
343343
344- def purl_to_dict (purl : PackageURL ):
344+ def purl_to_dict (purl : PackageURL , without_version = False ):
345345 """
346346 Return a dict of purl components suitable for use in a queryset.
347347 We need to have specific empty values for using in querysets because of our peculiar model structure.
348348
349349 For example::
350350 >>> purl_to_dict(PackageURL.from_string("pkg:generic/postgres"))
351- {'type': 'generic', 'namespace': '', 'name': 'postgres', 'version ': '' , 'qualifiers ': {} , 'subpath ': ''}
351+ {'type': 'generic', 'namespace': '', 'name': 'postgres', 'qualifiers ': {} , 'subpath ': '' , 'version ': ''}
352352 >>> purl_to_dict(PackageURL.from_string("pkg:generic/postgres/postgres@1.2?foo=bar#baz"))
353- {'type': 'generic', 'namespace': 'postgres', 'name': 'postgres', 'version': '1.2', 'qualifiers': {'foo': 'bar'}, 'subpath': 'baz'}
353+ {'type': 'generic', 'namespace': 'postgres', 'name': 'postgres', 'qualifiers': {'foo': 'bar'}, 'subpath': 'baz', 'version': '1.2'}
354+ >>> purl_to_dict(purl = PackageURL.from_string("pkg:generic/postgres/postgres@1.2?foo=bar#baz"), without_version=True)
355+ {'type': 'generic', 'namespace': 'postgres', 'name': 'postgres', 'qualifiers': {'foo': 'bar'}, 'subpath': 'baz'}
354356 """
355357 if isinstance (purl , str ):
356358 purl = PackageURL .from_string (purl )
357359
358- return dict (
360+ lookup = dict (
359361 type = purl .type ,
360362 namespace = purl .namespace or "" ,
361363 name = purl .name ,
362- version = purl .version or "" ,
363364 qualifiers = purl .qualifiers or {},
364365 subpath = purl .subpath or "" ,
365366 )
367+ if not without_version :
368+ lookup ["version" ] = purl .version or ""
369+ return lookup
366370
367371
368372class PackageQuerySet (BaseQuerySet , PackageURLQuerySet ):
@@ -416,17 +420,6 @@ def with_vulnerability_counts(self):
416420 ),
417421 )
418422
419- def fixing_packages (self , package , with_qualifiers_and_subpath = True ):
420- """
421- Return a queryset of packages that are fixing the vulnerability of
422- ``package``.
423- """
424-
425- return self .match_purl (
426- purl = package .purl ,
427- with_qualifiers_and_subpath = with_qualifiers_and_subpath ,
428- ).fixing ()
429-
430423 def search (self , query = None ):
431424 """
432425 Return a Package queryset searching for the ``query``.
@@ -481,6 +474,15 @@ def for_cve(self, cve):
481474 """
482475 return self .filter (vulnerabilities__vulnerabilityreference__reference_id__exact = cve )
483476
477+ def matching_packages (self , purl ):
478+ if not purl :
479+ return self
480+ if not isinstance (purl , PackageURL ):
481+ purl = str (purl )
482+ purl = PackageURL .from_string (purl )
483+ lookups = purl_to_dict (purl = purl , without_version = True )
484+ return self .filter (** lookups )
485+
484486
485487def get_purl_query_lookups (purl ):
486488 """
@@ -584,13 +586,6 @@ def fixing(self):
584586 # legacy aliases
585587 resolved_to = fixing
586588
587- @property
588- def fixed_packages (self ):
589- """
590- Return a queryset of packages that are fixed.
591- """
592- return Package .objects .fixing_packages (package = self ).distinct ()
593-
594589 @property
595590 def is_vulnerable (self ) -> bool :
596591 """
0 commit comments