""" Accounts signals - Handle onboarding events """ from django.db.models.signals import post_save, post_delete from django.dispatch import receiver from .models import User, UserAcknowledgement, UserProvisionalLog from .services import EmailService @receiver(post_save, sender=User) def log_provisional_user_creation(sender, instance, created, **kwargs): """ Log when a provisional user is created """ if created and instance.is_provisional: UserProvisionalLog.objects.create( user=instance, event_type='created', description=f"Provisional user {instance.email} created", metadata={ 'email': instance.email, 'first_name': instance.first_name, 'last_name': instance.last_name } ) @receiver(post_save, sender=UserAcknowledgement) def log_acknowledgement(sender, instance, created, **kwargs): """ Log when a user acknowledges an item """ if created and instance.is_acknowledged: UserProvisionalLog.objects.create( user=instance.user, event_type='step_completed', description=f"Acknowledged: {instance.checklist_item.text_en}", metadata={ 'checklist_item_id': str(instance.checklist_item.id), 'checklist_item_code': instance.checklist_item.code } ) @receiver(post_save, sender=User) def check_onboarding_completion(sender, instance, **kwargs): """ Check if all required acknowledgements are completed """ if instance.is_provisional and not instance.acknowledgement_completed: from .services import OnboardingService required_items = OnboardingService.get_checklist_items(instance).filter(is_required=True) acknowledged_items = UserAcknowledgement.objects.filter( user=instance, checklist_item__in=required_items, is_acknowledged=True ) # All required items acknowledged if required_items.count() > 0 and acknowledged_items.count() == required_items.count(): UserProvisionalLog.objects.create( user=instance, event_type='wizard_completed', description="All required acknowledgements completed", metadata={ 'total_items': required_items.count(), 'acknowledged_items': acknowledged_items.count() } ) @receiver(post_save, sender=User) def log_account_activation(sender, instance, **kwargs): """ Log when a user account is activated """ if not instance.is_provisional and instance.acknowledgement_completed: # Check if this is a recent activation (within last minute) from django.utils import timezone if instance.acknowledgement_completed_at and \ (timezone.now() - instance.acknowledgement_completed_at).total_seconds() < 60: UserProvisionalLog.objects.create( user=instance, event_type='user_activated', description=f"User {instance.email} account activated", metadata={ 'username': instance.username, 'email': instance.email } ) # Send notification to PX Admins from django.contrib.auth import get_user_model User = get_user_model() admin_users = User.objects.filter(groups__name='PX Admin') EmailService.send_completion_notification(instance, admin_users)