Skip to content

Commit a003b2d

Browse files
committed
feat: add list of curating advisory in api response
Signed-off-by: Keshav Priyadarshi <git@keshav.space>
1 parent 4d5f3b3 commit a003b2d

1 file changed

Lines changed: 72 additions & 0 deletions

File tree

vulnerabilities/api_v3.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
from vulnerabilities.models import AdvisorySet
3636
from vulnerabilities.models import AdvisorySetMember
3737
from vulnerabilities.models import AdvisorySeverity
38+
from vulnerabilities.models import AdvisoryToDoV2
3839
from vulnerabilities.models import AdvisoryV2
3940
from vulnerabilities.models import AdvisoryWeakness
4041
from 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

Comments
 (0)