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
@@ -644,24 +647,6 @@ def get_affected_advisories_bulk(packages):
644647 .select_related ("primary_advisory" )
645648 .prefetch_related (
646649 Prefetch ("aliases" , queryset = AdvisoryAlias .objects .only ("alias" )),
647- Prefetch (
648- "members" ,
649- queryset = AdvisorySetMember .objects .select_related ("advisory" ).prefetch_related (
650- Prefetch (
651- "advisory__related_ssvcs" ,
652- queryset = SSVC .objects .select_related ("source_advisory" )
653- .only (
654- "id" ,
655- "options" ,
656- "decision" ,
657- "vector" ,
658- "source_advisory__url" ,
659- )
660- .distinct ("source_advisory__url" ),
661- to_attr = "prefetched_ssvc_trees" ,
662- )
663- ),
664- ),
665650 )
666651 .annotate (
667652 max_severity = Max (
@@ -670,6 +655,16 @@ def get_affected_advisories_bulk(packages):
670655 max_exploitability = Max (
671656 "members__advisory__exploitability" ,
672657 ),
658+ ssvc_trees = JSONBAgg (
659+ JSONObject (
660+ vector = F ("members__advisory__related_ssvcs__vector" ),
661+ decision = F ("members__advisory__related_ssvcs__decision" ),
662+ options = F ("members__advisory__related_ssvcs__options" ),
663+ source_url = F ("members__advisory__related_ssvcs__source_advisory__url" ),
664+ ),
665+ filter = Q (members__advisory__related_ssvcs__decision__isnull = False ),
666+ distinct = True ,
667+ ),
673668 )
674669 .only (
675670 "id" ,
@@ -706,22 +701,6 @@ def get_affected_advisories_bulk(packages):
706701 identifier = primary .advisory_id .split ("/" )[- 1 ]
707702
708703 aliases = [a for a in adv ._aliases_cache if a != identifier ]
709- all_ssvc = []
710-
711- for member in adv .members .all ():
712- all_ssvc .extend (member .advisory .prefetched_ssvc_trees )
713-
714- ssvcs = []
715-
716- for ssvc in all_ssvc :
717- ssvcs .append (
718- {
719- "vector" : ssvc .vector ,
720- "decision" : ssvc .decision ,
721- "options" : ssvc .options ,
722- "source_url" : ssvc .source_advisory .url ,
723- }
724- )
725704
726705 grouped .append (
727706 {
@@ -733,7 +712,7 @@ def get_affected_advisories_bulk(packages):
733712 "risk_score" : risk_score ,
734713 "summary" : primary .summary ,
735714 "resource_url" : primary .get_absolute_url (),
736- "ssvc_trees" : ssvcs ,
715+ "ssvc_trees" : adv . ssvc_trees or [] ,
737716 }
738717 )
739718
0 commit comments