|
| 1 | +from django.db.models.signals import post_save, pre_save |
| 2 | +from django.dispatch import receiver |
| 3 | + |
| 4 | +from enterprise_access.apps.api.serializers import CheckoutIntentReadOnlySerializer |
| 5 | +from enterprise_access.apps.customer_billing.constants import ( |
| 6 | + CheckoutIntentSegmentEvents, |
| 7 | +) |
| 8 | +from enterprise_access.apps.customer_billing.models import CheckoutIntent |
| 9 | +from enterprise_access.apps.track.segment import track_event |
| 10 | + |
| 11 | + |
| 12 | +@receiver(pre_save, sender=CheckoutIntent) |
| 13 | +def capture_previous_state(sender, instance, **kwargs): |
| 14 | + """Capture the previous state before saving.""" |
| 15 | + if instance.pk: # Only for updates, not creation |
| 16 | + try: |
| 17 | + instance._previous_state = CheckoutIntent.objects.get(pk=instance.pk).state |
| 18 | + except CheckoutIntent.DoesNotExist: |
| 19 | + instance._previous_state = None |
| 20 | + else: |
| 21 | + instance._previous_state = None |
| 22 | + |
| 23 | + |
| 24 | +@receiver(post_save, sender=CheckoutIntent) |
| 25 | +def track_checkout_intent_changes(sender, instance, created, **kwargs): |
| 26 | + """Automatically track events after save.""" |
| 27 | + previous_state = None if created else getattr(instance, '_previous_state', None) |
| 28 | + |
| 29 | + # Only track if it's a creation or if the state actually changed |
| 30 | + if created or (previous_state is not None and previous_state != instance.state): |
| 31 | + properties = CheckoutIntentReadOnlySerializer(instance).data |
| 32 | + properties["previous_state"] = previous_state |
| 33 | + properties["new_state"] = instance.state |
| 34 | + |
| 35 | + track_event( |
| 36 | + lms_user_id=str(instance.user.id), |
| 37 | + event_name=CheckoutIntentSegmentEvents.LIFECYCLE_EVENT, |
| 38 | + properties=properties, |
| 39 | + ) |
0 commit comments