From 3fe331c15eb7db6fd6280318c0cba05afc38d4de Mon Sep 17 00:00:00 2001 From: Mukund Menon Date: Fri, 28 Feb 2025 18:46:50 +0530 Subject: [PATCH 1/2] fix: Add weaknesses data in packages api endpoint Signed-off-by: Mukund Menon --- vulnerabilities/api.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/vulnerabilities/api.py b/vulnerabilities/api.py index 1fd480ce9..3f37fdae3 100644 --- a/vulnerabilities/api.py +++ b/vulnerabilities/api.py @@ -355,14 +355,24 @@ def get_vulnerabilities_for_a_package(self, package, fix) -> dict: "fixed_by_packages", queryset=fixed_packages, to_attr="filtered_fixed_packages", + ), + Prefetch( + "weaknesses", + queryset=Weakness.objects.all(), + to_attr="prefetched_weaknesses", ) ) - return VulnSerializerRefsAndSummary( + vulnerabilities_data = VulnSerializerRefsAndSummary( instance=qs, many=True, context={"request": self.context["request"]}, ).data + for vuln, vuln_instance in zip(vulnerabilities_data, qs): + vuln["weaknesses"] = [weakness.to_dict() for weakness in vuln_instance.prefetched_weaknesses] + + return vulnerabilities_data + def get_fixing_vulnerabilities(self, package) -> dict: """ Return a mapping of vulnerabilities fixed in the given `package`. From 6d26273cdcb89a9f138cc9e82ed018332f2a4c5f Mon Sep 17 00:00:00 2001 From: Mukund Menon Date: Fri, 7 Mar 2025 00:09:46 +0530 Subject: [PATCH 2/2] revision: migrate changes to serializer Signed-off-by: Mukund Menon --- vulnerabilities/api.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/vulnerabilities/api.py b/vulnerabilities/api.py index 3f37fdae3..f4f3031e0 100644 --- a/vulnerabilities/api.py +++ b/vulnerabilities/api.py @@ -157,6 +157,8 @@ class VulnSerializerRefsAndSummary(BaseResourceSerializer): aliases = serializers.SerializerMethodField() + weaknesses = serializers.SerializerMethodField() + def get_aliases(self, obj): # Assuming `obj.aliases` is a queryset of `Alias` objects return [alias.alias for alias in obj.aliases.all()] @@ -173,6 +175,9 @@ def get_references(self, vulnerability): return serialized_references + def get_weaknesses(self, obj): + return [weakness.to_dict() for weakness in getattr(obj, "prefetched_weaknesses", [])] + class Meta: model = Vulnerability fields = [ @@ -185,6 +190,7 @@ class Meta: "risk_score", "exploitability", "weighted_severity", + "weaknesses", ] @@ -362,16 +368,11 @@ def get_vulnerabilities_for_a_package(self, package, fix) -> dict: to_attr="prefetched_weaknesses", ) ) - vulnerabilities_data = VulnSerializerRefsAndSummary( + return VulnSerializerRefsAndSummary( instance=qs, many=True, context={"request": self.context["request"]}, ).data - - for vuln, vuln_instance in zip(vulnerabilities_data, qs): - vuln["weaknesses"] = [weakness.to_dict() for weakness in vuln_instance.prefetched_weaknesses] - - return vulnerabilities_data def get_fixing_vulnerabilities(self, package) -> dict: """