@@ -56,11 +56,15 @@ class VulnSerializerRefsAndSummary(serializers.HyperlinkedModelSerializer):
5656 Used for nesting inside package focused APIs.
5757 """
5858
59+ fixed_packages = MinimalPackageSerializer (
60+ many = True , source = "filtered_fixed_packages" , read_only = True
61+ )
62+
5963 references = VulnerabilityReferenceSerializer (many = True , source = "vulnerabilityreference_set" )
6064
6165 class Meta :
6266 model = Vulnerability
63- fields = ["url" , "vulnerability_id" , "summary" , "references" ]
67+ fields = ["url" , "vulnerability_id" , "summary" , "references" , "fixed_packages" ]
6468
6569
6670class MinimalVulnerabilitySerializer (serializers .HyperlinkedModelSerializer ):
@@ -73,21 +77,6 @@ class Meta:
7377 fields = ["url" , "vulnerability_id" ]
7478
7579
76- class PackageSerializerFixedVulns (serializers .HyperlinkedModelSerializer ):
77- """
78- Used for nesting inside vulnerability focused APIs.
79- """
80-
81- purl = serializers .CharField (source = "package_url" )
82- fixing_vulnerabilities = MinimalVulnerabilitySerializer (
83- many = True , source = "resolved_to" , read_only = True
84- )
85-
86- class Meta :
87- model = Package
88- fields = ["url" , "purl" , "fixing_vulnerabilities" ]
89-
90-
9180class AliasSerializer (serializers .HyperlinkedModelSerializer ):
9281 """
9382 Used for nesting inside package focused APIs.
@@ -128,13 +117,52 @@ def to_representation(self, instance):
128117 return data
129118
130119 purl = serializers .CharField (source = "package_url" )
131- affected_by_vulnerabilities = VulnSerializerRefsAndSummary (
132- many = True , source = "vulnerable_to" , read_only = True
133- )
134- fixing_vulnerabilities = VulnSerializerRefsAndSummary (
135- many = True , source = "resolved_to" , read_only = True
136- )
137- fixed_packages = PackageSerializerFixedVulns (many = True , read_only = True )
120+
121+ affected_by_vulnerabilities = serializers .SerializerMethodField ("get_affected_vulnerabilities" )
122+
123+ fixing_vulnerabilities = serializers .SerializerMethodField ("get_fixed_vulnerabilities" )
124+
125+ def get_fixed_packages (self , package ):
126+ return Package .objects .filter (
127+ name = package .name ,
128+ namespace = package .namespace ,
129+ type = package .type ,
130+ qualifiers = package .qualifiers ,
131+ subpath = package .subpath ,
132+ packagerelatedvulnerability__fix = True ,
133+ ).distinct ()
134+
135+ def get_affected_vulnerabilities (self , package ):
136+ fixed_packages = self .get_fixed_packages (package = package )
137+ qs = package .vulnerabilities .filter (packagerelatedvulnerability__fix = False )
138+ qs = qs .prefetch_related (
139+ Prefetch (
140+ "packages" ,
141+ queryset = fixed_packages ,
142+ to_attr = "filtered_fixed_packages" ,
143+ )
144+ )
145+ return VulnSerializerRefsAndSummary (
146+ instance = qs ,
147+ many = True ,
148+ context = {"request" : self .context ["request" ]},
149+ ).data
150+
151+ def get_fixed_vulnerabilities (self , package ):
152+ fixed_packages = self .get_fixed_packages (package = package )
153+ qs = package .vulnerabilities .filter (packagerelatedvulnerability__fix = True )
154+ qs = qs .prefetch_related (
155+ Prefetch (
156+ "packages" ,
157+ queryset = fixed_packages ,
158+ to_attr = "filtered_fixed_packages" ,
159+ )
160+ )
161+ return VulnSerializerRefsAndSummary (
162+ instance = qs ,
163+ many = True ,
164+ context = {"request" : self .context ["request" ]},
165+ ).data
138166
139167 class Meta :
140168 model = Package
@@ -148,7 +176,6 @@ class Meta:
148176 "qualifiers" ,
149177 "subpath" ,
150178 "affected_by_vulnerabilities" ,
151- "fixed_packages" ,
152179 "fixing_vulnerabilities" ,
153180 ]
154181
0 commit comments