1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

utilities: move protectederror handling to modelviewset

This commit is contained in:
hellerve
2019-05-28 21:11:23 +02:00
parent cc87d99017
commit 2c7bad9fff
3 changed files with 19 additions and 9 deletions

View File

@ -972,7 +972,7 @@ class VLANTest(APITestCase):
response = self.client.delete(url, **self.header)
# can't use assertHttpStatus here because we don't have response.data
self.assertEqual(response.status_code, 403)
self.assertEqual(response.status_code, 409)
content = json.loads(response.content.decode('utf-8'))
self.assertIn('detail', content)

View File

@ -4,7 +4,7 @@ import pytz
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import ManyToManyField
from django.db.models import ManyToManyField, ProtectedError
from django.http import Http404
from rest_framework.exceptions import APIException
from rest_framework.permissions import BasePermission
@ -248,6 +248,22 @@ class ModelViewSet(_ModelViewSet):
# Fall back to the hard-coded serializer class
return self.serializer_class
def dispatch(self, request, *args, **kwargs):
try:
return super().dispatch(request, *args, **kwargs)
except ProtectedError as e:
models = '\n'.join(
'- {} ({})'.format(o, o._meta)
for o in e.protected_objects.all()
)
msg = 'You tried deleting a model that is protected by:\n{}'.format(models)
return self.finalize_response(
request,
Response({'detail': msg}, status=409),
*args,
**kwargs
)
class FieldChoicesViewSet(ViewSet):
"""

View File

@ -1,7 +1,6 @@
from django.conf import settings
from django.db import ProgrammingError
from django.http import Http404, HttpResponseRedirect, JsonResponse
from django.db.models import ProtectedError
from django.http import Http404, HttpResponseRedirect
from django.urls import reverse
from .views import server_error
@ -63,11 +62,6 @@ class ExceptionHandlingMiddleware(object):
if isinstance(exception, Http404):
return
elif isinstance(exception, ProtectedError):
models = '\n'.join('- {} ({})'.format(o, o._meta) for o in exception.protected_objects.all())
msg = 'You tried deleting a model that is protected by:\n{}'.format(models)
return JsonResponse({'detail': msg}, status=403)
# Determine the type of exception. If it's a common issue, return a custom error page with instructions.
custom_template = None
if isinstance(exception, ProgrammingError):