@@ -396,6 +396,11 @@ class TriageRulesetAssignmentSerializer(serializers.Serializer):
396396 assigned = serializers .BooleanField (read_only = True )
397397
398398
399+ class AssignTriageRulesetSerializer (serializers .Serializer ):
400+ ruleset = serializers .UUIDField ()
401+ assigned = serializers .BooleanField ()
402+
403+
399404class ProductViewSet (
400405 ObjectPermissionsMixin ,
401406 SendAboutFilesMixin ,
@@ -484,7 +489,12 @@ def triage_records(self, request, uuid):
484489 serializer = TriageRecordSerializer (records , many = True )
485490 return Response (serializer .data )
486491
487- @action (detail = True , methods = ["get" , "post" ], url_path = "manage_triage_rulesets" )
492+ @action (
493+ detail = True ,
494+ methods = ["get" , "post" ],
495+ url_path = "manage_triage_rulesets" ,
496+ serializer_class = AssignTriageRulesetSerializer ,
497+ )
488498 def manage_triage_rulesets (self , request , uuid ):
489499 """
490500 GET: list every enabled triage ruleset in this product's dataspace, each flagged
@@ -496,22 +506,16 @@ def manage_triage_rulesets(self, request, uuid):
496506 product = self .get_object ()
497507
498508 if request .method == "POST" :
499- if not isinstance (request .data , dict ):
500- return Response (
501- {"error" : "Expected a JSON object with 'ruleset' and 'assigned'." },
502- status = status .HTTP_400_BAD_REQUEST ,
503- )
504- ruleset_uuid = request .data .get ("ruleset" )
505- assigned = request .data .get ("assigned" )
506- if ruleset_uuid is None or assigned is None :
507- return Response (
508- {"error" : "Both 'ruleset' and 'assigned' are required." },
509- status = status .HTTP_400_BAD_REQUEST ,
510- )
509+ serializer = AssignTriageRulesetSerializer (data = request .data )
510+ if not serializer .is_valid ():
511+ return Response (serializer .errors , status = status .HTTP_400_BAD_REQUEST )
512+
511513 ruleset = get_object_or_404 (
512514 TriageRuleset .objects .scope (product .dataspace ).filter (enabled = True ),
513- uuid = ruleset_uuid ,
515+ uuid = serializer . validated_data [ "ruleset" ] ,
514516 )
517+ assigned = serializer .validated_data ["assigned" ]
518+
515519 with transaction .atomic ():
516520 assignment = ProductTriageRuleset .objects .filter (
517521 product = product , ruleset = ruleset
@@ -520,10 +524,11 @@ def manage_triage_rulesets(self, request, uuid):
520524 ProductTriageRuleset .objects .create (
521525 product = product , ruleset = ruleset , dataspace = product .dataspace
522526 )
527+ reevaluate_product_rulesets (product )
523528 elif not assigned and assignment :
524529 assignment .delete ()
525530 delete_triage_records_for_assignment (ruleset = ruleset , product = product )
526- reevaluate_product_rulesets (product )
531+ reevaluate_product_rulesets (product )
527532 return Response (status = status .HTTP_200_OK )
528533
529534 assigned_ruleset_ids = set (
0 commit comments