@@ -691,6 +691,52 @@ def update(self, instance, validated_data):
691691 raise serializers .ValidationError ({"modified_at" : settings .DREF_OP_UPDATE_FINAL_REPORT_UPDATE_ERROR_MESSAGE })
692692 validated_data ["modified_at" ] = timezone .now ()
693693 dref = super ().update (instance , validated_data )
694+
695+ # Helper for robust M2M update
696+ def m2m (data , model_cls ):
697+ ids = []
698+ for item in data :
699+ if isinstance (item , dict ):
700+ item_id = item .get ("id" )
701+ if item_id :
702+ ids .append (item_id )
703+ else :
704+ obj = model_cls .objects .create (** item )
705+ ids .append (obj .id )
706+ else :
707+ ids .append (item )
708+ return ids
709+
710+ # planned_interventions M2M handling
711+ planned_interventions_data = self .initial_data .get ("planned_interventions" )
712+ if planned_interventions_data is not None :
713+ dref .planned_interventions .set (m2m (planned_interventions_data , PlannedIntervention ))
714+
715+ # needs_identified M2M handling
716+ needs_identified_data = self .initial_data .get ("needs_identified" )
717+ if needs_identified_data is not None :
718+ dref .needs_identified .set (m2m (needs_identified_data , IdentifiedNeed ))
719+
720+ # national_society_actions M2M handling
721+ national_society_actions_data = self .initial_data .get ("national_society_actions" )
722+ if national_society_actions_data is not None :
723+ dref .national_society_actions .set (m2m (national_society_actions_data , NationalSocietyAction ))
724+
725+ # risk_security M2M handling
726+ risk_security_data = self .initial_data .get ("risk_security" )
727+ if risk_security_data is not None :
728+ dref .risk_security .set (m2m (risk_security_data , RiskSecurity ))
729+
730+ # source_information M2M handling
731+ source_information_data = self .initial_data .get ("source_information" )
732+ if source_information_data is not None :
733+ dref .source_information .set (m2m (source_information_data , SourceInformation ))
734+
735+ # proposed_action M2M handling
736+ proposed_action_data = self .initial_data .get ("proposed_action" )
737+ if proposed_action_data is not None :
738+ dref .proposed_action .set (m2m (proposed_action_data , ProposedAction ))
739+
694740 if to :
695741 transaction .on_commit (lambda : send_dref_email .delay (dref .id , list (to ), "Updated" ))
696742 return dref
@@ -1079,7 +1125,53 @@ def update(self, instance, validated_data):
10791125 if modified_at and instance .modified_at and modified_at < instance .modified_at :
10801126 raise serializers .ValidationError ({"modified_at" : settings .DREF_OP_UPDATE_FINAL_REPORT_UPDATE_ERROR_MESSAGE })
10811127 validated_data ["modified_at" ] = timezone .now ()
1082- return super ().update (instance , validated_data )
1128+ operational_update = super ().update (instance , validated_data )
1129+
1130+ def m2m (data , model_cls ):
1131+ ids = []
1132+ for item in data :
1133+ if isinstance (item , dict ):
1134+ item_id = item .get ("id" )
1135+ if item_id :
1136+ ids .append (item_id )
1137+ else :
1138+ obj = model_cls .objects .create (** item )
1139+ ids .append (obj .id )
1140+ else :
1141+ ids .append (item )
1142+ return ids
1143+
1144+ # planned_interventions M2M handling
1145+ planned_interventions_data = self .initial_data .get ("planned_interventions" )
1146+ if planned_interventions_data is not None :
1147+ operational_update .planned_interventions .set (m2m (planned_interventions_data , PlannedIntervention ))
1148+
1149+ # needs_identified M2M handling
1150+ needs_identified_data = self .initial_data .get ("needs_identified" )
1151+ if needs_identified_data is not None :
1152+ operational_update .needs_identified .set (m2m (needs_identified_data , IdentifiedNeed ))
1153+
1154+ # national_society_actions M2M handling
1155+ national_society_actions_data = self .initial_data .get ("national_society_actions" )
1156+ if national_society_actions_data is not None :
1157+ operational_update .national_society_actions .set (m2m (national_society_actions_data , NationalSocietyAction ))
1158+
1159+ # risk_security M2M handling
1160+ risk_security_data = self .initial_data .get ("risk_security" )
1161+ if risk_security_data is not None :
1162+ operational_update .risk_security .set (m2m (risk_security_data , RiskSecurity ))
1163+
1164+ # source_information M2M handling
1165+ source_information_data = self .initial_data .get ("source_information" )
1166+ if source_information_data is not None :
1167+ operational_update .source_information .set (m2m (source_information_data , SourceInformation ))
1168+
1169+ # proposed_action M2M handling
1170+ proposed_action_data = self .initial_data .get ("proposed_action" )
1171+ if proposed_action_data is not None :
1172+ operational_update .proposed_action .set (m2m (proposed_action_data , ProposedAction ))
1173+
1174+ return operational_update
10831175
10841176
10851177class DrefFinalReportSerializer (NestedUpdateMixin , NestedCreateMixin , ModelSerializer ):
@@ -1520,7 +1612,53 @@ def update(self, instance, validated_data):
15201612 raise serializers .ValidationError ({"modified_at" : settings .DREF_OP_UPDATE_FINAL_REPORT_UPDATE_ERROR_MESSAGE })
15211613 validated_data ["modified_at" ] = timezone .now ()
15221614 validated_data ["modified_by" ] = self .context ["request" ].user
1523- return super ().update (instance , validated_data )
1615+ final_report = super ().update (instance , validated_data )
1616+
1617+ def m2m (data , model_cls ):
1618+ ids = []
1619+ for item in data :
1620+ if isinstance (item , dict ):
1621+ item_id = item .get ("id" )
1622+ if item_id :
1623+ ids .append (item_id )
1624+ else :
1625+ obj = model_cls .objects .create (** item )
1626+ ids .append (obj .id )
1627+ else :
1628+ ids .append (item )
1629+ return ids
1630+
1631+ # planned_interventions M2M handling
1632+ planned_interventions_data = self .initial_data .get ("planned_interventions" )
1633+ if planned_interventions_data is not None :
1634+ final_report .planned_interventions .set (m2m (planned_interventions_data , PlannedIntervention ))
1635+
1636+ # needs_identified M2M handling
1637+ needs_identified_data = self .initial_data .get ("needs_identified" )
1638+ if needs_identified_data is not None :
1639+ final_report .needs_identified .set (m2m (needs_identified_data , IdentifiedNeed ))
1640+
1641+ # national_society_actions M2M handling
1642+ national_society_actions_data = self .initial_data .get ("national_society_actions" )
1643+ if national_society_actions_data is not None :
1644+ final_report .national_society_actions .set (m2m (national_society_actions_data , NationalSocietyAction ))
1645+
1646+ # risk_security M2M handling
1647+ risk_security_data = self .initial_data .get ("risk_security" )
1648+ if risk_security_data is not None :
1649+ final_report .risk_security .set (m2m (risk_security_data , RiskSecurity ))
1650+
1651+ # source_information M2M handling
1652+ source_information_data = self .initial_data .get ("source_information" )
1653+ if source_information_data is not None :
1654+ final_report .source_information .set (m2m (source_information_data , SourceInformation ))
1655+
1656+ # proposed_action M2M handling
1657+ proposed_action_data = self .initial_data .get ("proposed_action" )
1658+ if proposed_action_data is not None :
1659+ final_report .proposed_action .set (m2m (proposed_action_data , ProposedAction ))
1660+
1661+ return final_report
15241662
15251663
15261664class CompletedDrefOperationsSerializer (serializers .ModelSerializer ):
0 commit comments