uchill/chatnext/backend/apps/accounts/utils/profile_picture_utils.py

166 lines
5.2 KiB
Python

# /home/ram/aparsoft/backend/apps/accounts/utils/profile_picture_utils.py
"""
Utility functions for handling profile picture operations with graceful fallbacks.
"""
import logging
from django.core.files.storage import default_storage
logger = logging.getLogger(__name__)
def has_profile_picture_field(user):
"""
Check if the user model has a profile_picture field.
Args:
user: User instance
Returns:
bool: True if profile_picture field exists
"""
return hasattr(user, 'profile_picture')
def get_profile_picture_url(user, request=None):
"""
Safely get profile picture URL for a user.
Args:
user: User instance
request: Request object for building absolute URI
Returns:
str or None: Profile picture URL or None if not available
"""
try:
if not has_profile_picture_field(user):
logger.warning(f"Profile picture field not found for user {user.id}. Run migrations.")
return None
profile_picture = getattr(user, 'profile_picture', None)
if not profile_picture:
return None
# Check if file exists
if not default_storage.exists(profile_picture.name):
logger.warning(f"Profile picture file missing for user {user.id}: {profile_picture.name}")
# Clear the invalid reference
user.profile_picture = None
user.save(update_fields=['profile_picture'])
return None
# Generate URL
if request:
return request.build_absolute_uri(default_storage.url(profile_picture.name))
else:
return default_storage.url(profile_picture.name)
except Exception as e:
logger.error(f"Error getting profile picture URL for user {user.id}: {str(e)}")
return None
def set_profile_picture(user, file_path):
"""
Safely set profile picture for a user.
Args:
user: User instance
file_path: Path to the new profile picture file
Returns:
bool: True if successful, False otherwise
"""
try:
if not has_profile_picture_field(user):
logger.error(f"Cannot set profile picture - field not found for user {user.id}")
return False
# Delete old profile picture if exists
old_picture = getattr(user, 'profile_picture', None)
if old_picture:
try:
if default_storage.exists(old_picture.name):
default_storage.delete(old_picture.name)
except Exception as e:
logger.warning(f"Failed to delete old profile picture for user {user.id}: {str(e)}")
# Set new profile picture
user.profile_picture = file_path
user.save(update_fields=['profile_picture'])
logger.info(f"Profile picture updated for user {user.id}")
return True
except Exception as e:
logger.error(f"Error setting profile picture for user {user.id}: {str(e)}")
return False
def delete_profile_picture(user):
"""
Safely delete profile picture for a user.
Args:
user: User instance
Returns:
bool: True if successful, False otherwise
"""
try:
if not has_profile_picture_field(user):
logger.error(f"Cannot delete profile picture - field not found for user {user.id}")
return False
profile_picture = getattr(user, 'profile_picture', None)
if not profile_picture:
return True # Already no profile picture
# Delete file from storage
try:
if default_storage.exists(profile_picture.name):
default_storage.delete(profile_picture.name)
except Exception as e:
logger.warning(f"Failed to delete profile picture file for user {user.id}: {str(e)}")
# Clear from user model
user.profile_picture = None
user.save(update_fields=['profile_picture'])
logger.info(f"Profile picture deleted for user {user.id}")
return True
except Exception as e:
logger.error(f"Error deleting profile picture for user {user.id}: {str(e)}")
return False
def get_user_profile_data(user, request=None):
"""
Get comprehensive profile data for a user including profile picture.
Args:
user: User instance
request: Request object for building absolute URIs
Returns:
dict: Profile data dictionary
"""
profile_data = {
'id': user.id,
'username': user.username,
'email': user.email,
'first_name': user.first_name,
'last_name': user.last_name,
'full_name': user.get_full_name(),
'role': user.role,
'profile_picture_url': get_profile_picture_url(user, request),
'has_profile_picture': bool(get_profile_picture_url(user, request)),
'profile_picture_available': has_profile_picture_field(user),
}
return profile_data