@@ -2877,11 +2877,7 @@ def latest_for_avid(self, avid: str):
28772877 )
28782878
28792879 def latest_per_avid (self ):
2880- return self .order_by (
2881- "avid" ,
2882- F ("date_collected" ).desc (nulls_last = True ),
2883- "-id" ,
2884- ).distinct ("avid" )
2880+ return self .filter (is_latest = True )
28852881
28862882 def latest_for_avids (self , avids ):
28872883 return self .filter (avid__in = avids ).latest_per_avid ()
@@ -2953,6 +2949,12 @@ def latest_advisories_for_purl(self, purl):
29532949 qs = self .filter (id__in = Subquery (adv_ids ))
29542950 return qs .latest_per_avid ()
29552951
2952+ def todo_excluded (self ):
2953+ """Exclude advisory ineligible for ToDo computation."""
2954+ from vulnerabilities .importers import TODO_EXCLUDED_PIPELINES
2955+
2956+ return self .exclude (datasource_id__in = TODO_EXCLUDED_PIPELINES )
2957+
29562958
29572959class AdvisorySet (models .Model ):
29582960
@@ -2998,6 +3000,7 @@ class AdvisoryV2(models.Model):
29983000 max_length = 200 ,
29993001 blank = False ,
30003002 null = False ,
3003+ db_index = True ,
30013004 help_text = "Unique ID for the datasource used for this advisory ." "e.g.: nginx_importer_v2" ,
30023005 )
30033006
@@ -3081,6 +3084,14 @@ class AdvisoryV2(models.Model):
30813084 help_text = "UTC Date on which the advisory was collected" ,
30823085 )
30833086
3087+ is_latest = models .BooleanField (
3088+ default = False ,
3089+ blank = False ,
3090+ null = False ,
3091+ db_index = True ,
3092+ help_text = "Indicates whether this is the latest version of the advisory identified by its AVID." ,
3093+ )
3094+
30843095 original_advisory_text = models .TextField (
30853096 blank = True ,
30863097 null = True ,
@@ -3133,6 +3144,11 @@ class AdvisoryV2(models.Model):
31333144 class Meta :
31343145 unique_together = ["datasource_id" , "advisory_id" , "unique_content_id" ]
31353146 ordering = ["datasource_id" , "advisory_id" , "date_published" , "unique_content_id" ]
3147+ constraints = [
3148+ models .UniqueConstraint (
3149+ fields = ["avid" ], condition = Q (is_latest = True ), name = "unique_latest_per_avid"
3150+ )
3151+ ]
31363152 indexes = [
31373153 models .Index (
31383154 fields = ["avid" , "-date_collected" , "-id" ],
0 commit comments