From 0a0e1629108ca2b5d040587dcdc159b3b65cf0c0 Mon Sep 17 00:00:00 2001 From: Stefan Wehrmeyer Date: Wed, 23 Mar 2022 12:58:01 +0100 Subject: [PATCH] Make deletion not required, use deepcopy --- froide_govplan/admin.py | 47 +++++++++++-------- froide_govplan/forms.py | 13 +++-- .../froide_govplan/admin/_proposal.html | 2 +- 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/froide_govplan/admin.py b/froide_govplan/admin.py index f6c6733..6a0ce65 100644 --- a/froide_govplan/admin.py +++ b/froide_govplan/admin.py @@ -204,28 +204,35 @@ class GovernmentPlanAdmin(admin.ModelAdmin): if request.method == "POST": proposals = obj.proposals or {} proposal_id = request.POST.get("proposal_id") - data = proposals[proposal_id]["data"] - form = GovernmentPlanUpdateAcceptProposalForm(data=data, plan=obj) - if form.is_valid(): - update = form.save( - proposal_id=proposal_id, - delete_proposals=request.POST.getlist("proposal_delete"), - ) - if update is None: - self.message_user(request, _("The proposal has been deleted.")) + delete_proposals = request.POST.getlist("proposal_delete") + update = None + if proposal_id: + data = proposals[proposal_id]["data"] + form = GovernmentPlanUpdateAcceptProposalForm(data=data, plan=obj) + if form.is_valid(): + update = form.save( + proposal_id=proposal_id, + delete_proposals=delete_proposals, + ) + else: + form = GovernmentPlanUpdateAcceptProposalForm(data={}, plan=obj) + form.delete_proposals(delete_proposals) - return redirect(plan_url) + if update is None: + self.message_user(request, _("The proposal has been deleted.")) - self.message_user( - request, - _("An unpublished update has been created."), - ) - update_url = reverse( - "admin:froide_govplan_governmentplanupdate_change", - args=(update.pk,), - current_app=self.admin_site.name, - ) - return redirect(update_url) + return redirect(plan_url) + + self.message_user( + request, + _("An unpublished update has been created."), + ) + update_url = reverse( + "admin:froide_govplan_governmentplanupdate_change", + args=(update.pk,), + current_app=self.admin_site.name, + ) + return redirect(update_url) else: form = GovernmentPlanUpdateAcceptProposalForm(plan=obj) diff --git a/froide_govplan/forms.py b/froide_govplan/forms.py index 8add7fd..347169a 100644 --- a/froide_govplan/forms.py +++ b/froide_govplan/forms.py @@ -1,3 +1,5 @@ +import copy + from django import forms from django.contrib.auth import get_user_model from django.utils import timezone @@ -141,7 +143,7 @@ class GovernmentPlanUpdateAcceptProposalForm(GovernmentPlanUpdateProposalForm): super().__init__(*args, **kwargs) def get_proposals(self): - data = dict(self.plan.proposals) + data = copy.deepcopy(self.plan.proposals) user_ids = self.plan.proposals.keys() user_map = { str(u.id): u for u in get_user_model().objects.filter(id__in=user_ids) @@ -173,12 +175,15 @@ class GovernmentPlanUpdateAcceptProposalForm(GovernmentPlanUpdateProposalForm): proposal_user = proposals[proposal_id]["user"] update.user = proposal_user delete_proposals.append(proposal_id) + + self.delete_proposals(delete_proposals) + update.save() + return update + + def delete_proposals(self, delete_proposals): for pid in delete_proposals: if pid in self.plan.proposals: del self.plan.proposals[pid] if not self.plan.proposals: self.plan.proposals = None self.plan.save(update_fields=["proposals"]) - - update.save() - return update diff --git a/froide_govplan/templates/froide_govplan/admin/_proposal.html b/froide_govplan/templates/froide_govplan/admin/_proposal.html index 1f30b9f..9fa1668 100644 --- a/froide_govplan/templates/froide_govplan/admin/_proposal.html +++ b/froide_govplan/templates/froide_govplan/admin/_proposal.html @@ -29,7 +29,7 @@ {% for key, proposal in proposals.items %}