""" Tenant middleware for multi-tenancy support. """ from django.http import Http404 from django.shortcuts import get_object_or_404 from .models import Tenant class TenantMiddleware: """ Middleware to handle tenant resolution and context. """ def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # Skip tenant resolution for admin and API endpoints if request.path.startswith('/admin/') or request.path.startswith('/api/'): response = self.get_response(request) return response # Get tenant from subdomain or header tenant = self.get_tenant(request) if tenant: request.tenant = tenant else: # For development, use the first available tenant try: request.tenant = Tenant.objects.filter(is_active=True).first() except Tenant.DoesNotExist: request.tenant = None response = self.get_response(request) return response def get_tenant(self, request): """ Resolve tenant from request. """ # Try to get tenant from subdomain host = request.get_host() if '.' in host: subdomain = host.split('.')[0] try: return Tenant.objects.get( name__iexact=subdomain, is_active=True ) except Tenant.DoesNotExist: pass # Try to get tenant from header (for API calls) tenant_id = request.headers.get('X-Tenant-ID') if tenant_id: try: return Tenant.objects.get( tenant_id=tenant_id, is_active=True ) except Tenant.DoesNotExist: pass return None