From c99affcc4ca007de2a27136701c2dd58423b1d8f Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Tue, 29 Sep 2026 22:01:29 +0530 Subject: [PATCH] feat: include advisory_id and advisory_uid for curation advisory Signed-off-by: Keshav Priyadarshi --- vulnerabilities/api_v3.py | 51 +++++++++++++++++----------- vulnerabilities/tests/test_api_v3.py | 17 ++++++++-- 2 files changed, 47 insertions(+), 21 deletions(-) diff --git a/vulnerabilities/api_v3.py b/vulnerabilities/api_v3.py index 71d41f5f9..64439c6fd 100644 --- a/vulnerabilities/api_v3.py +++ b/vulnerabilities/api_v3.py @@ -156,15 +156,20 @@ def get_related_ssvc_trees(self, obj): def get_curating_advisories(self, obj): request = self.context.get("request") - return [ - reverse( - "advisory_details", - kwargs={"avid": related_advisory.avid}, - request=request, - ) + curating_advisories = { + related_advisory.avid: { + "advisory_uid": related_advisory.avid, + "advisory_id": related_advisory.advisory_id.split("/")[-1], + "resource_url": reverse( + "advisory_details", + kwargs={"avid": related_advisory.avid}, + request=request, + ), + } for todo in obj.resolves_todos.all() for related_advisory in todo.advisories.all() - ] + } + return list(curating_advisories.values()) class Meta: model = AdvisoryV2 @@ -474,7 +479,7 @@ def create(self, request, *args, **kwargs): queryset=AdvisoryToDoV2.objects.prefetch_related( Prefetch( "advisories", - queryset=AdvisoryV2.objects.only("avid"), + queryset=AdvisoryV2.objects.only("avid", "advisory_id"), ) ), ), @@ -512,7 +517,7 @@ def get_queryset(self): queryset=AdvisoryToDoV2.objects.prefetch_related( Prefetch( "advisories", - queryset=AdvisoryV2.objects.only("avid"), + queryset=AdvisoryV2.objects.only("avid", "advisory_id"), ) ), ), @@ -682,7 +687,7 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit queryset=AdvisoryToDoV2.objects.prefetch_related( Prefetch( "advisories", - queryset=AdvisoryV2.objects.only("avid"), + queryset=AdvisoryV2.objects.only("avid", "advisory_id"), ) ), ), @@ -818,11 +823,15 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit aliases = [a for a in adv._aliases_cache if a != identifier] - curating_advisories = [ - f"{base_url}{related_advisory.get_absolute_url()}" + curating_advisories = { + related_advisory.avid: { + "advisory_uid": related_advisory.avid, + "advisory_id": related_advisory.advisory_id.split("/")[-1], + "resource_url": f"{base_url}{related_advisory.get_absolute_url()}", + } for todo in primary.resolves_todos.all() for related_advisory in todo.advisories.all() - ] + } resource_url = None advisory_url = primary.get_absolute_url() @@ -852,7 +861,7 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit "resource_url": resource_url, "todo_count": adv.primary_adv_todo_count, "is_curation": primary.is_curation, - "curating_advisories": curating_advisories, + "curating_advisories": list(curating_advisories.values()), } ) @@ -922,7 +931,7 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit queryset=AdvisoryToDoV2.objects.prefetch_related( Prefetch( "advisories", - queryset=AdvisoryV2.objects.only("avid"), + queryset=AdvisoryV2.objects.only("avid", "advisory_id"), ) ), ), @@ -950,11 +959,15 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit identifier = advisory.advisory_id.split("/")[-1] aliases = [alias.alias for alias in advisory.aliases.all() if alias.alias != identifier] - curating_advisories = [ - f"{base_url}{related_advisory.get_absolute_url()}" + curating_advisories = { + related_advisory.avid: { + "advisory_uid": related_advisory.avid, + "advisory_id": related_advisory.advisory_id.split("/")[-1], + "resource_url": f"{base_url}{related_advisory.get_absolute_url()}", + } for todo in advisory.resolves_todos.all() for related_advisory in todo.advisories.all() - ] + } resource_url = None advisory_url = advisory.get_absolute_url() @@ -986,7 +999,7 @@ def get_affected_advisories_bulk(packages, max_advisories, base_url, reachabilit "resource_url": resource_url, "todo_count": advisory.todo_count, "is_curation": advisory.is_curation, - "curating_advisories": curating_advisories, + "curating_advisories": list(curating_advisories.values()), } ) diff --git a/vulnerabilities/tests/test_api_v3.py b/vulnerabilities/tests/test_api_v3.py index 09579a8a3..59f60056d 100644 --- a/vulnerabilities/tests/test_api_v3.py +++ b/vulnerabilities/tests/test_api_v3.py @@ -846,7 +846,13 @@ def test_get_curating_advisories_in_package_endpoint(self): self.assertEqual(affected_by_vulnerabilities["is_curation"], True) self.assertEqual( affected_by_vulnerabilities["curating_advisories"], - ["http://testserver/advisories/ghsa/GHSA-4321"], + [ + { + "advisory_id": "GHSA-4321", + "advisory_uid": "ghsa/GHSA-4321", + "resource_url": "http://testserver/advisories/ghsa/GHSA-4321", + } + ], ) def test_get_curating_advisories_in_affected_by_advisory_endpoint(self): @@ -867,7 +873,14 @@ def test_get_curating_advisories_in_affected_by_advisory_endpoint(self): self.assertEqual(results["is_curation"], True) self.assertEqual( - results["curating_advisories"], ["http://testserver/advisories/ghsa/GHSA-4321"] + results["curating_advisories"], + [ + { + "advisory_id": "GHSA-4321", + "advisory_uid": "ghsa/GHSA-4321", + "resource_url": "http://testserver/advisories/ghsa/GHSA-4321", + } + ], ) def test_get_curating_advisories_in_advisory_endpoint(self):