From 9d3ee45bb35831a06959d86abb4a0c3a712461d7 Mon Sep 17 00:00:00 2001 From: Todd Dembrey <todd.dembrey@torchbox.com> Date: Mon, 11 Feb 2019 07:20:26 +0000 Subject: [PATCH] GH-957: Create the objects in the correct location --- opentech/apply/funds/forms.py | 36 +++++++++++++++++++++++++---------- opentech/apply/funds/views.py | 10 +--------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/opentech/apply/funds/forms.py b/opentech/apply/funds/forms.py index 8982f6afb..b95c8d122 100644 --- a/opentech/apply/funds/forms.py +++ b/opentech/apply/funds/forms.py @@ -77,9 +77,21 @@ class UpdateReviewersForm(forms.ModelForm): else: self.fields.pop('reviewer_reviewers') + self.roles = {} staff_reviewers = User.objects.staff() + + assigned_roles = { + assigned.role: assigned.reviewer + for assigned in AssignedReviewers.objects.filter( + submission=self.instance, + role__isnull=False + ) + } + for role in ReviewerRole.objects.all().order_by('order'): - field_name = 'reviewer_' + str(role.pk) + field_name = 'reviewer_' + str(role) + self.roles[field_name] = role + self.fields[field_name] = forms.ModelChoiceField( queryset=staff_reviewers, widget=Select2IconWidget(attrs={ @@ -89,9 +101,7 @@ class UpdateReviewersForm(forms.ModelForm): label=f'{role.name} Reviewer', ) # Pre-populate form field - existing_submission_reviewer = AssignedReviewers.objects.filter(submission=self.instance, role=role) - if existing_submission_reviewer: - self.fields[field_name].initial = existing_submission_reviewer[0].reviewer + self.fields[field_name].initial = assigned_roles.get(role) def prepare_field(self, field_name, initial, excluded): field = self.fields[field_name] @@ -123,15 +133,21 @@ class UpdateReviewersForm(forms.ModelForm): reviewers = instance.reviewers_not_reviewed current_reviewers = set(reviewers | self.submitted_reviewers) - AssignedReviewers.objects.filter(submission=instance) for reviewer in current_reviewers: - AssignedReviewers.objects.get_or_create( + AssignedReviewers.objects.update_or_create( submission=instance, - reviewer=reviewer, + role=None, + defaults={'reviewer': reviewer}, ) - AssignedReviewers.objects.filter( - submission=instance).exclude( - reviewer__in=current_reviewers).delete() + + for field, role in self.roles.items(): + reviewer = self.cleaned_data[field] + if reviewer: + AssignedReviewers.objects.update_or_create( + submission=instance, + role=role, + defaults={'reviewer': reviewer}, + ) return instance diff --git a/opentech/apply/funds/views.py b/opentech/apply/funds/views.py index 6f3012c75..67c906fda 100644 --- a/opentech/apply/funds/views.py +++ b/opentech/apply/funds/views.py @@ -292,19 +292,11 @@ class UpdateReviewersView(DelegatedViewMixin, UpdateView): def form_valid(self, form): old = copy(self.get_object()) old_reviewers = set( - copy.copy(reviewer) + copy(reviewer) for reviewer in AssignedReviewers.objects.filter(submission=old) ) response = super().form_valid(form) - # Save role reviewers ONLY, we saved others in UpdateReviewersForm.save() - form.cleaned_data.pop('reviewer_reviewers', None) - for key, user in form.cleaned_data.items(): - role = form.fields[key].widget.attrs['role'] - # Create the reviewer/role association to submission if it doesn't exist, or update it - obj, created = AssignedReviewers.objects.update_or_create( - submission=form.instance, role=role, defaults={'reviewer': user}) - new_reviewers = set(AssignedReviewers.objects.filter(submission=form.instance)) added = new_reviewers - old_reviewers removed = old_reviewers - new_reviewers -- GitLab