[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,8 +25,11 @@ class PersonCreateView(LoginRequiredMixin, CreateView):
form_class = forms.PersonForm form_class = forms.PersonForm
def form_valid(self, form): def form_valid(self, form):
if 'user' in self.request.GET: try:
form.instance.user = self.request.user self.request.user.person
except ObjectDoesNotExist:
if 'user' in self.request.GET:
form.instance.user = self.request.user
return super().form_valid(form) return super().form_valid(form)
@@ -117,7 +120,9 @@ class ProfileView(LoginRequiredMixin, DetailView):
except models.Relationship.DoesNotExist: except models.Relationship.DoesNotExist:
pass pass
except models.Person.DoesNotExist:
except ObjectDoesNotExist:
# No linked Person yet
pass pass
return context return context

View File

@@ -3,6 +3,8 @@
import typing import typing
from django.contrib.auth.mixins import LoginRequiredMixin 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.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.views.generic import DetailView, RedirectView, UpdateView from django.views.generic import DetailView, RedirectView, UpdateView
@@ -44,9 +46,22 @@ class RelationshipCreateView(LoginRequiredMixin, RedirectView):
""" """
def get_redirect_url(self, *args: typing.Any, def get_redirect_url(self, *args: typing.Any,
**kwargs: typing.Any) -> typing.Optional[str]: **kwargs: typing.Any) -> typing.Optional[str]:
target = models.Person.objects.get(pk=self.kwargs.get('person_pk')) target = None
relationship, _ = models.Relationship.objects.get_or_create( try:
source=self.request.user.person, target=target) 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', return reverse('people:relationship.update',
kwargs={'pk': relationship.pk}) kwargs={'pk': relationship.pk})