You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

123 lines
5.4 KiB

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}
)