[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
This commit is contained in:
2023-02-01 23:14:25 +00:00
parent 35d8d9423a
commit de11df1999
2 changed files with 26 additions and 6 deletions

View File

@@ -25,6 +25,9 @@ class PersonCreateView(LoginRequiredMixin, CreateView):
form_class = forms.PersonForm
def form_valid(self, form):
try:
self.request.user.person
except ObjectDoesNotExist:
if 'user' in self.request.GET:
form.instance.user = self.request.user
@@ -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

View File

@@ -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,10 +46,23 @@ class RelationshipCreateView(LoginRequiredMixin, RedirectView):
"""
def get_redirect_url(self, *args: typing.Any,
**kwargs: typing.Any) -> typing.Optional[str]:
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})