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