From cbc70ab85a2be01737d0fa0d3d9f10716a05e5c8 Mon Sep 17 00:00:00 2001 From: James Graham Date: Fri, 18 Dec 2020 15:56:19 +0000 Subject: [PATCH] fix: do lookup by person in person update view Fixes #42 --- people/forms.py | 5 ++++- people/views/person.py | 34 ++++++++++++++-------------------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/people/forms.py b/people/forms.py index 199d6b2..4d0d5dc 100644 --- a/people/forms.py +++ b/people/forms.py @@ -95,7 +95,10 @@ class PersonAnswerSetForm(forms.ModelForm, DynamicAnswerSetBase): def save(self, commit=True) -> models.PersonAnswerSet: # Save Relationship model - self.instance = super().save(commit=commit) + self.instance = super().save(commit=False) + self.instance.person_id = self.initial['person_id'] + if commit: + self.instance.save() if commit: # Save answers to relationship questions diff --git a/people/views/person.py b/people/views/person.py index d0023dd..5da0d1e 100644 --- a/people/views/person.py +++ b/people/views/person.py @@ -69,38 +69,32 @@ class ProfileView(permissions.UserIsLinkedPersonMixin, DetailView): class PersonUpdateView(permissions.UserIsLinkedPersonMixin, UpdateView): """View for updating a :class:`Person` record.""" - model = models.PersonAnswerSet + model = models.Person + context_object_name = 'person' template_name = 'people/person/update.html' form_class = forms.PersonAnswerSetForm - def get_test_person(self) -> models.Person: - """Get the person instance which should be used for access control checks.""" - return models.Person.objects.get(pk=self.kwargs.get('pk')) + def get_initial(self) -> typing.Dict[str, typing.Any]: + return { + 'person_id': self.object.id, + } - def get(self, request, *args, **kwargs): - self.person = models.Person.objects.get(pk=self.kwargs.get('pk')) + def get_form_kwargs(self) -> typing.Dict[str, typing.Any]: + """Remove instance from form kwargs as it's a person, but expects a PersonAnswerSet.""" + kwargs = super().get_form_kwargs() + kwargs.pop('instance') - return super().get(request, *args, **kwargs) - - def post(self, request, *args, **kwargs): - self.person = models.Person.objects.get(pk=self.kwargs.get('pk')) - - return super().post(request, *args, **kwargs) - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - - context['person'] = self.person - - return context + return kwargs def form_valid(self, form): """Mark any previous answer sets as replaced.""" response = super().form_valid(form) now_date = timezone.now().date() + # Saving the form made self.object a PersonAnswerSet - so go up, then back down # Shouldn't be more than one after initial updates after migration - for answer_set in self.person.answer_sets.exclude(pk=self.object.pk): + for answer_set in self.object.person.answer_sets.exclude( + pk=self.object.pk): answer_set.replaced_timestamp = now_date answer_set.save()