1010from collections import defaultdict
1111from urllib .parse import urlencode
1212
13+ from django .contrib .postgres .aggregates import JSONBAgg
1314from django .db .models import Exists
15+ from django .db .models import F
1416from django .db .models import Max
1517from django .db .models import OuterRef
1618from django .db .models import Prefetch
1719from django .db .models import Q
20+ from django .db .models .functions import JSONObject
1821from django_filters import rest_framework as filters
1922from drf_spectacular .utils import extend_schema
2023from packageurl import PackageURL
@@ -659,6 +662,16 @@ def get_affected_advisories_bulk(packages):
659662 max_exploitability = Max (
660663 "members__advisory__exploitability" ,
661664 ),
665+ ssvc_trees = JSONBAgg (
666+ JSONObject (
667+ vector = F ("members__advisory__related_ssvcs__vector" ),
668+ decision = F ("members__advisory__related_ssvcs__decision" ),
669+ options = F ("members__advisory__related_ssvcs__options" ),
670+ source_url = F ("members__advisory__related_ssvcs__source_advisory__url" ),
671+ ),
672+ filter = Q (members__advisory__related_ssvcs__decision__isnull = False ),
673+ distinct = True ,
674+ ),
662675 )
663676 .only (
664677 "id" ,
@@ -695,22 +708,6 @@ def get_affected_advisories_bulk(packages):
695708 identifier = primary .advisory_id .split ("/" )[- 1 ]
696709
697710 aliases = [a for a in adv ._aliases_cache if a != identifier ]
698- all_ssvc = []
699-
700- for member in adv .members .all ():
701- all_ssvc .extend (member .advisory .prefetched_ssvc_trees )
702-
703- ssvcs = []
704-
705- for ssvc in all_ssvc :
706- ssvcs .append (
707- {
708- "vector" : ssvc .vector ,
709- "decision" : ssvc .decision ,
710- "options" : ssvc .options ,
711- "source_url" : ssvc .source_advisory .url ,
712- }
713- )
714711
715712 grouped .append (
716713 {
@@ -722,7 +719,7 @@ def get_affected_advisories_bulk(packages):
722719 "risk_score" : risk_score ,
723720 "summary" : primary .summary ,
724721 "resource_url" : primary .get_absolute_url (),
725- "ssvc_trees" : ssvcs ,
722+ "ssvc_trees" : adv . ssvc_trees ,
726723 }
727724 )
728725
0 commit comments