@@ -108,7 +108,7 @@ def apply_preset_for_vulnerabilities(preset, product, vulnerability_ids):
108108 analysis .detail ,
109109 ]
110110 if not any (content_fields ):
111- continue # Preset has no content fields -- cannot save a new analysis
111+ continue # Preset has no content fields - cannot save a new analysis
112112 else :
113113 analysis = existing
114114 preset .apply_to_analysis (analysis )
@@ -185,6 +185,40 @@ def sync_triage_records(ruleset, product, matched_rules_per_vulnerability_id, ap
185185 vulnerability_ids = list (matched_rules_per_vulnerability_id .keys ()),
186186 )
187187
188+ # Open a workflow Request for each TriageRecord when the Ruleset request_template is set.
189+ if ruleset .request_template_id :
190+ records_without_request = TriageRecord .objects .filter (
191+ ruleset = ruleset ,
192+ product = product ,
193+ request = None ,
194+ ).select_related ("vulnerability" )
195+
196+ if records_without_request :
197+ create_triage_requests (
198+ request_template = ruleset .request_template ,
199+ product = product ,
200+ records = records_without_request ,
201+ )
202+
203+
204+ def create_triage_requests (request_template , product , records ):
205+ """
206+ Open one Request per TriageRecord using the given request_template.
207+
208+ Uses the request_template creator as requester.
209+ """
210+ requester = request_template .created_by
211+
212+ for record in records :
213+ advisory_id = record .vulnerability .advisory_id
214+ triage_request = request_template .create_request (
215+ requester = requester ,
216+ title = f"Vulnerability: { advisory_id } " ,
217+ product_context = product ,
218+ object_id = product .pk ,
219+ )
220+ TriageRecord .objects .filter (pk = record .pk ).update (request = triage_request )
221+
188222
189223def evaluate_ruleset (ruleset , product , apply_preset = True ):
190224 """Evaluate a TriageRuleset against a product and persist the results."""
0 commit comments