diff --git a/people/templates/people/person/detail_partial.html b/people/templates/people/person/detail_partial.html index f2f05fa..124213d 100644 --- a/people/templates/people/person/detail_partial.html +++ b/people/templates/people/person/detail_partial.html @@ -22,8 +22,11 @@

{{ person.name }}

-
+ New Relationship + +
{% include 'people/person/includes/answer_set_partial.html' %} diff --git a/people/views/relationship.py b/people/views/relationship.py index 3ea46d9..f11f147 100644 --- a/people/views/relationship.py +++ b/people/views/relationship.py @@ -1,12 +1,11 @@ -""" -Views for displaying or manipulating instances of :class:`Relationship`. -""" +"""Views for displaying or manipulating instances of :class:`Relationship`.""" -from django.db import IntegrityError -from django.forms import ValidationError +import typing + +from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse from django.utils import timezone -from django.views.generic import CreateView, DetailView, FormView +from django.views.generic import CreateView, DetailView, RedirectView from people import forms, models, permissions @@ -20,46 +19,18 @@ class RelationshipDetailView(permissions.UserIsLinkedPersonMixin, DetailView): related_person_field = 'source' -class RelationshipCreateView(permissions.UserIsLinkedPersonMixin, FormView): +class RelationshipCreateView(LoginRequiredMixin, RedirectView): + """View for creating a :class:`Relationship`. + + Redirects to a form containing the :class:`RelationshipQuestion`s. """ - View for creating a :class:`Relationship`. + def get_redirect_url(self, *args: typing.Any, **kwargs: typing.Any) -> typing.Optional[str]: + target = models.Person.objects.get(pk=self.kwargs.get('person_pk')) + relationship, _ = models.Relationship.objects.get_or_create( + source=self.request.user.person, target=target) - Displays / processes a form containing the :class:`RelationshipQuestion`s. - """ - model = models.Relationship - template_name = 'people/relationship/create.html' - form_class = forms.RelationshipForm - - def get_person(self) -> models.Person: - return models.Person.objects.get(pk=self.kwargs.get('person_pk')) - - def get_test_person(self) -> models.Person: - return self.get_person() - - def form_valid(self, form): - try: - self.object = models.Relationship.objects.create( - source=self.get_person(), target=form.cleaned_data['target']) - - except IntegrityError: - form.add_error( - None, - ValidationError('This relationship already exists', - code='already-exists')) - return self.form_invalid(form) - - return super().form_valid(form) - - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - - context['person'] = self.get_person() - - return context - - def get_success_url(self): return reverse('people:relationship.update', - kwargs={'relationship_pk': self.object.pk}) + kwargs={'relationship_pk': relationship.pk}) class RelationshipUpdateView(permissions.UserIsLinkedPersonMixin, CreateView):