from django.db.models.signals import post_save, pre_save from django.dispatch import receiver from django.db import transaction from apps.transaction.models import TransactionParticipant from apps.course.models import Participant @receiver(pre_save, sender=TransactionParticipant) def store_previous_status(sender, instance, **kwargs): """ Store the previous status before saving to compare with new status """ if instance.pk: try: previous_instance = TransactionParticipant.objects.get(pk=instance.pk) instance._previous_status = previous_instance.status except TransactionParticipant.DoesNotExist: instance._previous_status = None else: instance._previous_status = None @receiver(post_save, sender=TransactionParticipant) def create_participant_on_success(sender, instance, created, **kwargs): """ Create course participant when transaction status changes to SUCCESS """ # اگر تراکنش جدید ایجاد شده و وضعیت آن SUCCESS است if created and instance.status == TransactionParticipant.TransactionStatus.SUCCESS: create_course_participant(instance) # اگر تراکنش موجود بوده و وضعیت آن از حالت دیگری به SUCCESS تغییر کرده elif not created and hasattr(instance, '_previous_status'): if (instance._previous_status != TransactionParticipant.TransactionStatus.SUCCESS and instance.status == TransactionParticipant.TransactionStatus.SUCCESS): create_course_participant(instance) def create_course_participant(transaction_instance): """ Create course participant for successful transaction """ try: with transaction.atomic(): # بررسی اینکه آیا کاربر نقش student دارد یا نه if not transaction_instance.user.has_role('student'): transaction_instance.user.add_role('student') # بررسی اینکه آیا قبلاً participant ایجاد شده یا نه existing_participant = Participant.objects.filter( student=transaction_instance.user, course=transaction_instance.course ).first() if not existing_participant: # ایجاد participant جدید participant = Participant.objects.create( student=transaction_instance.user, course=transaction_instance.course ) print(f"Course participant created: {participant}") else: print(f"Course participant already exists: {existing_participant}") except Exception as e: print(f"Error creating course participant: {e}")