@@ -2934,53 +2934,63 @@ def latest_for_avids(self, avids):
29342934 return self .filter (avid__in = avids ).latest_per_avid ()
29352935
29362936 def latest_affecting_advisories_for_purl (self , purl ):
2937- adv_ids = ImpactedPackageAffecting .objects .filter ( package__package_url = purl ). values_list (
2938- "impacted_package__advisory_id" ,
2939- flat = True ,
2940- )
2937+ adv_ids = ImpactedPackage .objects .filter (
2938+ affecting_packages__package_url = purl , is_latest = True
2939+ ). values_list ( "advisory_id" , flat = True )
2940+
29412941 return self .filter (id__in = Subquery (adv_ids )).latest_per_avid ()
29422942
29432943 def latest_affecting_advisories_for_purls (self , purls ):
2944- adv_ids = ImpactedPackageAffecting .objects .filter (
2945- package__package_url__in = purls
2944+ adv_ids = ImpactedPackage .objects .filter (
2945+ affecting_packages__package_url__in = purls , is_latest = True
29462946 ).values_list (
2947- "impacted_package__advisory_id " ,
2947+ "advisory_id " ,
29482948 flat = True ,
29492949 )
29502950 return self .filter (id__in = Subquery (adv_ids )).latest_per_avid ()
29512951
29522952 def latest_affecting_advisories_for_packages (self , purls ):
2953- adv_ids = ImpactedPackageAffecting .objects .filter (package__in = purls ).values_list (
2954- "impacted_package__advisory_id" ,
2953+ adv_ids = ImpactedPackage .objects .filter (
2954+ affecting_packages__package_url__in = purls , is_latest = True
2955+ ).values_list (
2956+ "advisory_id" ,
29552957 flat = True ,
29562958 )
29572959 return self .filter (id__in = Subquery (adv_ids )).latest_per_avid ()
29582960
29592961 def latest_fixed_by_advisories_for_purl (self , purl ):
2960- adv_ids = ImpactedPackageFixedBy .objects .filter (package__package_url = purl ).values_list (
2961- "impacted_package__advisory_id" ,
2962+ adv_ids = ImpactedPackage .objects .filter (
2963+ fixed_by_packages__package_url = purl , is_latest = True
2964+ ).values_list (
2965+ "advisory_id" ,
29622966 flat = True ,
29632967 )
29642968 return self .filter (id__in = Subquery (adv_ids )).latest_per_avid ()
29652969
29662970 def latest_fixed_by_advisories_for_purls (self , purls ):
2967- adv_ids = ImpactedPackageFixedBy .objects .filter (package__package_url__in = purls ).values_list (
2968- "impacted_package__advisory_id" ,
2971+ adv_ids = ImpactedPackage .objects .filter (
2972+ fixed_by_packages__package_url__in = purls , is_latest = True
2973+ ).values_list (
2974+ "advisory_id" ,
29692975 flat = True ,
29702976 )
29712977
29722978 return self .filter (id__in = Subquery (adv_ids )).latest_per_avid ()
29732979
29742980 def latest_advisories_for_purls (self , purls ):
29752981 adv_ids = (
2976- ImpactedPackageAffecting .objects .filter (package__package_url__in = purls )
2982+ ImpactedPackage .objects .filter (
2983+ affecting_packages__package_url__in = purls , is_latest = True
2984+ )
29772985 .values_list (
2978- "impacted_package__advisory_id " ,
2986+ "advisory_id " ,
29792987 flat = True ,
29802988 )
29812989 .union (
2982- ImpactedPackageFixedBy .objects .filter (package__package_url__in = purls ).values_list (
2983- "impacted_package__advisory_id" ,
2990+ ImpactedPackage .objects .filter (
2991+ fixed_by_packages__package_url__in = purls , is_latest = True
2992+ ).values_list (
2993+ "advisory_id" ,
29842994 flat = True ,
29852995 )
29862996 )
@@ -2991,14 +3001,16 @@ def latest_advisories_for_purls(self, purls):
29913001
29923002 def latest_advisories_for_purl (self , purl ):
29933003 adv_ids = (
2994- ImpactedPackageAffecting .objects .filter (package__package_url = purl )
3004+ ImpactedPackage .objects .filter (affecting_packages__package_url = purl , is_latest = True )
29953005 .values_list (
2996- "impacted_package__advisory_id " ,
3006+ "advisory_id " ,
29973007 flat = True ,
29983008 )
29993009 .union (
3000- ImpactedPackageFixedBy .objects .filter (package__package_url = purl ).values_list (
3001- "impacted_package__advisory_id" ,
3010+ ImpactedPackage .objects .filter (
3011+ fixed_by_packages__package_url = purl , is_latest = True
3012+ ).values_list (
3013+ "advisory_id" ,
30023014 flat = True ,
30033015 )
30043016 )
@@ -3352,6 +3364,14 @@ class ImpactedPackage(models.Model):
33523364 help_text = "Timestamp of the last successful vers range unfurl." ,
33533365 )
33543366
3367+ is_latest = models .BooleanField (
3368+ default = False ,
3369+ blank = False ,
3370+ null = False ,
3371+ db_index = True ,
3372+ help_text = "Indicates whether this is the latest impact for the advisory." ,
3373+ )
3374+
33553375 def to_dict (self ):
33563376 from vulnerabilities .utils import purl_to_dict
33573377
0 commit comments