Skip to content

Commit a917f3a

Browse files
committed
fix: wrap IntegrityError catches in transaction.atomic savepoints
1 parent 9d48623 commit a917f3a

1 file changed

Lines changed: 14 additions & 12 deletions

File tree

mailing_list/views.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from django.contrib.auth.mixins import LoginRequiredMixin
88
from django.core import signing
99
from django.core.cache import cache
10-
from django.db import IntegrityError
10+
from django.db import IntegrityError, transaction
1111
from django.core.mail import send_mail
1212
from django.http import HttpResponseRedirect
1313
from django.shortcuts import render
@@ -149,11 +149,12 @@ def post(self, request):
149149

150150
for list_id in to_subscribe:
151151
try:
152-
UserMailingListSubscription.objects.update_or_create(
153-
user=request.user,
154-
list_id=list_id,
155-
defaults={"email": email, "status": SubscriptionStatus.PENDING},
156-
)
152+
with transaction.atomic():
153+
UserMailingListSubscription.objects.update_or_create(
154+
user=request.user,
155+
list_id=list_id,
156+
defaults={"email": email, "status": SubscriptionStatus.PENDING},
157+
)
157158
except IntegrityError:
158159
errors.append(list_id)
159160
continue
@@ -315,12 +316,13 @@ def _handle_authenticated(self, request, email, list_id, managed_lists):
315316
return _prg_redirect(request)
316317

317318
try:
318-
UserMailingListSubscription.objects.create(
319-
user=request.user,
320-
list_id=list_id,
321-
email=email,
322-
status=SubscriptionStatus.PENDING,
323-
)
319+
with transaction.atomic():
320+
UserMailingListSubscription.objects.create(
321+
user=request.user,
322+
list_id=list_id,
323+
email=email,
324+
status=SubscriptionStatus.PENDING,
325+
)
324326
except IntegrityError:
325327
if _is_htmx(request):
326328
return self._card(

0 commit comments

Comments
 (0)