151151from vulnerabilities .models import VulnerabilityAnalysis
152152from vulnerabilities .models import get_risk_level
153153from vulnerabilities .triage .engine import evaluate_ruleset
154+ from vulnerabilities .triage .models import AnalysisPreset
154155from vulnerabilities .triage .models import ProductTriageRuleset
155156from vulnerabilities .triage .models import TriageAction
156157from vulnerabilities .triage .models import TriageRecord
@@ -1426,6 +1427,7 @@ def get_context_data(self, **kwargs):
14261427 self .attach_vulnerability_analyses (page_obj )
14271428 self .attach_triage_data (product , page_obj )
14281429
1430+ analysis_presets = list (AnalysisPreset .objects .scope (product .dataspace ))
14291431 context_data .update (
14301432 {
14311433 "filterset" : self .filterset ,
@@ -1434,6 +1436,7 @@ def get_context_data(self, **kwargs):
14341436 "search_query" : self .request .GET .get ("vulnerabilities-q" , "" ),
14351437 "risk_threshold" : risk_threshold ,
14361438 "has_triage_rulesets" : self .has_triage_rulesets ,
1439+ "analysis_presets" : analysis_presets ,
14371440 }
14381441 )
14391442
@@ -2934,6 +2937,45 @@ def vulnerability_analysis_form_view(request, productpackage_uuid, advisory_uid)
29342937 return HttpResponse (rendered_form )
29352938
29362939
2940+ @login_required
2941+ @require_POST
2942+ def apply_analysis_preset_view (request , productpackage_uuid , advisory_uid , preset_id ):
2943+ user = request .user
2944+ dataspace = user .dataspace
2945+
2946+ product_package_qs = ProductPackage .objects .product_secured (user , perms = "change_product" )
2947+ product_package = get_object_or_404 (product_package_qs , uuid = productpackage_uuid )
2948+ vulnerability = get_object_or_404 (
2949+ Vulnerability .objects .scope (dataspace ), advisory_uid = advisory_uid
2950+ )
2951+ preset = get_object_or_404 (AnalysisPreset .objects .scope (dataspace ), pk = preset_id )
2952+
2953+ existing = VulnerabilityAnalysis .objects .scope (dataspace ).get_or_none (
2954+ product_package = product_package ,
2955+ vulnerability = vulnerability ,
2956+ )
2957+ if existing :
2958+ return JsonResponse (
2959+ {"error" : "An analysis already exists for this vulnerability." }, status = 400
2960+ )
2961+
2962+ analysis = VulnerabilityAnalysis (
2963+ product_package = product_package ,
2964+ vulnerability = vulnerability ,
2965+ dataspace = dataspace ,
2966+ )
2967+ preset .apply_to_analysis (analysis )
2968+
2969+ content_fields = [analysis .state , analysis .justification , analysis .responses , analysis .detail ]
2970+ if not any (content_fields ):
2971+ return JsonResponse ({"error" : "This preset has no content fields to apply." }, status = 400 )
2972+
2973+ analysis .applied_by_preset = preset
2974+ analysis .save ()
2975+
2976+ return JsonResponse ({"success" : "applied" }, status = 200 )
2977+
2978+
29372979@login_required
29382980@csrf_exempt
29392981@require_http_methods (["DELETE" ])
0 commit comments