"""
Custom Authentication Backend - No Caching
Prevents cross-request user contamination by disabling Django's default user caching
"""
from django.contrib.auth.backends import ModelBackend


class NoCacheModelBackend(ModelBackend):
    """
    Custom authentication backend that disables user object caching.
    
    Django's default ModelBackend caches the user object in thread-local storage,
    which can cause cross-request contamination when the same worker process
    handles requests from different users.
    
    This backend forces a fresh DB query on EVERY request to prevent user swapping.
    """
    
    def get_user(self, user_id):
        """
        Get user from database WITHOUT caching.
        
        This overrides the default behavior which caches user objects
        at the process level, causing session contamination.
        """
        from django.contrib.auth import get_user_model
        UserModel = get_user_model()
        
        try:
            # CRITICAL: Use select_related to load account/plan in ONE query
            # But do NOT cache the result - return fresh object every time
            user = UserModel.objects.select_related('account', 'account__plan').get(pk=user_id)
            return user
        except UserModel.DoesNotExist:
            return None
