From af490f4c9ff0d81e616017e02528c70a23bc72c0 Mon Sep 17 00:00:00 2001
From: Arnaud Fabre <arnaud.fabre@camobscura.fr>
Date: Wed, 10 Jun 2015 11:48:24 +0200
Subject: [PATCH] adds smarter behaviour in dossier.serializer create

---
 representatives_votes/serializers.py | 29 ++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/representatives_votes/serializers.py b/representatives_votes/serializers.py
index 82eeed8..a38bfed 100644
--- a/representatives_votes/serializers.py
+++ b/representatives_votes/serializers.py
@@ -172,19 +172,28 @@ class DossierDetailSerializer(DossierSerializer):
     def create(self, validated_data):
         proposals_data = validated_data.pop('proposals')
         dossier, _ = models.Dossier.objects.get_or_create(**validated_data)
-        
-        for proposal in models.Proposal.objects.filter(dossier=dossier).all():
-            proposal.votes.all().delete()
+
+        previous_proposals = set(dossier.proposals.all())
+        for proposal_data in proposals_data:
+            proposal, created = self._create_proposal(
+                proposal_data,
+                dossier
+            )
+        if not created:
+            previous_proposals.remove(proposal)
+
+        # Delete proposals that don't belongs to that dossier anymore
+        for proposal in previous_proposals:
             proposal.delete()
-        
-        self._create_proposals(proposals_data, dossier)
+
         return dossier
 
-    def _create_proposals(self, proposals_data, dossier):
-        for proposal_data in proposals_data:
-            votes_data = proposal_data.pop('votes')
-            proposal_data['dossier'] = dossier
-            proposal = models.Proposal.objects.create(**proposal_data)
+    
+    def _create_proposal(self, proposal_data, dossier):
+        votes_data = proposal_data.pop('votes')
+        proposal_data['dossier'] = dossier
+        proposal, created = models.Proposal.objects.get_or_create(**proposal_data)
+        if created:
             for vote_data in votes_data:
                 vote_data['proposal'] = proposal
                 models.Vote.objects.create(**vote_data)
-- 
GitLab