100 lines
3.6 KiB
Python
100 lines
3.6 KiB
Python
"""
|
|
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)
|