3535from vulnerabilities .models import AdvisorySet
3636from vulnerabilities .models import AdvisorySetMember
3737from vulnerabilities .models import AdvisorySeverity
38+ from vulnerabilities .models import AdvisoryToDoV2
3839from vulnerabilities .models import AdvisoryV2
3940from vulnerabilities .models import AdvisoryWeakness
4041from vulnerabilities .models import ImpactedPackageAffecting
@@ -128,6 +129,7 @@ class AdvisoryV3Serializer(serializers.ModelSerializer):
128129 advisory_uid = serializers .CharField (source = "avid" , read_only = True )
129130 related_ssvc_trees = serializers .SerializerMethodField ()
130131 todo_count = serializers .IntegerField (read_only = True )
132+ curating_advisories = serializers .SerializerMethodField ()
131133
132134 def get_related_ssvc_trees (self , obj ):
133135 seen = set ()
@@ -152,6 +154,18 @@ def get_related_ssvc_trees(self, obj):
152154
153155 return result
154156
157+ def get_curating_advisories (self , obj ):
158+ request = self .context .get ("request" )
159+ return [
160+ reverse (
161+ "advisory_details" ,
162+ kwargs = {"avid" : related_advisory .avid },
163+ request = request ,
164+ )
165+ for todo in obj .resolves_todos .all ()
166+ for related_advisory in todo .advisories .all ()
167+ ]
168+
155169 class Meta :
156170 model = AdvisoryV2
157171 fields = [
@@ -168,6 +182,8 @@ class Meta:
168182 "risk_score" ,
169183 "related_ssvc_trees" ,
170184 "todo_count" ,
185+ "is_curation" ,
186+ "curating_advisories" ,
171187 ]
172188
173189
@@ -384,6 +400,8 @@ class Meta:
384400 "related_ssvc_trees" ,
385401 "fixed_by_packages" ,
386402 "todo_count" ,
403+ "is_curation" ,
404+ "curating_advisories" ,
387405 ]
388406
389407
@@ -451,6 +469,15 @@ def create(self, request, *args, **kwargs):
451469 "source_advisory__url" ,
452470 ),
453471 ),
472+ Prefetch (
473+ "resolves_todos" ,
474+ queryset = AdvisoryToDoV2 .objects .prefetch_related (
475+ Prefetch (
476+ "advisories" ,
477+ queryset = AdvisoryV2 .objects .only ("avid" ),
478+ )
479+ ),
480+ ),
454481 )
455482 )
456483
@@ -479,6 +506,17 @@ def get_queryset(self):
479506 filter = Q (advisory_todos__is_todo_stale = False ),
480507 )
481508 )
509+ .prefetch_related (
510+ Prefetch (
511+ "resolves_todos" ,
512+ queryset = AdvisoryToDoV2 .objects .prefetch_related (
513+ Prefetch (
514+ "advisories" ,
515+ queryset = AdvisoryV2 .objects .only ("avid" ),
516+ )
517+ ),
518+ ),
519+ )
482520 )
483521
484522
@@ -639,6 +677,15 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit
639677 "aliases" ,
640678 queryset = AdvisoryAlias .objects .only ("alias" ),
641679 ),
680+ Prefetch (
681+ "primary_advisory__resolves_todos" ,
682+ queryset = AdvisoryToDoV2 .objects .prefetch_related (
683+ Prefetch (
684+ "advisories" ,
685+ queryset = AdvisoryV2 .objects .only ("avid" ),
686+ )
687+ ),
688+ ),
642689 )
643690 .annotate (
644691 max_severity = Max (
@@ -658,6 +705,7 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit
658705 "primary_advisory__avid" ,
659706 "primary_advisory__summary" ,
660707 "primary_advisory__advisory_id" ,
708+ "primary_advisory__is_curation" ,
661709 )
662710 )
663711
@@ -770,6 +818,12 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit
770818
771819 aliases = [a for a in adv ._aliases_cache if a != identifier ]
772820
821+ curating_advisories = [
822+ f"{ base_url } { related_advisory .get_absolute_url ()} "
823+ for todo in primary .resolves_todos .all ()
824+ for related_advisory in todo .advisories .all ()
825+ ]
826+
773827 resource_url = None
774828 advisory_url = primary .get_absolute_url ()
775829
@@ -797,6 +851,8 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit
797851 "ssvc_trees" : adv .ssvc_trees ,
798852 "resource_url" : resource_url ,
799853 "todo_count" : adv .primary_adv_todo_count ,
854+ "is_curation" : primary .is_curation ,
855+ "curating_advisories" : curating_advisories ,
800856 }
801857 )
802858
@@ -861,6 +917,15 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit
861917 ),
862918 to_attr = "prefetched_ssvc_trees" ,
863919 ),
920+ Prefetch (
921+ "resolves_todos" ,
922+ queryset = AdvisoryToDoV2 .objects .prefetch_related (
923+ Prefetch (
924+ "advisories" ,
925+ queryset = AdvisoryV2 .objects .only ("avid" ),
926+ )
927+ ),
928+ ),
864929 )
865930 )
866931
@@ -885,6 +950,11 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit
885950 identifier = advisory .advisory_id .split ("/" )[- 1 ]
886951
887952 aliases = [alias .alias for alias in advisory .aliases .all () if alias .alias != identifier ]
953+ curating_advisories = [
954+ f"{ base_url } { related_advisory .get_absolute_url ()} "
955+ for todo in advisory .resolves_todos .all ()
956+ for related_advisory in todo .advisories .all ()
957+ ]
888958
889959 resource_url = None
890960 advisory_url = advisory .get_absolute_url ()
@@ -915,6 +985,8 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit
915985 ],
916986 "resource_url" : resource_url ,
917987 "todo_count" : advisory .todo_count ,
988+ "is_curation" : advisory .is_curation ,
989+ "curating_advisories" : curating_advisories ,
918990 }
919991 )
920992
0 commit comments