|
21 | 21 |
|
22 | 22 | from vulnerabilities.models import AdvisoryReference |
23 | 23 | from vulnerabilities.models import AdvisorySet |
| 24 | +from vulnerabilities.models import AdvisorySetMember |
24 | 25 | from vulnerabilities.models import AdvisorySeverity |
25 | 26 | from vulnerabilities.models import AdvisoryV2 |
26 | 27 | from vulnerabilities.models import AdvisoryWeakness |
@@ -257,12 +258,26 @@ def get_affected_by_vulnerabilities(self, package): |
257 | 258 | is_grouped = AdvisorySet.objects.filter(package=package, relation_type="affecting").exists() |
258 | 259 |
|
259 | 260 | if is_grouped: |
260 | | - affected_by_advisories_qs = AdvisorySet.objects.filter( |
261 | | - package=package, relation_type="affecting" |
262 | | - ).select_related("primary_advisory") |
| 261 | + affected_by_advisories_qs = ( |
| 262 | + AdvisorySet.objects.filter(package=package, relation_type="affecting") |
| 263 | + .select_related("primary_advisory") |
| 264 | + .prefetch_related( |
| 265 | + Prefetch( |
| 266 | + "members", |
| 267 | + queryset=AdvisorySetMember.objects.filter(is_primary=False).select_related( |
| 268 | + "advisory" |
| 269 | + ), |
| 270 | + to_attr="secondary_members", |
| 271 | + ) |
| 272 | + ) |
| 273 | + ) |
263 | 274 |
|
264 | 275 | affected_groups = [ |
265 | | - (list(adv.aliases.all()), adv.primary_advisory, "") |
| 276 | + ( |
| 277 | + list(adv.aliases.all()), |
| 278 | + adv.primary_advisory, |
| 279 | + [member.advisory for member in adv.secondary_members], |
| 280 | + ) |
266 | 281 | for adv in affected_by_advisories_qs |
267 | 282 | ] |
268 | 283 |
|
@@ -303,12 +318,27 @@ def get_fixing_vulnerabilities(self, package): |
303 | 318 | is_grouped = AdvisorySet.objects.filter(package=package, relation_type="fixing").exists() |
304 | 319 |
|
305 | 320 | if is_grouped: |
306 | | - fixing_advisories_qs = AdvisorySet.objects.filter( |
307 | | - package=package, relation_type="fixing" |
308 | | - ).select_related("primary_advisory") |
| 321 | + fixing_advisories_qs = ( |
| 322 | + AdvisorySet.objects.filter(package=package, relation_type="fixing") |
| 323 | + .select_related("primary_advisory") |
| 324 | + .prefetch_related( |
| 325 | + Prefetch( |
| 326 | + "members", |
| 327 | + queryset=AdvisorySetMember.objects.filter(is_primary=False).select_related( |
| 328 | + "advisory" |
| 329 | + ), |
| 330 | + to_attr="secondary_members", |
| 331 | + ) |
| 332 | + ) |
| 333 | + ) |
309 | 334 |
|
310 | 335 | fixing_groups = [ |
311 | | - (list(adv.aliases.all()), adv.primary_advisory, "") for adv in fixing_advisories_qs |
| 336 | + ( |
| 337 | + list(adv.aliases.all()), |
| 338 | + adv.primary_advisory, |
| 339 | + [member.advisory for member in adv.secondary_members], |
| 340 | + ) |
| 341 | + for adv in fixing_advisories_qs |
312 | 342 | ] |
313 | 343 |
|
314 | 344 | advisories = get_advisories_from_groups(fixing_groups) |
@@ -360,7 +390,9 @@ def return_advisories_data(self, package, advisories_qs, advisories): |
360 | 390 | "exploitability": advisory["exploitability"], |
361 | 391 | "risk_score": advisory["risk_score"], |
362 | 392 | "summary": advisory["advisory"].summary, |
363 | | - "fixed_by_packages": list(set([pkg.purl for pkg in impact.fixed_by_packages.all()])), |
| 393 | + "fixed_by_packages": list( |
| 394 | + set([pkg.purl for pkg in impact.fixed_by_packages.all()]) |
| 395 | + ), |
364 | 396 | } |
365 | 397 | ) |
366 | 398 |
|
|
0 commit comments