|
25 | 25 | from django.core.paginator import Paginator |
26 | 26 | from django.db import transaction |
27 | 27 | from django.db.models import Count |
28 | | -from django.db.models import ObjectDoesNotExist |
| 28 | +from django.db.models import OuterRef |
29 | 29 | from django.db.models import Prefetch |
| 30 | +from django.db.models import Subquery |
30 | 31 | from django.db.models.functions import Lower |
31 | 32 | from django.forms import modelformset_factory |
32 | 33 | from django.http import Http404 |
@@ -2464,35 +2465,64 @@ def improve_packages_from_purldb_view(request, dataspace, name, version=""): |
2464 | 2465 | @login_required |
2465 | 2466 | def vulnerability_analysis_form_view(request, product_uuid, vulnerability_id, package_uuid): |
2466 | 2467 | user = request.user |
| 2468 | + dataspace = user.dataspace |
2467 | 2469 | form_class = VulnerabilityAnalysisForm |
2468 | 2470 | perms = "change_product" |
2469 | 2471 |
|
2470 | | - qs = Product.objects.get_queryset(user, perms=perms) |
2471 | | - product = get_object_or_404(qs, uuid=product_uuid) |
2472 | | - vulnerability_qs = Vulnerability.objects.scope(user.dataspace) |
| 2472 | + product_qs = Product.objects.get_queryset(user, perms=perms) |
| 2473 | + product = get_object_or_404(product_qs, uuid=product_uuid) |
| 2474 | + vulnerability_qs = Vulnerability.objects.scope(dataspace) |
2473 | 2475 | vulnerability = get_object_or_404(vulnerability_qs, vulnerability_id=vulnerability_id) |
2474 | 2476 | product_package_qs = ProductPackage.objects.product_secured(user, perms=perms) |
2475 | 2477 | product_package = get_object_or_404( |
2476 | 2478 | product_package_qs, product=product, package__uuid=package_uuid |
2477 | 2479 | ) |
| 2480 | + vulnerability_analysis_qs = VulnerabilityAnalysis.objects.scope(dataspace) |
2478 | 2481 |
|
2479 | | - try: |
2480 | | - vulnerability_analysis = VulnerabilityAnalysis.objects.scope(user.dataspace).get( |
2481 | | - product_package=product_package, |
2482 | | - vulnerability=vulnerability, |
| 2482 | + # Fetch the existing Analysis values for each affected products |
| 2483 | + product_analysis = vulnerability_analysis_qs.filter( |
| 2484 | + product=OuterRef("pk"), |
| 2485 | + package=OuterRef("packages__pk"), |
| 2486 | + vulnerability=OuterRef("packages__affected_by_vulnerabilities__pk"), |
| 2487 | + ) |
| 2488 | + affected_products = ( |
| 2489 | + product_qs.exclude(pk=product.pk) |
| 2490 | + .filter( |
| 2491 | + packages__uuid=package_uuid, |
| 2492 | + packages__affected_by_vulnerabilities=vulnerability, |
| 2493 | + ) |
| 2494 | + .annotate( |
| 2495 | + analysis_state=Subquery(product_analysis.values("state")[:1]), |
| 2496 | + analysis_justification=Subquery(product_analysis.values("justification")[:1]), |
| 2497 | + analysis_responses=Subquery(product_analysis.values("responses")[:1]), |
| 2498 | + analysis_detail=Subquery(product_analysis.values("detail")[:1]), |
2483 | 2499 | ) |
2484 | | - except ObjectDoesNotExist: |
2485 | | - vulnerability_analysis = None # Addition |
| 2500 | + ) |
| 2501 | + |
| 2502 | + vulnerability_analysis = vulnerability_analysis_qs.get_or_none( |
| 2503 | + product_package=product_package, |
| 2504 | + vulnerability=vulnerability, |
| 2505 | + ) |
2486 | 2506 |
|
2487 | 2507 | if request.method == "POST": |
2488 | | - form = form_class(user, instance=vulnerability_analysis, data=request.POST) |
| 2508 | + form = form_class( |
| 2509 | + user, |
| 2510 | + instance=vulnerability_analysis, |
| 2511 | + data=request.POST, |
| 2512 | + affected_products=affected_products, |
| 2513 | + ) |
2489 | 2514 | if form.is_valid(): |
2490 | 2515 | form.save() |
2491 | 2516 | messages.success(request, "Vulnerability analysis successfully updated.") |
2492 | 2517 | return JsonResponse({"success": "updated"}, status=200) |
2493 | 2518 | else: |
2494 | 2519 | initial = {"product_package": product_package, "vulnerability": vulnerability} |
2495 | | - form = form_class(user, instance=vulnerability_analysis, initial=initial) |
| 2520 | + form = form_class( |
| 2521 | + user, |
| 2522 | + instance=vulnerability_analysis, |
| 2523 | + initial=initial, |
| 2524 | + affected_products=affected_products, |
| 2525 | + ) |
2496 | 2526 |
|
2497 | 2527 | rendered_form = render_crispy_form(form, context=csrf(request)) |
2498 | 2528 |
|
|
0 commit comments