From de11df1999001e1a9db13ee61cd9bac36392c767 Mon Sep 17 00:00:00 2001 From: Matthew Grove Date: Wed, 1 Feb 2023 23:14:25 +0000 Subject: [PATCH] [FIX] Creating relationships with missing Person objects When User had no associated Person object, or chosen person_pk did not correlate to an existing Person object, error 500 was thrown --- people/views/person.py | 11 ++++++++--- people/views/relationship.py | 21 ++++++++++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/people/views/person.py b/people/views/person.py index 95a63d4..dd65988 100644 --- a/people/views/person.py +++ b/people/views/person.py @@ -25,8 +25,11 @@ class PersonCreateView(LoginRequiredMixin, CreateView): form_class = forms.PersonForm def form_valid(self, form): - if 'user' in self.request.GET: - form.instance.user = self.request.user + try: + self.request.user.person + except ObjectDoesNotExist: + if 'user' in self.request.GET: + form.instance.user = self.request.user return super().form_valid(form) @@ -117,7 +120,9 @@ class ProfileView(LoginRequiredMixin, DetailView): except models.Relationship.DoesNotExist: pass - except models.Person.DoesNotExist: + + except ObjectDoesNotExist: + # No linked Person yet pass return context diff --git a/people/views/relationship.py b/people/views/relationship.py index 66589c6..2669238 100644 --- a/people/views/relationship.py +++ b/people/views/relationship.py @@ -3,6 +3,8 @@ import typing from django.contrib.auth.mixins import LoginRequiredMixin +from django.core.exceptions import ObjectDoesNotExist +from django.shortcuts import redirect from django.urls import reverse from django.utils import timezone from django.views.generic import DetailView, RedirectView, UpdateView @@ -44,9 +46,22 @@ class RelationshipCreateView(LoginRequiredMixin, RedirectView): """ 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) + target = None + try: + target = models.Person.objects.get(pk=self.kwargs.get('person_pk')) + if target is None: raise ObjectDoesNotExist + + except ObjectDoesNotExist: + # target doesn't exist + return reverse('people:person.list') + + try: + relationship, _ = models.Relationship.objects.get_or_create( + source=self.request.user.person, target=target) + + except ObjectDoesNotExist: + # User has no linked Person yet + return reverse('people:person.create') + '?user' return reverse('people:relationship.update', kwargs={'pk': relationship.pk})