@@ -1552,6 +1552,7 @@ class EvidenceRevisionReadSerializer(BaseModelSerializer):
15521552 evidence = FieldsRelatedField ()
15531553 folder = FieldsRelatedField ()
15541554 str = serializers .CharField (source = "__str__" )
1555+ task_node = FieldsRelatedField ()
15551556
15561557 class Meta :
15571558 model = EvidenceRevision
@@ -1569,6 +1570,9 @@ def create(self, validated_data):
15691570 models .Max ("version" )
15701571 )["version__max" ]
15711572 validated_data ["version" ] = (max_version or 0 ) + 1
1573+ # Update evidence status to in_review when a new revision is submitted
1574+ evidence .status = Evidence .Status .IN_REVIEW
1575+ evidence .save ()
15721576 return super ().create (validated_data )
15731577
15741578
@@ -2399,6 +2403,7 @@ def get_timeline_entries(self, obj):
23992403class TaskTemplateReadSerializer (BaseModelSerializer ):
24002404 path = PathField (read_only = True )
24012405 folder = FieldsRelatedField ()
2406+ evidences = FieldsRelatedField (many = True )
24022407 assets = FieldsRelatedField (many = True )
24032408 applied_controls = FieldsRelatedField (many = True )
24042409 compliance_assessments = FieldsRelatedField (many = True )
@@ -2417,7 +2422,6 @@ class TaskTemplateReadSerializer(BaseModelSerializer):
24172422 # Expose task_node fields directly
24182423 status = serializers .SerializerMethodField ()
24192424 observation = serializers .SerializerMethodField ()
2420- evidences = serializers .SerializerMethodField ()
24212425
24222426 class Meta :
24232427 model = TaskTemplate
@@ -2439,21 +2443,12 @@ def get_observation(self, obj):
24392443 task_node = self .get_task_node (obj )
24402444 return task_node .observation if task_node else ""
24412445
2442- def get_evidences (self , obj ):
2443- task_node = self .get_task_node (obj )
2444- if task_node :
2445- return [{"id" : e .id , "str" : e .name } for e in task_node .evidences .all ()]
2446- return []
2447-
24482446
24492447class TaskTemplateWriteSerializer (BaseModelSerializer ):
24502448 status = serializers .CharField (required = False )
24512449 observation = serializers .CharField (
24522450 required = False , allow_blank = True , allow_null = True
24532451 )
2454- evidences = serializers .PrimaryKeyRelatedField (
2455- queryset = Evidence .objects .all (), many = True , required = False
2456- )
24572452
24582453 class Meta :
24592454 model = TaskTemplate
@@ -2470,11 +2465,9 @@ def to_representation(self, instance):
24702465 if task_node :
24712466 data ["status" ] = task_node .status
24722467 data ["observation" ] = task_node .observation
2473- data ["evidences" ] = [e .id for e in task_node .evidences .all ()]
24742468 else :
24752469 data ["status" ] = None
24762470 data ["observation" ] = ""
2477- data ["evidences" ] = []
24782471 return data
24792472
24802473 def create (self , validated_data ):
@@ -2539,7 +2532,6 @@ def _extract_tasknode_fields(self, validated_data):
25392532 return {
25402533 "status" : validated_data .pop ("status" , None ),
25412534 "observation" : validated_data .pop ("observation" , None ),
2542- "evidences" : validated_data .pop ("evidences" , []),
25432535 }
25442536
25452537 def _sync_task_node (
@@ -2580,28 +2572,49 @@ def _sync_task_node(
25802572 task_node .observation = tasknode_data ["observation" ]
25812573 task_node .save ()
25822574
2583- evidences = tasknode_data .get ("evidences" )
2584- if evidences is not None :
2585- task_node .evidences .set (evidences )
2586-
25872575
25882576class TaskNodeReadSerializer (BaseModelSerializer ):
25892577 path = PathField (read_only = True )
2590- task_template = FieldsRelatedField ()
2578+ task_template = FieldsRelatedField ([ "folder" , "id" ] )
25912579 folder = FieldsRelatedField ()
25922580 name = serializers .SerializerMethodField ()
25932581 assigned_to = FieldsRelatedField (many = True )
2594- evidences = FieldsRelatedField (many = True )
2582+ evidences = FieldsRelatedField ([ "folder" , "id" ], many = True )
25952583 is_recurrent = serializers .BooleanField (source = "task_template.is_recurrent" )
2596- applied_controls = FieldsRelatedField (many = True )
2597- compliance_assessments = FieldsRelatedField (many = True )
2598- assets = FieldsRelatedField (many = True )
2599- risk_assessments = FieldsRelatedField (many = True )
2600- findings_assessment = FieldsRelatedField (many = True )
2584+ expected_evidence = FieldsRelatedField (["folder" , "id" ], many = True )
2585+ evidence_reviewed = serializers .SerializerMethodField ()
2586+ evidence_revisions_map = serializers .SerializerMethodField ()
2587+ applied_controls = FieldsRelatedField (["folder" , "id" ], many = True )
2588+ compliance_assessments = FieldsRelatedField (["folder" , "id" ], many = True )
2589+ assets = FieldsRelatedField (["folder" , "id" ], many = True )
2590+ risk_assessments = FieldsRelatedField (["folder" , "id" ], many = True )
2591+ findings_assessment = FieldsRelatedField (["folder" , "id" ], many = True )
26012592
26022593 def get_name (self , obj ):
26032594 return obj .task_template .name if obj .task_template else ""
26042595
2596+ def get_evidence_reviewed (self , obj ):
2597+ evidence_reviewed = []
2598+ for evidence in obj .expected_evidence :
2599+ last_revision = evidence .last_revision
2600+ if last_revision and last_revision .task_node == obj :
2601+ evidence_reviewed .append (evidence .id )
2602+ return evidence_reviewed
2603+
2604+ def get_evidence_revisions_map (self , obj ):
2605+ """Returns a mapping of evidence ID to revision ID for this task node"""
2606+ from core .models import EvidenceRevision
2607+
2608+ evidence_revisions = {}
2609+ for evidence in obj .expected_evidence :
2610+ # Find revisions for this evidence that belong to this task node
2611+ revision = EvidenceRevision .objects .filter (
2612+ evidence = evidence , task_node = obj
2613+ ).first ()
2614+ if revision :
2615+ evidence_revisions [str (evidence .id )] = str (revision .id )
2616+ return evidence_revisions
2617+
26052618 class Meta :
26062619 model = TaskNode
26072620 exclude = ["to_delete" ]
@@ -2610,7 +2623,7 @@ class Meta:
26102623class TaskNodeWriteSerializer (BaseModelSerializer ):
26112624 class Meta :
26122625 model = TaskNode
2613- exclude = ["task_template" ]
2626+ exclude = ["task_template" , "evidences" ]
26142627
26152628
26162629class TerminologyReadSerializer (BaseModelSerializer ):
0 commit comments