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_id=transaction_instance.user.id, 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}") from apps.account.notification_service import create_and_send_notification from apps.course.models.course import get_localized_field @receiver(post_save, sender=TransactionParticipant) def notify_transaction_status_changed(sender, instance, created, **kwargs): """ Send notifications when transaction status transitions to SUCCESS, FAILED, or REFUNDED. """ status_changed = False if created: status_changed = True elif hasattr(instance, '_previous_status') and instance._previous_status != instance.status: status_changed = True if not status_changed: return course_title_en = get_localized_field('en', instance.course.title) course_title_fa = get_localized_field('fa', instance.course.title) # 1. SUCCESS if instance.status == TransactionParticipant.TransactionStatus.SUCCESS: create_and_send_notification( user=instance.user, title_en="Payment Successful", body_en=f"Your payment for course '{course_title_en}' was successful.", title_fa="پرداخت موفقیت‌آمیز", body_fa=f"پرداخت شما برای دوره «{course_title_fa}» با موفقیت انجام شد.", service='imam-javad', data={'type': 'payment_successful', 'transaction_id': instance.id, 'course_id': instance.course.id} ) # 2. FAILED elif instance.status == TransactionParticipant.TransactionStatus.FAILED: create_and_send_notification( user=instance.user, title_en="Payment Failed", body_en=f"Your payment attempt for course '{course_title_en}' failed.", title_fa="خطا در پرداخت", body_fa=f"عملیات پرداخت شما برای دوره «{course_title_fa}» ناموفق بود.", service='imam-javad', data={'type': 'payment_failed', 'transaction_id': instance.id, 'course_id': instance.course.id} ) # 3. REFUNDED elif instance.status == TransactionParticipant.TransactionStatus.REFUNDED: create_and_send_notification( user=instance.user, title_en="Refund Completed", body_en=f"Your refund for course '{course_title_en}' has been processed.", title_fa="بازگشت وجه انجام شد", body_fa=f"مبلغ پرداختی شما برای دوره «{course_title_fa}» بازگردانده (ریفاند) شد.", service='imam-javad', data={'type': 'refund_completed', 'transaction_id': instance.id, 'course_id': instance.course.id} )