Skip to content

Commit 22b7ae6

Browse files
committed
M2M handling in 3 DREF types
1 parent 859d5d7 commit 22b7ae6

File tree

1 file changed

+140
-2
lines changed

1 file changed

+140
-2
lines changed

dref/serializers.py

Lines changed: 140 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

10851177
class 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

15261664
class CompletedDrefOperationsSerializer(serializers.ModelSerializer):

0 commit comments

Comments
 (0)