refactor(people): Move relationship answers to answer set

Answers to the relationship questions have been moved from the relationship
to another model RelationshipAnswerSet.  A new answer set is created each
time a user answers the relationship questions.

Resolves #16
Resolves #17
Resolves #18
This commit is contained in:
James Graham
2020-03-05 15:22:28 +00:00
parent 1a9ba731cf
commit 9b3b759254
10 changed files with 375 additions and 148 deletions

View File

@@ -3,7 +3,8 @@ Views for displaying or manipulating models in the 'people' app.
"""
from django.http import HttpResponseRedirect
from django.views.generic import CreateView, DetailView, ListView, UpdateView
from django.urls import reverse
from django.views.generic import CreateView, DetailView, FormView, ListView, UpdateView
from . import forms, models, permissions
@@ -80,15 +81,18 @@ class RelationshipCreateView(permissions.UserIsLinkedPersonMixin, CreateView):
"""
model = models.Relationship
template_name = 'people/relationship/create.html'
form_class = forms.RelationshipForm
fields = [
'source',
'target',
]
def get_test_person(self) -> models.Person:
"""
Get the person instance which should be used for access control checks.
"""
if self.request.method == 'POST':
return models.Person.objects.get(pk=self.request.POST.get('source'))
return models.Person.objects.get(pk=self.kwargs.get('person_pk'))
def get(self, request, *args, **kwargs):
@@ -116,10 +120,59 @@ class RelationshipCreateView(permissions.UserIsLinkedPersonMixin, CreateView):
return context
def get_success_url(self):
return reverse('people:relationship.update', kwargs={'pk': self.object.pk})
class RelationshipUpdateView(permissions.UserIsLinkedPersonMixin, CreateView):
"""
View for creating a :class:`Relationship`.
Displays / processes a form containing the :class:`RelationshipQuestion`s.
"""
model = models.RelationshipAnswerSet
template_name = 'people/relationship/update.html'
form_class = forms.RelationshipAnswerSetForm
def get_test_person(self) -> models.Person:
"""
Get the person instance which should be used for access control checks.
"""
relationship = models.Relationship.objects.get(pk=self.kwargs.get('relationship_pk'))
return relationship.source
def get(self, request, *args, **kwargs):
self.relationship = models.Relationship.objects.get(pk=self.kwargs.get('relationship_pk'))
self.person = self.relationship.source
return super().get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
self.relationship = models.Relationship.objects.get(pk=self.kwargs.get('relationship_pk'))
self.person = self.relationship.source
return super().post(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['person'] = self.person
context['relationship'] = self.relationship
return context
def get_initial(self):
initial = super().get_initial()
initial['relationship'] = self.relationship
return initial
def form_valid(self, form):
"""
Form is valid - create :class:`Relationship` and save answers to questions.
Don't rebind self.object to be the result of the form - it is a :class:`RelationshipAnswerSet`.
"""
self.object = form.save()
return HttpResponseRedirect(self.object.get_absolute_url())
form.save()
return HttpResponseRedirect(self.relationship.get_absolute_url())