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.
 
 

67 lines
2.8 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=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}")