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