1
0
mirror of https://github.com/peeringdb/peeringdb.git synced 2024-05-11 05:55:09 +00:00

fix atomicity (#1087)

* remove survey notifications

* fixes #1086 atomicity issues

Co-authored-by: Stefan Pratter <stefan@20c.com>
This commit is contained in:
Matt Griswold
2021-11-12 11:16:25 -06:00
committed by GitHub
parent 276e40048c
commit c9108741cf
12 changed files with 151 additions and 17 deletions

View File

@@ -25,7 +25,7 @@ import unidecode
from django.apps import apps
from django.conf import settings
from django.core.exceptions import FieldError, ObjectDoesNotExist, ValidationError
from django.db import connection
from django.db import connection, transaction
from django.db.models import DateTimeField
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
@@ -596,6 +596,7 @@ class ModelViewSet(viewsets.ModelViewSet):
if not request.data:
raise DataMissingException(request.method)
@transaction.atomic
@client_check()
def create(self, request, *args, **kwargs):
"""
@@ -618,6 +619,11 @@ class ModelViewSet(viewsets.ModelViewSet):
r = super().create(request, *args, **kwargs)
if "_grainy" in r.data:
del r.data["_grainy"]
# used by api tests to test atomicity
if self._test_mode_force_failure:
raise IOError("simulated failure")
return r
except PermissionDenied:
return Response(status=status.HTTP_403_FORBIDDEN)
@@ -628,6 +634,7 @@ class ModelViewSet(viewsets.ModelViewSet):
finally:
self.get_serializer().finalize_create(request)
@transaction.atomic
@client_check()
def update(self, request, *args, **kwargs):
"""
@@ -650,6 +657,11 @@ class ModelViewSet(viewsets.ModelViewSet):
r = super().update(request, *args, **kwargs)
if "_grainy" in r.data:
del r.data["_grainy"]
# used by api tests to test atomicity
if self._test_mode_force_failure:
raise IOError("simulated failure")
return r
except PermissionDenied:
@@ -671,6 +683,7 @@ class ModelViewSet(viewsets.ModelViewSet):
"""
return Response(status=status.HTTP_403_FORBIDDEN)
@transaction.atomic
@client_check()
def destroy(self, request, pk, format=None):
"""
@@ -697,6 +710,11 @@ class ModelViewSet(viewsets.ModelViewSet):
if user_key:
reversion.set_comment(f"API-key: {user_key.prefix}")
obj.delete()
# used by api tests to test atomicity
if self._test_mode_force_failure:
raise IOError("simulated failure")
return Response(status=status.HTTP_204_NO_CONTENT)
else:
return Response(status=status.HTTP_403_FORBIDDEN)
@@ -721,6 +739,7 @@ class InternetExchangeMixin:
object, exposed to api/ix/{id}/{action}
"""
@transaction.atomic
@action(detail=True, methods=["POST"], throttle_classes=[IXFImportThrottle])
def request_ixf_import(self, request, *args, **kwargs):
@@ -784,6 +803,9 @@ def model_view_set(model, methods=None, mixins=None):
ref_tag = model_t.handleref.tag
router.register(ref_tag, viewset_t, basename=ref_tag)
# property required for testing api view atomicity
viewset_t._test_mode_force_failure = False
return viewset_t