2019-10-19 12:44:41 +03:00

35 lines
1.1 KiB
Python

from django.conf import settings
from django.db import transaction
from django.db.utils import IntegrityError
class AtomicSlugRetryMixin:
"""Makes :see:LocalizedUniqueSlugField work by retrying upon violation of
the UNIQUE constraint."""
def save(self, *args, **kwargs):
"""Saves this model instance to the database."""
max_retries = getattr(settings, "LOCALIZED_FIELDS_MAX_RETRIES", 100)
if not hasattr(self, "retries"):
self.retries = 0
with transaction.atomic():
try:
return super().save(*args, **kwargs)
except IntegrityError as ex:
# this is as retarded as it looks, there's no
# way we can put the retry logic inside the slug
# field class... we can also not only catch exceptions
# that apply to slug fields... so yea.. this is as
# retarded as it gets... i am sorry :(
if "slug" not in str(ex):
raise ex
if self.retries >= max_retries:
raise ex
self.retries += 1
return self.save()