Handle IntegrityError when creating orders.
Added logic to handle IntegrityError by generating unique human-readable IDs for orders during creation. This ensures no duplicate order entries are created in case of integrity constraints.
This commit is contained in:
parent
3e53224092
commit
6fd0a48c0c
1 changed files with 22 additions and 3 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
import logging
|
import logging
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
|
||||||
|
from django.db import IntegrityError
|
||||||
from django.db.models.signals import post_save
|
from django.db.models.signals import post_save
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.utils.crypto import get_random_string
|
from django.utils.crypto import get_random_string
|
||||||
|
|
@ -10,7 +11,7 @@ from django.utils.translation import gettext_lazy as _
|
||||||
from sentry_sdk import capture_exception
|
from sentry_sdk import capture_exception
|
||||||
|
|
||||||
from core.models import Category, Order, Product, PromoCode, Wishlist
|
from core.models import Category, Order, Product, PromoCode, Wishlist
|
||||||
from core.utils import resolve_translations_for_elasticsearch
|
from core.utils import generate_human_readable_id, resolve_translations_for_elasticsearch
|
||||||
from core.utils.emailing import send_order_created_email, send_order_finished_email
|
from core.utils.emailing import send_order_created_email, send_order_finished_email
|
||||||
from evibes.utils.misc import create_object
|
from evibes.utils.misc import create_object
|
||||||
from vibes_auth.models import User
|
from vibes_auth.models import User
|
||||||
|
|
@ -21,7 +22,16 @@ logger = logging.getLogger(__name__)
|
||||||
@receiver(post_save, sender=User)
|
@receiver(post_save, sender=User)
|
||||||
def create_order_on_user_creation_signal(instance, created, **kwargs):
|
def create_order_on_user_creation_signal(instance, created, **kwargs):
|
||||||
if created:
|
if created:
|
||||||
Order.objects.create(user=instance, status="PENDING")
|
try:
|
||||||
|
Order.objects.create(user=instance, status="PENDING")
|
||||||
|
except IntegrityError:
|
||||||
|
human_readable_id = generate_human_readable_id()
|
||||||
|
while True:
|
||||||
|
if Order.objects.filter(human_readable_id=human_readable_id).exists():
|
||||||
|
human_readable_id = generate_human_readable_id()
|
||||||
|
continue
|
||||||
|
Order.objects.create(user=instance, status="PENDING", human_readable_id=human_readable_id)
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender=User)
|
@receiver(post_save, sender=User)
|
||||||
|
|
@ -56,7 +66,16 @@ def process_order_changes(instance, created, **kwargs):
|
||||||
pending_orders = Order.objects.filter(user=instance.user, status="PENDING")
|
pending_orders = Order.objects.filter(user=instance.user, status="PENDING")
|
||||||
|
|
||||||
if not pending_orders.exists():
|
if not pending_orders.exists():
|
||||||
Order.objects.create(user=instance.user, status="PENDING")
|
try:
|
||||||
|
Order.objects.create(user=instance.user, status="PENDING")
|
||||||
|
except IntegrityError:
|
||||||
|
human_readable_id = generate_human_readable_id()
|
||||||
|
while True:
|
||||||
|
if Order.objects.filter(human_readable_id=human_readable_id).exists():
|
||||||
|
human_readable_id = generate_human_readable_id()
|
||||||
|
continue
|
||||||
|
Order.objects.create(user=instance, status="PENDING", human_readable_id=human_readable_id)
|
||||||
|
break
|
||||||
|
|
||||||
if instance.status == "CREATED":
|
if instance.status == "CREATED":
|
||||||
if not instance.is_whole_digital:
|
if not instance.is_whole_digital:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue