uchill/chatnext/backend/apps/accounts/signals/user_creation_signals.py

92 lines
3.5 KiB
Python

# /home/ram/aparsoft/backend/apps/accounts/signals/user_creation_signals.py
"""
User Creation and Profile Management Signals Module
This module manages automated profile creation for the chatbot application.
Key functionalities:
- Automatic contact information creation for new users
- User activity tracking
Signal Flow:
1. New User Created → Creates contact information with default values
"""
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.db import transaction, IntegrityError
from ..models import CustomUser, UserContact
from core.models import Country
import logging
logger = logging.getLogger(__name__)
@receiver(post_save, sender=CustomUser)
def create_user_contact(sender, instance, created, **kwargs):
"""
Signal to create contact information for new users.
"""
if created:
try:
with transaction.atomic():
# Create contact info for all user types
try:
# Try to get a default country (create one if none exists)
default_country = None
try:
# Try to get any active country, preferably India or USA
default_country = Country.objects.filter(is_active=True).first()
if not default_country:
# Create a default country if none exists
default_country = Country.objects.create(
name="United States",
code="US",
phone_code="+1",
is_active=True,
)
logger.info("Created default country (United States)")
except Exception as e:
logger.warning(
f"Could not create/get default country: {str(e)}"
)
default_country = None
UserContact.objects.create(
user=instance,
contact_info={}, # Will use default from helper
country=default_country,
)
logger.info(f"Created user contact for {instance.email}")
except IntegrityError:
logger.warning(
f"Contact information already exists for user {instance.email}. Skipping creation."
)
except Exception as e:
logger.error(
f"Error creating user contact for {instance.email}: {str(e)}"
)
logger.info(
f"Created profile for user {instance.email} with role {instance.role}"
)
except IntegrityError as e:
# Handle specific database integrity errors
if "violates foreign key constraint" in str(e):
logger.error(
f"Foreign key constraint error for user {instance.email}: {str(e)}"
)
else:
logger.error(
f"Database integrity error creating profile for user {instance.email}: {str(e)}"
)
except Exception as e:
logger.error(
f"Error creating profile for user {instance.email}: {str(e)}",
exc_info=True,
)